Home Php C# Sql C C++ Javascript Python Java Go Android Git Linux Asp.net Django .net Node.js Ios Xcode Cocoa Iphone Mysql Tomcat Mongodb Bash Objective-c Scala Visual-studio Apache Elasticsearch Jar Eclipse Jquery Ruby-on-rails Ruby Rubygems Android-studio Spring Lua Sqlite Emacs Ubuntu Perl Docker Swift Amazon-web-services Svn Html Ajax Xml Java-ee Maven Intellij-idea Rvm Macos Unix Css Ipad Postgresql Css3 Json Windows-server Vue.js Typescript Oracle Hibernate Internet-explorer Github Tensorflow Laravel Symfony Redis Html5 Google-app-engine Nginx Firefox Sqlalchemy Lucene Erlang Flask Vim Solr Webview Facebook Zend-framework Virtualenv Nosql Ide Twitter Safari Flutter Bundle Phonegap Centos Sphinx Actionscript Tornado Register | Login | Edit Tags | New Questions | 繁体 | 简体


10 questions online user: 24

114
votes
answers
38 views
+10

What does percolator mean/do in elasticsearch?

Even though I read the documentation for Elasticsearch to understand what a percolator is. I still have difficulty understanding what it means and where it is used in simple terms. Can anyone provide me with more details?

up vote 97 down vote accepted favorite
沙发
+970
+50

您通常做的是索引文檔並通過查詢將其取回。percolator允許您簡單地做的是索引您的查詢並根據索引查詢滲透文檔以了解它們匹配的查詢。它也被稱為反向搜索,因為你所做的與你習慣的相反。

過濾器有不同的用例,第一個用於存儲用戶興趣的平台,以便在合適的用戶進入後立即將正確的內容髮送給他們。

例如,用戶訂閱特定主題,並且一旦該主題的新文章進入,就會向感興趣的用戶發送通知。您可以使用查詢DSL將用戶興趣表示為elasticsearch查詢,您可以將其註冊在elasticsearch中,因為它是一個文檔。每次發布新文章時,無需對其進行索引,您可以對其進行滲透以了解哪些用戶對其感興趣。此時您知道誰需要接收包含文章鏈接的通知(儘管發送通知不是由elasticsearch完成的)。另外一個步驟也是索引內容本身,但這不是必需的。

看一下這個演示文稿,從elasticsearch 1.0開始,看看其他幾個用例和其他功能與過濾器結合使用。

等效於RDBMS系統的是插入觸發器,對吧? - Eugen 2015年6月16日14:16

首先,不需要為過濾器索引該文檔。從Elastic博客來看,對Percolator新手的一個常見誤解是警報是插入文檔的副作用,類似於數據庫觸發器。不是這種情況。 - Devi 2016年1月21日6:23

我有同樣的問題理解 - 一旦你提到用戶興趣用例 - 我得到了它。謝謝 - DavidC 2016年4月5日10:28

+170

簡單來說就是percolator這樣:

用戶:嘿Percolator!你怎麼能幫幫我?

過濾器: Hai用戶!我可以幫助您獲取您感興趣的提醒。

網友:太好了!接下來我該怎麼辦?

Percolator:請以Elasticsearch索引的查詢形式告訴我您的興趣。

用戶:我已將我的所有興趣都準備好作為查詢並將其編入索引到Elasticsearch。這麼簡單嗎?

過濾器:是的!就這麼簡單!我會查看所有收到的文件,如果符合您的任何興趣(查詢),請回复您的文件!

網友:太棒了!我只是很好奇,想知道你怎麼能弄清楚哪些文件符合我的興趣。

過濾器:這是一個很好的問題!答案很簡單!您已將自己的興趣編入索引到Elasticsearch嗎?我使用它們並運行所有這些(不是全部,但為了簡單起見,我們假設所有)對傳入文檔的查詢(這些文檔不需要被索引,只能被發送用於滲透!)。實際上這個過程叫做滲透!如果任何文檔與您的任何查詢匹配,那麼我會將結果發送給客戶(也可能是您)!

