并非所有术语都适用于 ElasticSearch 查询

Posted

技术标签:

【中文标题】并非所有术语都适用于 ElasticSearch 查询【英文标题】:Not all terms work in ElasticSearch Query 【发布时间】:2016-08-02 18:42:46 【问题描述】:

使用https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-term-query.html 所述的术语搜索时,我没有看到预期的结果

ElasticSearch 版本是 2.3.2:使用它来创建数据:

curl -XPUT http://myelastic:9201/myindex/mytype/90273504?pretty=true -d ' "CLIENT_ID" : "000000001", "USER_TYPE" : "ABC"'
curl -XPUT http://myelastic:9201/myindex/mytype/90273505?pretty=true -d ' "CLIENT_ID" : "000000002", "USER_TYPE" : "ABC"'

此查询显示两条记录:

curl -D - -o - http://myelastic:9201/myindex/mytype/_search?pretty=true -H"Accept: application/json" -d ' "query" :  "match_all" :    '


  "took" : 2,
  "timed_out" : false,
  "_shards" : 
    "total" : 5,
    "successful" : 5,
    "failed" : 0
  ,
  "hits" : 
    "total" : 2,
    "max_score" : 1.0,
    "hits" : [ 
      "_index" : "myindex",
      "_type" : "mytype",
      "_id" : "90273505",
      "_score" : 1.0,
      "_source" : 
        "CLIENT_ID" : "000000002",
        "USER_TYPE" : "ABC"
      
    , 
      "_index" : "myindex",
      "_type" : "mytype",
      "_id" : "90273504",
      "_score" : 1.0,
      "_source" : 
        "CLIENT_ID" : "000000001",
        "USER_TYPE" : "ABC"
      
     ]
  

此查询按预期显示一条记录:

curl -D - -o - http://myelastic:9201/myindex/mytype/_search?pretty=true -H"Accept: application/json" \
    -d ' "query" :  "bool" :  "should" : [  "term" :  "CLIENT_ID" : "000000001"   ]   '

但是使用不同的术语会导致没有记录:

curl -D - -o - http://myelastic:9201/myindex/mytype/_search?pretty=true -H"Accept: application/json" \
    -d ' "query" :  "bool" :  "should" : [  "term" :  "USER_TYPE" : "ABC"   ]   '

最终,我想根据多个术语的匹配对记录进行评分,从多个术语的选择开始,如下所示:

curl -D - -o - http://myelastic:9201/myindex/mytype/_search?pretty=true -H"Accept: application/json" \
    -d ' "query" :  "bool" :  "should" : [  "term" :  "CLIENT_ID" : "000000001"  ,  "term" :  "USER_TYPE" : "ABC"   ]   '

但现在我正试图理解为什么

curl -D - -o - http://myelastic:9201/myindex/mytype/_search?pretty=true -H"Accept: application/json" \
    -d ' "query" :  "bool" :  "should" : [  "term" :  "USER_TYPE" : "ABC"   ]   '

不返回任何记录。

【问题讨论】:

【参考方案1】:

标准分析仪

标准分析器是默认分析器 弹性搜索使用。是分析文本的最佳通用选择 可以是任何语言。它在单词边界上拆分文本,如 由 Unicode 联盟定义,并删除了大多数标点符号。 最后,它将所有术语都小写。

https://www.elastic.co/guide/en/elasticsearch/guide/current/analysis-intro.html#_built_in_analyzers

尝试搜索小写文本。我认为它适用于数字,因为它们没有大小写。

curl -D - -o - http://myelastic:9201/myindex/mytype/_search?pretty=true -H"Accept: application/json" \
    -d ' "query" :  "bool" :  "should" : [  "term" :  "USER_TYPE" : "abc"   ]   '

This thread could help

【讨论】:

谢谢。我也去看看那个链接。你能总结一下你的答案为什么会这样吗? 我从文档中找到了完全的平静 太好了,谢谢。看起来我想要match,而不是term

以上是关于并非所有术语都适用于 ElasticSearch 查询的主要内容,如果未能解决你的问题,请参考以下文章

Elasticsearch匹配短语前缀不匹配所有术语

Elasticsearch:从聚合中的存储桶访问值

Python--26 简单定制 计时器

全文搜索之MySQL与ElasticSearch搜索引擎

PHP MySQL:搜索查询仅适用于现有的完整术语

适用于我公司所有开发团队的 Git 分支策略