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

使用elasticsearch在数组对象类型中进行精确搜索

方恺
2023-03-14
问题内容

我正在寻找一种在elasticsearch中进行 精确 数组匹配的方法。假设这些是我的文件:

{"id": 1, "categories" : ["c", "d"]}
{"id": 2, "categories" : ["b", "c", "d"]}
{"id": 3, "categories" : ["c", "d", "e"]}
{"id": 4, "categories" : ["d"]}
{"id": 5, "categories" : ["c", "d"]}

有没有一种方法可以搜索所有类别 完全相同或完全不同 的“ c”和“ d”文档(文档1和5)?

另外,搜索“其中一个”类别还是应该可行的(例如,您可以搜索“ c”并获得1、2、3和5)

有解决这个问题的聪明方法吗?


问题答案:

如果您有一组离散的已知类别,则可以使用布尔查询:

"bool" : {
    "must" : {
        "terms" : { "categories" : ["c", "d"],
             minimum_should_match : 2
         }
    },
    "must_not" : {
        "terms" : { "categories" : ["a", "b", "e"],
             minimum_should_match : 1
         }
    }
}

否则,我认为,可能最简单的方法是存储另一个用作category关键字的字段。

{"id": 1, "categories" : ["c", "d"], "categorieskey" : "cd"}

这样的事情。然后,您可以轻松地通过术语查询查询所需的精确结果,例如:

term { "categorieskey" : "cd" }

而且,您仍然可以非排他性地搜索,例如:

term { "categories" : "c" }

查询必须都存在的两个类别很容易,但是要阻止其他任何潜在类别的存在就比较困难。您可能会做到。您可能想编写一个查询来查找包含这两个记录的查询,然后对其应用html" target="_blank">过滤器,以消除所有类别与指定类别不同的​​记录。据我所知,Lucene并不是真正为处理这种搜索而设计的。

老实说,我在使用一个好的过滤器时遇到了麻烦。您可能需要脚本过滤器,或者可以在检索结果之后过滤结果。



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

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

  • 我试图在DynamoDB上使用“LIKE”搜索,在这里我有一个使用nodejs的对象数组。 通过查看文档和我看到的其他相关帖子,可以使用CONTAINS参数来实现这一点。 我的问题是-我是否可以在DynamoDB中对所有项目运行扫描或查询,其中对象中的值类似于“test2”。 这是我的发电机桌 这就是JSON的外观: 我正在尝试执行一个扫描/查询,它将检查所有用户(每一行),检查所有项目,并返回描

  • 问题内容: 我在Elasticsearch中放了2个文档: 为什么此查询返回2个文档: 而这个,只有第二个文件: 我想elasticsearch以匹配我传递给查询参数的确切词组(带空格),该怎么做? 问题答案: 您需要查看的是正在使用的分析仪。如果您未指定,Elasticsearch将使用标准分析器。在大多数使用纯文本输入的情况下,它非常有用,但不适用于您提到的用例。 标准分析器将执行的操作是将字

  • 问题内容: 我为此感到挣扎,我觉得应该可以,但是也许我在做一些愚蠢的事情。搜索: 返回Source1和Source2的数据。在下面添加术语搜索,我希望返回仅包含Source1s的第一次搜索的子集。使用第一个查询或单独运行时,不返回任何内容。 我知道很难看到这些文档,但是可以说“ Element.sourceSystem.name”存在并且可以使用,因为第一个搜索可以正常工作-非常感谢所有输入。 问

  • 问题内容: 我想以查询其他字段的相同方式将多值字段的值查询为单独的“字段”。我有这样的数据结构: 我的查询如下所示: 仅当值包含我的整个查询时,“类型”和“运算符”才能完美匹配单个值字段。例如,查询“ foo two”不会返回匹配项。 我希望标签字段的行为相同。现在,查询“东西”将在不应该返回匹配项时返回匹配项,因为没有字段或标记值将两个单词都包含在一个值中。有没有办法做到这一点? 编辑 Val的