2012-07-25 79 views
29

我對elasticsearch很新穎,只需要一些說明: 我們可以在查詢搜索服務器時定義分析器。我的「文本」和「場」查詢嘗試過了,它工作正常:在elasticsearch中查詢時定義分析器

查詢:

curl -XPOST http://localhost:9200/test/user/_search? -d '{ "query" : { 
"text" : {"_all" : {"query" :"Vaibhav","analyzer" : 
"lowercase_keyword" }} } }' 

結果:

{"took":144,"timed_out":false,"_shards":{"total":5,"successful":5,"failed":0},"hits":{"total":1,"max_score":0.10848885,"hits":{"_index":"test","_type":"user","_id":"1","_score":0.10848885, 
"_source" : { 
    "first_name": "Vaibhav", 
    "last_name":"saini", 
    "password":"pwd" 

但是,當我嘗試做同樣的事情長期/前綴/通配符查詢我得到異常:

查詢:

curl -XPOST http://localhost:9200/test/user/_search? -d '{ 
"query" : { "term" : {"_all" : {"query" :"Vaibhav","analyzer" : 
"lowercase_keyword" }} } }' 

結果:

{"error":"SearchPhaseExecutionException[Failed to execute phase [query], total failure; shardFailures 
{[kws9J6tbQtWCMNKBm3Gpkw][test][4]: SearchParseException[[test][4]: 
from[-1],size[-1]: Parse Failure [Failed to parse source 
[\n{\n\"query\" : {\n\"term\" : {\"_all\" : {\"query\" 
:\"Vaibhav\",\"analyzer\" : \"lowercase_keyword\" }}\n}\n}]]]; nested: 
QueryParsingException[[test] [term] query does not support [query]]; 
}{[kws9J6tbQtWCMNKBm3Gpkw][test][1]: SearchParseException[[test][1]: 
from[-1],size[-1]: Parse Failure [Failed to parse source 
[\n{\n\"query\" : {\n\"term\" : {\"_all\" : {\"query\" 
:\"Vaibhav\",\"analyzer\" : \"lowercase_keyword\" }}\n}\n}]]]; nested: 
QueryParsingException[[test] [term] query does not support [query]]; 
}{[kws9J6tbQtWCMNKBm3Gpkw][test][2]: SearchParseException[[test][2]: 
from[-1],size[-1]: Parse Failure [Failed to parse source 
[\n{\n\"query\" : {\n\"term\" : {\"_all\" : {\"query\" 
:\"Vaibhav\",\"analyzer\" : \"lowercase_keyword\" }}\n}\n}]]]; nested: 
QueryParsingException[[test] [term] query does not support [query]]; 
}]","status":500} 

那麼,這就像在查詢的elasticsearch服務器某種類型的查詢和他人,我們可以,我們不能定義analayzers?如果不是,我是否做錯了什麼?

任何幫助,非常感謝。

回答

21

term,prefixwildcard查詢期望查詢中指定的值已被分析。

+2

elasticsearch文檔說,術語查詢匹配具有包含術語(未分析)字段的文檔。 http://www.elasticsearch.org/guide/reference/query-dsl/term-query.html – vaibhav 2012-07-25 20:13:57

+0

感謝Imotov。但我在這裏有一個疑問,如果是這樣的話,那麼在上面的例子中,查詢我應該得到結果,而不管我使用什麼套管。例如:在我的索引數據中的「first_name」字段是「Vaibhav」,此外,此字段使用的分析器是使用標記器作爲「關鍵字」並過濾爲「小寫」的自定義分析器,以便我的數據被索引爲「vaibhav」而不是「Vaibhav」,如預期的那樣。 – 2012-07-26 05:03:00

+1

現在,當我在「vaibhav」上使用術語/前綴/通配符查詢來查詢它時,我得到了結果,但是當我在「Vaibhav」上查詢它時,我沒有得到結果(也許是因爲它被索引爲「vaibhav」) 。所以我的要求是,我的查詢應該不區分大小寫。謝謝 – 2012-07-26 05:03:06

4

這句法爲我工作:

GET /_search 
{ 
    "query": { 
    "match_phrase": { 
     "controller": { 
     "analyzer": "keyword", 
     "query": "api/v2/test" 
     } 
    } 
    } 
} 

發現在documentation更多細節。

+0

雖然這個JSON不適合我,但分析器需要的是答案。 – Sinux 2017-01-10 06:35:46

0

您可以設置用於查詢的自定義search-analyzer

從文檔:

一般,相同的分析器應在索引時間和在 搜索時施加,以確保在查詢中的術語在相同的格式 的術語在倒排索引。

但是,有時在搜索 時使用不同的分析器是有意義的,例如使用analysis-edgengram-tokenizer進行自動完成時。

默認情況下,查詢將使用在字段映射定義的analyzer,但 這可以與search_analyzer設置

該文檔還列出一個例子被覆蓋。 https://www.elastic.co/guide/en/elasticsearch/reference/current/search-analyzer.html