至少從Elasticsearch(ES)6.2版本開始,這種解釋是不正確的。過濾器本身不會幫助您收到警報,也不會監視傳入的文檔。您首先在ES中索引滲透查詢,然後您必須自己滲透文檔以查看是否有任何文檔與percolate查詢匹配。ES會針對percolate查詢搜索您,但這是關於它的​​。(@javanna也解釋相同。) - arun 18年2月26日20:31

0
votes
answers
50 views
+10

Elasticsearch動態模板匹配幾個確切的字段

0

我目前正在努力簡化Elasticsearch的映射模板文件。事實上,我有幾個Object字段具有相同的結構(例如源和目標)Elasticsearch動態模板匹配幾個確切的字段

有沒有辦法設置動態模板,以便它可以匹配多個模式?

這是我執行:

POST /_template/mapping-lol 
{ 
    "template": "*-newevents-*", 
    "mappings": { 
    "log": { 
     "dynamic_templates": [ 
     { 
      "system": { 
      "match_pattern": "regex", 
      "match": "^(source|destination)$", 
      "mapping": { 
       "properties": { 
       "name": { 
        "dynamic": false, 
        "type": "object", 
        "properties": { 
        "first": { 
         "type": "text" 
        }, 
        "last": { 
         "type": "text" 
        } 
        } 
       }, 
       "ip": { 
        "type": "ip" 
       } 
       } 
      } 
      } 
     } 
     ], 
     "properties": { 
     "source": { 
      "type": "object", 
      "dynamic": true 
     }, 
     "destination": { 
      "type": "object", 
      "dynamic": true 
     } 
     } 
    } 
    } 
} 

POST /tenant-newevents-1/log 
{ 
    "source": { 
    "name": { 
     "first": "John", 
     "last": "Doe" 
    }, 
    "ip": "1.2.3.4" 
    }, 
    "destination": { 
    "name": { 
     "first": "Jane", 
     "last": "Doe" 
    }, 
    "ip": "3.4.5.6" 
    } 
} 

GET /tenant-newevents-1 

這上面沒有工作...

我有的是這些相同的方案來匹配(?20)。

非常感謝您的幫助!

+0

看起來不錯。剛剛嘗試過ES 5和6,並且運行良好。請說明你如何創建索引/映射? – Val

+0

curl -XPOST「locallhost:9200/_template/mapping-events」[email protected] – moutonjr

+0

好的一個!那麼mymapping.json的內容呢? – Val

沙发
0
0

OK我發現出了什麼問題:字段不能映射在所有動態映射繼續。在映射工作中刪除「源」和「目標」方案。

POST /_template/mapping-lol 
{ 
    "template": "*-newevents-*", 
    "mappings": { 
    "log": { 
     "dynamic_templates": [ 
     { 
      "system": { 
      "match_pattern": "regex", 
      "match": "^(source|destination)$", 
      "mapping": { 
       "properties": { 
       "name": { 
        "dynamic": false, 
        "type": "object", 
        "properties": { 
        "first": { 
         "type": "text" 
        }, 
        "last": { 
         "type": "text" 
        } 
        } 
       }, 
       "ip": { 
        "type": "ip" 
       } 
       } 
      } 
      } 
     } 
     ], 
     "properties": {} 
    } 
    } 
} 
+0

這是我的下一個評論;-)如果你有他們的動態模板映射他們沒有意義。 – Val

0
votes
answers
50 views
+10

ElasticSearch 1.1.2無法正常啓動

0

我正在爲我的公司升級ElasticSearch。爲了開始這個,我需要運行我的機器上運行OSX Sierra(10.12.6)的舊版本(1.1.2)。我從我公司的存儲庫下載了[email protected],但沒有正確啓動。我得到這個:ElasticSearch 1.1.2無法正常啓動

$ brew services list 
Name    Status User  Plist 
[email protected] started pjscopeland /Users/pjscopeland/Library/LaunchAgents/[email protected] 

...但自制的地位「started」是黃色的,在這裏他們的休息是綠色的,如果我手動運行它,我得到這個:

