Lucene - 自定义 analyzer/tokenizer 以索引 JSON 密钥对值

Lucene - custom analyzer/tokenizer to index JSON key pair values

我的目标是存储和索引 JSON 密钥对值。 理想情况下,我会将它们存储在一个常量字段名中。 (为简单起见,"GRADES")

传入JSON对象的示例:

    "Data": [{
        "Key": "DP01",
        "Value": "Excellent"
    }, {
        "Key": "DP02",
        "Value": "Average"
    }, {
        "Key": "DP03",
        "Value": "Negative"
    }]

JSON 对象将被序列化并按原样存储,但我想以某种方式对其进行索引,使我能够通过键和值在同一字段中进行搜索。主要思想是在同一个 Lucene 字段中搜索多个值。

关于如何构建索引有什么建议吗? 例如,假设我想使用以下查询进行搜索:

[GRADES: "key:DP01 UNIQUEIDasDELIMITER value:Excellent"]

客户 analyzer/tokenizer 如何做到这一点?

编辑:尝试更准确地描述我的目标。

想想这种典型的关系类型的结构(为简单起见)。

我的挑战来自类似类型的结构并以一种使我能够构建查询的方式对其进行索引,例如:

A website with an image of scenery:industrial and style:vintage.

我可能采用了 Andy Pook 指出的错误方法。有什么想法可以有效地展平这些属性吗?

如何将 JSON 数据存储在多值字段中,例如成绩,像这样:

GRADES: "Key DP01 Value Excellent"
GRADES: "Key DP02 Value Average"
GRADES: "Key DP03 Value Negative"

然后您可以运行这样的查询:

GRADES: ("Key DP01" AND "Value Excellent")

一个常见的 "problem" 是将索引和文档视为具有一组一致的字段。它与具有一组固定列的表的关系数据库不同。

前世我有一个实体,有一组"attributes"。 key/value 合集(很像你的成绩)。

每个文档都是用为每个属性命名的字段创建的,即 "attr-thing" 添加了值 "NOT_ANALYZED"。

因此,在您的示例中,我会创建类似

的字段
new Field("grade-"+gradeID, grade, Field.Store.NO, Field.Index.NOT_ANALYZED)

然后您可以使用 "grade-DP01:excellent".

这样的查询进行搜索

或者,您可以只使用固定的字段名称(类似于@cris-almodovar)并将值设置为类似 "id=grade" 的值。再次 NOT_ANALYZED。搜索 "grade:DP01=excellent".

两者都行。我已经成功地使用了这两种方法,但通常更喜欢第一种。

额外响应编辑...

我想我明白了这个问题...如果你有 "scenery=industrial style=vintage" 和 "scenery=nature style=modern" 你不会希望它在搜索 "nature AND vintage" 时匹配,对吗?

您可以使用 KeywordAnalyzer 为每个集合添加一个 "imageType" 字段,其值类似于 "scenery=industrial style=vintage abc=xyz"(仅按 space 拆分)。

然后用imageType:"scenery=industrial style=vintage"~2搜索。使用 slop 短语保证值在同一字段中,并且 slop 允许顺序不同或有额外的值。您必须根据您在每个字段中期望的属性数量计算出的数字。简单地说,如果您期望最多有 N 个值,那么斜率也应该是 N。