35

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

询问:

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}

那么是不是我们不能在查询弹性搜索服务器的某些类型的查询时定义分析器,而对于其他类型的查询我们可以?如果没有,我做错了什么吗?

任何帮助是极大的赞赏。

4

3 回答 3

23

、和查询期望查询term中指定的值已经被分析。prefixwildcard

于 2012-07-25T20:05:47.810 回答
10

这种语法对我有用:

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

在文档中查找更多详细信息。

于 2016-08-22T14:57:15.067 回答
1

您可以设置自定义搜索分析器以用于查询。

从文档:

通常,在索引时和搜索时应使用相同的分析器,以确保查询中的术语与倒排索引中的术语格式相同。

但是,有时在搜索时使用不同的分析器可能是有意义的,例如在使用 analysis-edgengram-tokenizer 进行自动完成时。

默认情况下,查询将使用analyzer字段映射中定义的,但这可以用search_analyzer设置覆盖

文档还列出了一个示例。https://www.elastic.co/guide/en/elasticsearch/reference/current/search-analyzer.html

于 2017-05-18T16:23:01.323 回答