ElasticSearch对字段进行多次精确搜索不会返回任何结果

时间:2017-07-13 10:01:59

标签: json elasticsearch

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

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

返回Source1和Source2的数据。添加一个术语搜索,如下面所示,我希望只返回返回的Source1s返回第一个搜索的子集。当使用第一个查询或其自己运行时,不会返回任何内容。

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

我没有看到文件就意识到这很难,但足以说明" Element.sourceSystem.name"存在并且可用,因为第一次搜索工作正常 - 所有输入都感激不尽。

1 个答案:

答案 0 :(得分:2)

有些内容在match次查询中的处理方式与terms次查询中的处理方式不同。

首先,绕道分析员:

假设您使用的是弹性搜索的standard analyzer,其中包含标准的标记符和一些标记过滤器。标准标记器将在空格,标点符号和一些其他特殊字符上标记化(将文本拆分为术语)。详细信息可以在Elasticsearch文档中找到,所以现在让我们说'每个单词都是一个术语'。

分析仪的第二个非常重要的部分是小写过滤器。它会将术语转换为小写。这意味着,稍后,搜索Source1source1会产生相同的结果。

这是一个简短的例子:

  

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

例如,当您将文档索引到text字段时,会发生所有这些情况。我假设Element.sourceSystem.name是这种类型之一,因为您的普通匹配查询似乎有效。

现在,当您使用"Source1 Source2"发出匹配查询时,分析也会发生并将其转换为令牌source1source2。在内部,它将在布尔OR中创建2个术语查询。因此,source1source2必须匹配才能成为您查询的结果。

  

顺便说一句,匹配查询支持minimum_should_match属性。您可以指定匹配查询的匹配项数。

现在是条款查询的线索。它分析您提供的文本。它通常应该用于keyword类型的字段。关键字字段也未分析(有关详细信息,请阅读mapping types的文档 - 这实际上非常重要)。那是什么意思呢?

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

我非常积极,如果你在你的条款查询中使用source1,它会匹配一些东西。但是,我非常怀疑您的查询是您的用例的方法。在查询文本字段时尝试使用常规匹配查询,并且(通常并非总是适用)仅对关键字字段使用术语查询。