$ elasticsearch 
Java HotSpot(TM) 64-Bit Server VM warning: Option UseParNewGC was deprecated in version 9.0 and will likely be removed in a future release. 
Java HotSpot(TM) 64-Bit Server VM warning: Option UseConcMarkSweepGC was deprecated in version 9.0 and will likely be removed in a future release. 
Exception in thread "main" java.lang.ExceptionInInitializerError 
    at org.elasticsearch.bootstrap.Bootstrap.main(Bootstrap.java:190) 
    at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:32) 
Caused by: java.lang.UnsupportedOperationException: Boot class path mechanism is not supported 
    at java.management/sun.management.RuntimeImpl.getBootClassPath(RuntimeImpl.java:99) 
    at org.elasticsearch.monitor.jvm.JvmInfo.<clinit>(JvmInfo.java:77) 
    ... 2 more 

NB。請記住,我的Java技能處於我可能只能讀取它的級別,但可能無法解決任何可能需要更改的內容。

+0

黃色是好的。在ES 2.4黃色意味着你只有1個數據節點。你有沒有嘗試連接到服務器?順便說一句:如果您在生產計算機上安裝副本時遇到問題(爲HTTP和二進制協議提供不同的端口) – bato3

+1

這不是ElasticSearch黃色,這是自制黃色。該服務尚未正常啓動。我在我的文章中澄清了這一點。 – PJSCopeland

沙发
0
5

看起來你有Java的9安裝:

的HotSpot的Java(TM)64位服務器VM警告:選項UseParNewGC被棄用9.0版本,並可能會在未來的版本中刪除。

雖然ElasticSearch不支持它。

根據this matrix,從2.3到5.6的任何ES版本都不支持Java 9; ES 1.x沒有被列出,因爲它不再被支持。

還有一個issue與logstash(ElasticSearch的一個組件)有相似的堆棧跟蹤。

,您張貼

由導致異常:java.lang.UnsupportedOperationException:引導類路徑機制不支持

表明,有一些錯誤的JVM。類別RuntimeImpl發生異常。

我建議你檢查你的生產機器上安裝了哪個版本的Java並安裝在你的機器上。有關如何在Mac上管理不同版本Java的提示,您可以在此查看SO question

希望有幫助!

+0

完美!有些兔子洞會讓所有的東西都安裝正確 - JEnv對於那些更習慣於RVM的人來說不太直觀 - 但是在所有鏈接之後,我設法達到了目標。謝謝! – PJSCopeland

+1

棘手的部分是告訴_service_使用Java 8而不是9.我完全放棄並卸載了Java 9,並且服務完美啓動。 – PJSCopeland

+0

@PJSCopeland很高興你管理! –

84
votes
answers
16 views
+10

Dump all documents of Elasticsearch

Is there any way to create a dump file that contains all the data of an index among with its settings and mappings?

A Similar way as mongoDB does with mongodump
or as in Solr its data folder is copied to a backup location.

Cheers!

up vote 34 down vote accepted favorite
沙发
+340
+50

雖然非常方便,但快照並沒有真正以可用的格式(json,csv等)導出數據--Evan 2014年11月18日3:24

@Andreas Neumann Can快照功能可以備份索引中的文檔子集。假設一個索引有1000個文檔,我想只備份500個文檔。我想這樣做是因為我想導入一組文檔並在其他索引中恢復以進行一些負載測試。我不需要所有文檔來完成我的任務和索引是巨大的,我不想拍攝所有數據的快照,因為它需要花費很多時間 - Sanjeev Kumar Dangi 2015年5月19日13:12

+380

這是我們為此目的而努力的新工具https://github.com/taskrabbit/elasticsearch-dump您可以將索引導出/導出JSON文件,或從一個群集導出到另一個群集。

謝謝Evan,這很完美。我喜歡它讓我們處理普通json文件的方式。 - NullPointer 2015年1月30日6:06

