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

标签 lucene elasticsearch

我正在寻找一种在 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 查询:

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

否则,我认为实现此目的的最简单方法可能是存储另一个字段作为类别关键字。

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

类似的东西。然后您可以轻松地使用术语查询来精确查询您想要的结果,例如:

term { "categorieskey" : "cd" }

而且您仍然可以进行非排他性搜索,因为;

term { "categories" : "c" }

查询必须同时存在的两个类别很容易,但是防止任何其他潜在类别出现就有点困难了。你可以做到,也许。您可能想编写一个查询来查找同时包含这两个类别的记录,然后对其应用过滤器以消除所有类别不是指定类别的记录。据我所知,这并不是 Lucene 真正设计用于处理的一种搜索。

老实说,我在想出一个在这里使用的好过滤器时遇到了一些麻烦。您可能需要一个脚本过滤器,或者您可以在检索结果后对其进行过滤。

关于lucene - 使用 elasticsearch 在数组对象类型中进行精确搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12676234/

相关文章:

lucene - Lucene 中的 Jaccard 相似度

elasticsearch - 有没有一种方法可以将 Elasticsearch “day level indices”聚合为单个 “month level index”?

elasticsearch - 为Elasticsearch集群设置单个备份节点?

elasticsearch - 针对超出范围索引的弹性时间范围查询的性能

elasticsearch - Elastic apm,transaction.duration.us 是什么?

lucene - 在 lucene 4 中,IndexReader.getTermVector(docID, fieldName) 为每个文档返回 null

lucene - lucidworks 企业爬行不索引我的数据

java - Lucene搜寻器(需要建立Lucene索引)

java - lucene默认分数是在0到+无限之间吗?

elasticsearch - 使用嵌套查询时出现 Elasticsearch 问题