【问题标题】:Elasticsearch bool search matching incorrectlyElasticsearch bool 搜索匹配不正确
【发布时间】:2014-05-14 07:42:14
【问题描述】:

所以我有一个带有由 Guid 填充的 Id 字段的对象。我正在使用“必须”子句进行弹性搜索查询,以匹配该字段中的特定 ID。问题是 elasticsearch 返回的结果与我提供的 Guid 不完全匹配。我注意到我提供的 Guid 和 Elasticsearch 返回的结果之一在 Guid 的一个特定部分共享相同的数字。

这是我的查询源(我使用的是 Elasticsearch 头控制台):

{
 query: 
 {
  bool: 
  {
    must: [
    {
      text: 
      {
        couchbaseDocument.doc.Id: 5cd1cde9-1adc-4886-a463-7c8fa7966f26
      }
    }]
    must_not: [ ]
    should: [ ]
   }
 }
 from: 0
 size: 10
 sort: [ ]
 facets: { }
}

它返回两个结果。 ID 为

的一个
5cd1cde9-1adc-4886-a463-7c8fa7966f26

另一个ID为

34de3d35-5a27-4886-95e8-a2d6dcf253c2

如您所见,它们都共享相同的中间词“-4886-”。但是,我希望此查询仅在记录完全匹配而不是部分匹配时返回记录。我在这里做错了什么?

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

    查询(可能)正确。

    您几乎可以肯定看到的是'Standard Analyzer` 的工作,它在索引时默认使用。此分析器将在连字符 ('-') 以及其他字符中标记输入(将其拆分为术语)。这就是找到匹配项的原因。

    要解决此问题,您需要将 couchbaseDocument.doc.Id 字段设置为 not_analyzed

    请参阅:How to not-analyze in ElasticSearch? 以及从那里到官方文档的链接。

    映射类似于:

    {
        "yourType" : {
            "properties" : {
                "couchbaseDocument.doc.Id" : {"type" : "string", "index" : "not_analyzed"},
            }
        }
    }
    

    【讨论】:

    • 啊,这看起来是正确的。谢谢你。不过,我还有另一个问题。我目前正在使用自动映射。是否可以简单地将这一字段指定为未分析而无需定义整个对象结构?
    • 你必须指定一个对象结构。但是,您只需要为这一领域做这件事。所有其他(未定义的字段)将获得默认处理。查看更新的答案(头顶,所以请检查)
    猜你喜欢
    • 1970-01-01
    • 2016-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-11
    • 1970-01-01
    • 1970-01-01
    • 2012-04-30
    相关资源
    最近更新 更多