我試過這個。而索引數據是112Mb。以json格式導出的數據是337MB的3倍,耗時40分鐘。我不知道它的索引太大了,它看起來真的很實用。什麼是針對ES提供的快照功能的基準測試。 - Sanjeev Kumar Dangi 2015年5月19日13:10

@Evan的elasticdump內部使用ElasticSearch的掃描和滾動功能嗎? - Sanjeev Kumar Dangi 2015年5月19日13:15

@sanjeev絕對! - Evan 2015年5月19日15:01

謝謝Evan的回复。請回复我關於快照性能基準的第二條評論。 - Sanjeev Kumar Dangi 2015年5月20日5:15

+100

ElasticSearch本身提供了一種創建數據備份和恢復的方法。執行此操作的簡單命令是:

CURL -XPUT 'localhost:9200/_snapshot/<backup_folder name>/<backupname>' -d '{
    "indices": "<index_name>",
    "ignore_unavailable": true,
    "include_global_state": false
}'

現在,如何創建這個文件夾,如何在ElasticSearch配置中包含這個文件夾路徑,以便它可用於ElasticSearch,恢復方法,這裡有很好的解釋這裡看看它的實用演示衝浪

太棒了,謝謝 - bigbadmouse 5月20日16:34

+20

數據本身是一個或多個lucene索引,因為您可以有多個分片。您還需要備份的是群集狀態,其中包含有關群集的所有類型的信息,可用的索引,它們的映射,它們由它們組成的碎片等。

它都在data目錄中,你可以復制它。它的結構非常直觀。在復制之前,最好禁用自動刷新(為了備份索引的一致視圖並避免在復製文件時對其進行寫入),請發出手動刷新,禁用分配。請記住從所有節點複製目錄。

此外,elasticsearch的下一個主要版本將提供一個新的快照/恢復api,允許您執行增量快照並通過api恢復它們。這是相關的github問題:https//github.com/elasticsearch/elasticsearch/issues/3826

事實上我已經嘗試過這個解決方案而且對我來說不起作用。我按照你說的那樣複製數據文件夾到新的遠程安裝,我試著啟動ES,但是由於異常而死了。不幸的是我沒有日誌粘貼它。你的解決方案成功嗎? - Evan P 2013年10月9日12:00

是的,你應該怎麼做。您是否嘗試將索引還原到相同的elasticsearch版本?同類機器?這是一個大指數嗎?單節點? - javanna 2013年10月9日12:19

它是一個單節點,5個分片,一個小索引(~2k文件)但不同的機器。版本相同(0.9) - Evan P 2013年10月10日7:58

0

您還可以通過http請求以JSON格式轉儲elasticsearch數據:https//www.elastic.co/guide/en/elasticsearch/reference/current/search-request-scroll.html
CURL -XPOST 'https://ES/INDEX/_search?scroll=10m'
CURL -XPOST 'https://ES/_search/scroll' -d '{"scroll": "10m", "scroll_id": "ID"}'

0
votes
answers
43 views
+10

Kibana - How to display log as table

I'm testing Kibana 4 for a project.

I have created an index from my database table which is composed by 3 fields:

  1. Date
  2. User
  3. Action

I would like to display my index as a simple table (3 column, N rows) in my dashboard.

I tried to use "Data table" visualization but I can't find a way to display my results without any Metrics (Count, Sum etc...)

Maybe is pretty simple and I missed something... is there a way to do this?

Regards,

沙发
0

我也有同樣的問題。我們必須對可視化(查詢)所需的內容進行研究,然後將其保存為對象。

0
votes
answers
13 views
+10

ElasticSearch中實用的分析和搜索策略用例

1

我在學習ElasticSearch並享受它的每一分鐘。然而,有一些實際問題令我感到困惑,當然也缺乏經驗,我認爲看到一些好的現實生活中的例子可能會被清除。ElasticSearch中實用的分析和搜索策略用例

現在我正在一個網站上開設帳戶和產品目錄,並且希望在最終用戶根據距離,相關性查詢和許多標準搜索產品時搜索最佳產品匹配。

特別感興趣:

  • 相關度打分和排名策略產品目錄

  • 分析數據

  • 過濾

