ElasticSearch 对字段的多次精确搜索未返回任何结果

2023-12-01

我正在努力解决这个问题,我觉得这应该有效,但也许我正在做一些愚蠢的事情。本次搜索:

{
   "query":
   {
     "bool":
     {
       "must":[
         {"match":{"Element.sourceSystem.name":"Source1 Source2"}}
       ]
  }
}

返回 Source1 和 Source2 的数据。添加术语搜索,如下所示,我希望返回第一个搜索的子集,仅返回 Source1。当与第一个查询一起运行或单独运行时,不会返回任何内容。

{
  "query":
  {
    "bool":
    {
      "must":[
        {"match":{"Element.sourceSystem.name":"Source1 Source2"}},
        {"terms":{"Element.sourceSystem.name":["Source1"]}}
      ]
    }
  }
}

我意识到在没有看到文档的情况下这很难,但只要说“Element.sourceSystem.name”存在并且可以使用,因为第一次搜索工作正常 - 所有输入都感激不尽。


有些事情的处理方式有所不同match查询比terms查询。

首先,绕道分析器:

假设您正在使用标准分析仪elasticsearch,它由一个标准分词器和一些分词过滤器组成。标准分词器将对空格、标点符号和其他一些特殊字符进行分词(将文本拆分为术语)。详细信息可以在 Elasticsearch 文档中找到,所以现在我们只说“每个单词都是一个术语”。

分析器的第二个非常重要的部分是小写过滤器。它将把术语转换为小写。这意味着,稍后,寻找Source1 and source1应该产生相同的结果。

一个简短的例子:

输入:“这是我的英文输入文本。”将被分析并最终得到以下术语:“this”、“is”、“my”、“input”、“text”、“in”、“english”。

当您将文档索引到text例如字段。我假设Element.sourceSystem.name是这种类型之一,因为您的正常匹配查询似乎有效。

现在,当您发出匹配查询时"Source1 Source2",分析也会发生并将其转化为代币source1 and source2。然后,它会在内部以布尔 OR 形式创建 2 个术语查询。所以要么source1 or source2必须匹配才能成为您的查询结果。

顺便说一句,匹配查询支持minimum_should_match财产。您可以指定匹配查询需要匹配多少个术语。

现在这是术语查询的线索。确实如此not分析您提供的文本。它通常应该用在类型字段上keyword。关键字字段也不被分析(更多信息,请阅读文档映射类型- 这实际上非常重要)。那么这是什么意思?

  • 如果我以上面的例子为例,我的索引将包含"this", "is", "my", "input", "text", "in", "english".
  • 匹配查询English将匹配,因为它将被分析为english
  • 术语查询English永远不会匹配,因为没有术语English在我的索引中。它区分大小写。

我非常积极,如果你愿意的话source1在您的术语查询中,它会匹配某些内容。但是,我非常怀疑您的查询是否适合您的用例。查询文本字段时尝试使用正常匹配查询,并且(通常 - 并不总是适用)仅在关键字字段上使用术语查询。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ElasticSearch 对字段的多次精确搜索未返回任何结果 的相关文章

随机推荐