Elasticsearch查询未给出完全匹配

时间:2018-06-12 13:26:59

标签: java elasticsearch kibana elastic-stack

我使用下面的匹配查询搜索elasticsearch,这不会给我完全匹配,而是提供更多不可靠的匹配。

我正在使用elasticsearch 6.2.3

请在下面找到我的问题

get items/_search
{
   "query" : {
      "match" : {
         "code" : "7000-8900"
      }
   }
}

请从match查询

中找到回复
7000-8900
7000-8002-WK
7000-8002-W

3 个答案:

答案 0 :(得分:5)

而不是match您必须使用term查询,如文档所述:

  

术语查询查找包含反向索引

中指定的确切术语的文档

所以你必须改变你的查询如下:

get items/_search
{
   "query" : {
      "term" : {
         "code.keyword" : "7000-8900"
      }
   }
}

如果您没有得到任何结果,有两种可能性:

  • 搜索词不是你认为的那样(例如没有修剪)
  • 索引没有明确的映射,自动映射也没有将字段代码识别为字符串。

注意:如果映射正确并且代码是术语字段,则可以使用"代码"。如果映射是自动的,并且映射将其识别为文本,则需要使用" code.keyword"

答案 1 :(得分:0)

您可以尝试此方法。此查询返回完全匹配记录。

exports.sumsensor = functions.database.ref('sensor/{id}').onWrite((change,context)=>{ 
     let val = +change.after.val()
     //compute code in here
     return admin.database().ref().child('sensorSum').transaction(function(currentTotal) {
         return currentTotal + val;
     });
});

答案 2 :(得分:0)

我在比赛中遇到了同样的问题,因此我尝试使用term。但这是一个坏习惯。 ES说,我们不应该使用term来进行字符串匹配。

如果您将该字段指定为关键字,则匹配项将始终进行完全匹配。

如果您尚未将字段定义为关键字,仍然可以执行以下查询:

get items/_search
{
   "query" : {
      "match" : {
         "code.keyword" : "7000-8900"
      }
   }
}