我將不勝感激任何引用。

P.S

我使用鳥巢爲.NET與ElasticSearch集羣

+1

我會強烈建議彈性的開發者培訓課程之一,如果你正在尋找真正潛入這個(完全披露:我爲Elastic工作):https://training.elastic.co/ –

沙发
0
1

良好的溝通這三個科目都相當wides。已經做了很多工作。你應該花一些時間來看看彈性搜索文檔,爲您的問題,我建議你看看下面的頁面第一:

https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-function-score-query.html(對於您的文檔的基於距離得分) https://www.elastic.co/guide/en/elasticsearch/reference/current/query-filter-context.html (對於過濾)

關於你的最後一個點,分析部分,我建議你看看到Kibana: https://www.elastic.co/products/kibana

0
votes
answers
22 views
+10

的Python - elasticsearch.exceptions.RequestError

0

我想在elasticsearch的Python - elasticsearch.exceptions.RequestError

提取數據和我的功能是這樣的:

##Using regex to get the image name. 
#it is inefficient to fetch them one by one using doc['hits']['hits'][n]['_source']['docker_image_short_name'] 
#because thousands of documents are stored per images 
regex = "docker_image_short_name': u'(.+?)'" 
pattern=re.compile(regex) 
query={ 
     "query":{ 
      "bool":{ "must":[{"range":{"@timestamp":{"gt":vulTime}}}] } 
     } 
    } 
page = es.search(index='crawledframe-*', body = query, scroll='1m', size=1000) 
sid = page['_scroll_id'] 
num_page = page['hits']['total'] 

imglist=[] 
while num_page > 0: 
    print num_page 
    print vulTime 
    imgs = re.findall(pattern, str(page)) 
    imglist += imgs 

    page = es.scroll(scroll_id = sid, scroll = '1m') 
    num_page = len(page['hits']['hits']) 

imglist = list(set(imglist))#remove duplicaton 

我想只提取 「docker_image_short_name」

但是,我得到錯誤(打印結果):

num_page: 2327261 
vulTime : 0001-01-01 
Traceback (most recent call last): 
    File "test.py", line 68, in <module> 
    worker_main() 
    File "test.py", line 63, in worker_main 
    imgnames = recent_crawl_index(es, vulTime) 
    File "test.py", line 45, in recent_crawl_index 
    page = es.scroll(scroll_id = sid, scroll = '1m') 
    File "/usr/local/lib/python2.7/dist-packages/elasticsearch/client/utils.py", line 73, in _wrapped 
    return func(*args, params=params, **kwargs) 
    File "/usr/local/lib/python2.7/dist-packages/elasticsearch/client/__init__.py", line 1024, in scroll 
    params=params, body=body) 
    File "/usr/local/lib/python2.7/dist-packages/elasticsearch/transport.py", line 312, in perform_request 
    status, headers, data = connection.perform_request(method, url, params, body, ignore=ignore, timeout=timeout) 
    File "/usr/local/lib/python2.7/dist-packages/elasticsearch/connection/http_urllib3.py", line 128, in perform_request 
    self._raise_error(response.status, raw_data) 
    File "/usr/local/lib/python2.7/dist-packages/elasticsearch/connection/base.py", line 125, in _raise_error 
    raise HTTP_EXCEPTIONS.get(status_code, TransportError)(status_code, error_message, additional_info) 
elasticsearch.exceptions.RequestError: <exception str() failed> 

我不知道爲什麼會發生這個呃ROR,因爲我用同樣的邏輯在其他代碼

和es.search()並沒有出現錯誤...

沙发
0
0

看來你正在使用Elasticsearch DSL的版本錯誤。

你需要做的是以下幾點:

  • 檢查elasticsearch版本curl -XGET 'localhost:9200'
  • 你應該再搭配你的elasticsearch版本與compatable version of Elasticsearch DSL。例如,如果你的Elasticsearch版本1.x做到以下幾點:

    - pip uninstall elasticsearch-dsl

    - pip install "elasticsearch-dsl<2.0.0"

0
votes
answers
44 views
+10

