我对弹性搜索很新,只需要澄清一下: 我们可以在查询搜索服务器时定义分析器。我尝试了“文本”和“字段”查询,它工作正常:
查询:
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"
但是当我尝试用term / prefix / wildcard查询做同样的事情时,我得到了异常:
查询:
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}
因此,在查询弹性搜索服务器以查找某种类型的查询时,我们无法定义analayzers,而对于其他类型的查询,我们可以吗?如果没有,我做错了吗?
非常感谢任何帮助。
答案 0 :(得分:22)
term
,prefix
和wildcard
查询期望查询中指定的值已经过分析。
答案 1 :(得分:5)
这种语法对我有用:
GET /_search
{
"query": {
"match_phrase": {
"controller": {
"analyzer": "keyword",
"query": "api/v2/test"
}
}
}
}
中查找更多详情
答案 2 :(得分:1)
您可以设置用于查询的自定义search-analyzer。
来自文档:
通常,应在索引时和at处应用相同的分析器 搜索时间,以确保查询中的术语格式相同 倒排索引中的术语。
但有时,在搜索时使用不同的分析器是有意义的 时间,例如使用analysis-edgengram-tokenizer进行自动完成时。
默认情况下,查询将使用字段映射中定义的
覆盖analyzer
,但是 这可以使用search_analyzer
设置
文档还列出了一个示例。 https://www.elastic.co/guide/en/elasticsearch/reference/current/search-analyzer.html