在elasticSearch中查询时定义分析器

nik*_*agi 35 elasticsearch

我对弹性搜索很新,只需要澄清一下:我们可以在查询搜索服务器时定义一个分析器.我用"文本"和"字段"查询尝试了它,它工作正常:

查询:

curl -XPOST http://localhost:9200/test/user/_search? -d '{ "query" : {
"text" : {"_all" : {"query" :"Vaibhav","analyzer" :
"lowercase_keyword" }} } }'
Run Code Online (Sandbox Code Playgroud)

结果:

{"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"
Run Code Online (Sandbox Code Playgroud)

但是当我尝试用term/prefix/wildcard查询做同样的事情时,我得到了异常:

查询:

curl -XPOST http://localhost:9200/test/user/_search? -d '{
"query" : { "term" : {"_all" : {"query" :"Vaibhav","analyzer" :
"lowercase_keyword" }} } }'
Run Code Online (Sandbox Code Playgroud)

结果:

{"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}
Run Code Online (Sandbox Code Playgroud)

因此,在查询弹性搜索服务器以查找某种类型的查询时,我们无法定义analayzers,而对于其他查询我们可以吗?如果没有,我做错了什么?

任何帮助是极大的赞赏.

imo*_*tov 22

term,prefixwildcard查询预计在查询中指定的值将已经分析.

  • 当您使用"文本"和"字段"查询时,将在索引和搜索期间应用分析器.对于术语/前缀/通配符查询,在搜索期间不应用分析器.你正确地说"Vaibhav"被索引为术语"vaibhav".这就是为什么当你搜索"vaibhav"一词时你会得到结果,但是当你搜索"Vaibhav"这个词时你没有得到任何结果 - "Vaibhav"这个词根本就不存在于索引中.如果您希望查询不区分大小写(已分析),则需要使用"text"或"field"查询而不是"term"查询. (8认同)
  • elasticsearch文档说明术语查询匹配包含术语(未分析)的字段的文档.http://www.elasticsearch.org/guide/reference/query-dsl/term-query.html (2认同)
  • 但是对于“查询”,如何在查询时嵌入“分析器”? (2认同)

cze*_*asz 8

这个语法对我有用:

GET /_search
{
  "query": {
    "match_phrase": {
      "controller": {
        "analyzer": "keyword",
        "query": "api/v2/test"
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

文档中查找更多详细信息.