Rails的 - 如何searchkick過濾字符串字段?

1

在軌,我使用searchkick寶石搜索。我需要爲過濾器添加一個名爲status的字符串字段。我怎樣才能添加到這個插件?Rails的 - 如何searchkick過濾字符串字段?

已經我提出關於這個問題Rails - How to add more fields for filter in searchkick?

現在我用繩子場,而不是試圖布爾搜索仍不能正常工作一個問題。請幫助我一樣。

我添加了一個條件像where: {status: 'approved'},按照這個條件,我應該得到的只有活躍用戶(不是「刪除」的用戶)。目前沒有搜索數據顯示。

searchkick word_start: [:name] 

def initialize(name, limit = User::SUGGESTION_LIMIT, page = nil) 
    @name = name 
    @limit = limit 
    @page = page 
    @per_page = limit.to_i 
end 

query = { 
    match: :word_start, 
    where: {status: 'approved'}, 
    fields: [{ emails: "exact" }, "name^5"], 
    misspellings: { prefix_length: 2 }, 
    load: false 
} 

User.search(name, query).records 

我也已經加入過濾像searchkick word_start: [:name], filterable: [:status]

Server日誌嘗試是,

Processing by UsersController#search as JSON 
Parameters: {"query"=>"sal"} 
ETHON: Libcurl initialized 
ETHON: performed EASY 
effective_url=http://elastic:[email protected]:9200/users-some_index-en/_search response_code=200 return_code=ok total_time=0.498938 
User Search (589.3ms) curl http://14.127.18.141:9200/users-some_index-en/_search?pretty -d '{"query":{"bool":{"must":{"dis_max":{"queries":[{"match":{"emails.true":{"query":"sal","boost":10,"operator":"and","analyzer":"searchkick_autocomplete_search"}}},{"match":{"emails.true":{"query":"sal","boost":1,"operator":"and","analyzer":"searchkick_autocomplete_search","fuzziness":1,"prefix_length":2,"max_expansions":3,"fuzzy_transpositions":true}}},{"bool":{"must":{"bool":{"should":[{"match":{"name.word_start":{"query":"sal","boost":50.0,"operator":"and","analyzer":"searchkick_word_search"}}},{"match":{"name.word_start":{"query":"sal","boost":5.0,"operator":"and","analyzer":"searchkick_word_search","fuzziness":1,"prefix_length":2,"max_expansions":3,"fuzzy_transpositions":true}}}]}},"should":{"match":{"name.analyzed":{"query":"sal","boost":50.0,"operator":"and","analyzer":"searchkick_word_search"}}}}}]}},"filter":[{"term":{"status":"approved"}}]}},"size":5,"from":0,"timeout":"11s"}' 
User Load (0.8ms) SELECT "users".* FROM "users" WHERE "users"."id" = $1 LIMIT $2 [["id", 1], ["LIMIT", 1]] 
ETHON: performed EASY effective_url=http://elastic:[email protected]:9200/entities-some_index-en/_search response_code=200 return_code=ok total_time=0.251783 
+0

你添加的代碼段的after_update是不夠的,我們理解你想要什麼。添加更多代碼。 –

+0

問題已更新。 –

沙发
0
1

更改scope :search_import根據你的病情和修改should_index?方法一樣,

def should_index? 
    User.search_import 
end 

更改後,請致電rei ndex單獨的任何數據

96
votes
answers
34 views
+10

Filter items which array contains any of given values

I have a set of documents like

{
    tags:['a','b','c']
    // ... a bunch properties
}

As stated in the title: Is there a way to filter all documents containing any of given tags using Nest ?

For instance, the record above would match ['c','d']

Or should I build multiple "OR"s manually ?

up vote 41 down vote accepted favorite
沙发
+410
+50

編輯:下面的bitset東西可能是一個有趣的讀??物,但答案本身有點過時了。其中一些功能在2.x中發生了變化。此外,Slawek在另一個答案中指出,terms在這種情況下查詢是一種簡單的方法來干擾搜索。在最後重構當前的最佳實踐。-nz

