当前位置: 首页 > 面试题库 >

ElasticSearch在字段上进行多次精确搜索没有结果

闻人嘉木
2023-03-14
问题内容

我为此感到挣扎,我觉得应该可以,但是也许我在做一些愚蠢的事情。搜索:

{
   "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”存在并且可以使用,因为第一个搜索可以正常工作-非常感谢所有输入。


问题答案:

match查询中的某些内容与查询中的不同terms

首先,绕道分析仪:

假设您使用的是Elasticsearch
的标准分析器,该分析器由标准标记器和一些标记过滤器组成。标准令牌生成器将在空格,标点符号和其他一些特殊字符上令牌化(将您的文本分成术语)。可以在Elasticsearch文档中找到详细信息,所以现在让我们只说“每个词都是一个术语”。

分析仪的第二个非常重要的部分是小写过滤器。它将把术语变成小写。这意味着以后将搜索Source1source1应产生相同的结果。

举个简短​​的例子:

输入:“这是我用英语输入的文字。” 将被分析并以以下术语结尾:“ this”,“ is”,“ my”,“ input”,“ text”,“ in”,“
english”。

例如,当您将文档编入text字段时,所有这些都会发生。Element.sourceSystem.name由于您的常规匹配查询似乎可以正常运行,因此我假设是这种类型的一种。

现在,当您使用发出匹配查询时"Source1 Source2",也将进行分析并将其转换为令牌source1source2。然后,它将在内部在布尔OR中创建2个术语查询。所以,无论是source1source2必须匹配是你查询的结果。

顺便说一句,匹配查询支持一个minimum_should_match属性。您可以指定匹配查询中需要匹配多少个字词。

现在是有关字词查询的线索。它
分析你所提供的文本。通常应该在type字段上使用它keyword。关键字字段也不会进行分析(有关更多信息,请阅读映射类型的文档-实际上非常重要)。那么这是什么意思?

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

我非常肯定,如果您要source1在术语查询中使用它,那么它将匹配某些内容。但是,我高度怀疑您的查询是否适合您的用例。在查询文本字段时尝试使用普通匹配查询,并且(通常-
并非始终适用)仅在关键字字段上使用字词查询。



 类似资料:
  • 例如,在我们的模式中,我们有: 大约有20个不同的领域。每个字段都复制到索引中: 为自定义域类型提供以下标记器: 更新示例JSON文档(内容为安全性而模糊)“ 字段和内容都是从真实数据中编辑的,但它给出了想法。字段名称和内容都是较长的单词。这是取自SOLR管理搜索界面。

  • 问题内容: 我有一个类似以下设置和映射的索引; 我正在努力实现现场通配符搜索的实现。我的示例数据如下: 当我执行以下查询时; 它返回,。我认为,它仍然标记数据。它只能返回。 您能帮上忙吗? 提前致谢 问题答案: 我的解决方案历险记 如您在我的问题中所见,我已经开始审理案件。每当我更改了一部分设置后,一部分便开始工作,而另一部分则停止工作。让我给出我的解决方案历史记录: 1.) 我已将数据索引为默认

  • 问题内容: Elasticsearch版本:7.1.1 嗨,我做了很多尝试,但是在索引中找不到任何解决方案,我有一个包含字符串的字段。 因此,例如,我有两个文档,它们在locations数组中包含不同的值。 文件1: 文件2: 用户请求搜索术语 克洛彭堡, 而我只想返回那些包含术语 克洛彭堡 而不是 Landkreis Cloppenburg的 文档。结果应仅包含 Document-1 。但是我的

  • 我有一个endpoint,我正在将它代理到ElasticSearchAPI中,以进行简单的用户搜索。 有关这些参数的一些详细信息如下 所有参数都是可选的 昵称可以作为全文搜索进行搜索(即'myUser'将返回'myUsername') 电子邮件必须完全匹配 名称可以搜索为每个令牌的全文搜索(即'john'将返回'John Smith') ElasticSearch调用应将参数集体视为AND'd。

  • 问题内容: 我正在寻找一种在elasticsearch中进行 精确 数组匹配的方法。假设这些是我的文件: 有没有一种方法可以搜索所有类别 完全相同或完全不同 的“ c”和“ d”文档(文档1和5)? 另外,搜索“其中一个”类别还是应该可行的(例如,您可以搜索“ c”并获得1、2、3和5) 有解决这个问题的聪明方法吗? 问题答案: 如果您有一组离散的已知类别,则可以使用布尔查询: 否则,我认为,可能

  • 我现在从Elasticsearch开始。我为一些EDIFACT消息(一种史前数据格式;-)编制了索引,内容如下: 当我搜索短语UNH 66304 CODECO: D:95B时,它应该只返回一次命中,但它似乎返回了包含任何这些单词的所有文件(并且UNH在每个文档中)。我的查询是: 我尝试添加“and”操作符,如下所示: 但是没有返回结果。我在这里读到了建议:搜索需要使用双引号的确切短语。我试过“查询