您可能想要一個Bool查詢(或者更可能是與另一個查詢一起使用Filter)和一個should子句。

該布爾查詢有三個主要屬性:mustshould,和must_not其中每個都接受另一個查詢或查詢數組。條款名稱相當不言自明; 在您的情況下,該should子句可以指定一個列表過濾器,與其中任何一個匹配將返回您正在尋找的文檔。

來自文檔:

在沒有must子句的布爾查詢中,一個或多個should子句必須與文檔匹配。可以使用minimum_should_match參數設置要匹配的最小條件子句數。

以下是Bool查詢可能孤立的示例:

{
  "bool": {
    "should": [
      { "term": { "tag": "c" }},
      { "term": { "tag": "d" }}
    ]
  }
}

這是另一個Bool查詢作為更通用的過濾查詢中的過濾器的示例

{
  "filtered": {
    "query": {
      "match": { "title": "hello world" }
    },
    "filter": {
      "bool": {
        "should": [
          { "term": { "tag": "c" }},
          { "term": { "tag": "d" }}
        ]
      }
    }
  }
}

是否使用Bool作為查詢(例如,影響匹配的分數),或者作為過濾器(例如,減少隨後被評分或後過濾的命中)是主觀的,這取決於您的要求。

除非你有理由使用And / Or / Not(這樣的理由確實存在),否則通常最好使用Bool來支持Or FilterElasticsearch博客提供了有關每種實現的不同實現的更多信息,以及何時可能更喜歡Bool over And / Or / Not的好例子,反之亦然。

Elasticsearch博客:所有關於Elasticsearch過濾器位集

使用重構查詢進行更新...

現在,完成所有這些後,terms查詢就是上述所有內容的DRYer版本。它對於引擎下的查詢類型做了正確的事情,它的行為與使用選項bool+ 相同,總體來說有點簡潔。shouldminimum_should_match

這是最後一個查詢重構了一下:

{
  "filtered": {
    "query": {
      "match": { "title": "hello world" }
    },
    "filter": {
      "terms": {
        "tag": [ "c", "d" ],
        "minimum_should_match": 1
      }
    }
  }
}

我必須手動構建每個子句,然後...... - Olivier 2015年1月18日19:28

minimum_should_match現已棄用 - Josh Bedo 2016年1月24日20:00

minimum_should_match將無法解決問題,如果您還要通過另一個數組進行過濾,您需要正常的“或”行為。 - Innokenty 2016年6月6日8:50

+510

還有一些術語查詢,可以為您節省一些工作。這裡來自docs的例子:

{
  "terms" : {
      "tags" : [ "blue", "pill" ],
      "minimum_should_match" : 1
  }
}

在引擎蓋下它構造布爾應該。所以它與上面的基本相同,但更短。

還有一個相應的術語過濾器

因此,總結一下您的查詢可能如下所示:

{
  "filtered": {
    "query": {
      "match": { "title": "hello world" }
    },
    "filter": {
      "terms": {
        "tags": ["c", "d"]
      }
    }
  }
}

隨著標籤數量的增加,這可能會使長度產生很大差異。

我無法讓這個工作。你能介意一下嗎:stackoverflow.com/questions/32252789 / ... - user1571609 2015年8月27日16:02

minimum_should_match已棄用,將失敗。 - Ain Tohvri 2016年9月29日14:08

@AinTohvri實際上在elasticsearch 2.0.1 minimum_should_match仍在工作,官方doc沒有將其標記為已棄用。 - Sinux 2016年11月17日6:52

如果我不想在標籤中使用特定關鍵字,該如何工作..讓我說我有5個關鍵字a,b,c,d,e ..我不想在標籤中使用c關鍵字。什麼是查詢? - Prashant Tapase 2月27日14:04

Kinda取決於您所使用的彈性搜索版本。但在大多數情況下,你只需要否定條件。例如,如果在布爾查詢的mustNot子句中使用完全相同的條件條件,它將搜索所有沒有任何標記的文檔。 - slawek 2月27日14:55

+40

雖然這是一個老問題,但我最近自己遇到了這個問題,這裡的一些答案現在已被棄用(正如評論指出的那樣)。所以為了其他可能偶然發現的人的利益:

一個term查詢可以用來查找反向索引指定的確切期限:

{
  "query": {
   "term" : { "tags" : "a" }
} 

來自文檔https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-term-query.html

或者,您可以使用terms查詢,該查詢將所有文檔與給定數組中指定的任何項匹配:

{
  "query": {
   "terms" : { "tags" : ["a", "c"]}
} 

https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-terms-query.html

有人要注意哪個讓我感到驚訝 - 你如何定義文檔也會產生影響。如果您正在搜索的字段已被索引為文本類型,則Elasticsearch將執行全文搜索(即使用analyzed字符串)。

如果您已將該字段編入索引作為關鍵字,則執行使用“未分析”字符串的關鍵字搜索。這可能會產生巨大的實際影響,因為分析字符串已經過預處理(小寫,標點符號丟棄等)請參閱(https://www.elastic.co/guide/en/elasticsearch/guide/master/term-vs-full- text.html

為了避免這些問題,字符串字段分為兩種新類型:文本(應該用於全文搜索)和關鍵字(應該用於關鍵字搜索)。https://www.elastic.co/blog/strings-are-dead-long-live-strings

91
votes
answers
16 views
+10

Elastic Search Hyphen issue with term filter

I have the following Elastic Search query with only a term filter. My query is much more complex but I am just trying to show the issue here.

{
    "filter": {
            "term": {
                    "field": "update-time"
                }
        }
}

When I pass in a hyphenated value to the filter, I get zero results back. But if I try without an unhyphenated value I get results back. I am not sure if the hyphen is an issue here but my scenario makes me believe so.

Is there a way to escape the hyphen so the filter would return results? I have tried escaping the hyphen with a back slash which I read from the Lucene forums but that didn't help.

Also, if I pass in a GUID value into this field which is hyphenated and surrounded by curly braces, something like - {ASD23-34SD-DFE1-42FWW}, would I need to lower case the alphabet characters and would I need to escape the curly braces too?

Thanks

up vote 82 down vote accepted favorite
沙发
+820
+50

我猜你的字段是分析的,這是elasticsearch中字符串字段的默認設置。因此,當它被索引時,它沒有被索引為一個術語“更新時間”,而是被索引為兩個術語:“更新”和“時間”。這就是你的術語搜索無法找到這個術語的原因。如果您的字段將始終包含必須完全匹配的值,則最好在映射中將此字段定義為未分析。您可以通過使用新映射重新創建索引來完成此操作:

curl -XPUT http://localhost:9200/your-index -d '{
    "mappings" : {
        "your-type" : {
            "properties" : {
                "field" : { "type": "string", "index" : "not_analyzed" }
            }
        }
    }
}'

curl -XPUT  http://localhost:9200/your-index/your-type/1 -d '{
    "field" : "update-time"
}'

curl -XPOST http://localhost:9200/your-index/your-type/_search -d'{
    "filter": {
        "term": {
                "field": "update-time"
        }
    }
}'

或者,如果您希望在根據此字段查找記錄時有一定的靈活性,則可以保持此字段的分析並使用文本查詢:

curl -XPOST http://localhost:9200/your-index/your-type/_search -d'{
    "query": {
        "text": {
                "field": "update-time"
        }
    }
}'

請記住,如果您的字段被分析,那麼通過搜索單詞“update”或單詞“time”來找到該記錄。

+80

接受的答案對彈性6.1不起作用。我使用彈性在字符串字段上提供的“關鍵字”字段解決了它。

{
    "filter": {
            "term": {
                    "field.keyword": "update-time"
                }
        }
}
+10

基於@imotov的答案如果您使用的是spring-data- elasticsearch,那麼您需要做的就是將您的字段標記為:

@Field(type = FieldType.String, index = FieldIndex.not_analyzed)

代替

@Field(type = FieldType.String)

問題是您需要刪除索引並使用新映射重新實例化它。