Lucene - 自定义分析器/标记器,用于索引JSON密钥对值

时间:2016-02-08 11:14:09

标签: lucene lucene.net

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

传入JSON对象的示例:

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

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

有关如何构建索引的任何建议? 让我们想象一下,例如我想使用以下查询进行搜索:

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

客户分析仪/令牌机如何实现这一目标?

编辑:试图更准确地描绘我的目标。

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

  • 每个文件都是一个网站。

  • 网站可以有多个图片(以及其他重要的元数据)。

  • 每个图片都有多组免费的keyvaluepair属性:

    {
        "Key": "Scenery",
        "Value": "Nature"
    }, {
        "Key": "Style",
        "Value": "Vintage"
    }
    
  • 另一组:

    {
        "Key": "Scenery",
        "Value": "Industrial"
    }, {
        "Key": "Style",
        "Value": "Vintage"
    }
    

我的挑战来自于一种类似的结构和索引,它使我能够构建如下查询:

  

一个风景形象的网站:工业和风格:复古。

我可能采取了Andy Pook指出的错误做法。任何想法如何有效地平整这些属性?

2 个答案:

答案 0 :(得分:1)

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

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

然后您可以运行如下查询:

  

等级:(“关键DP01”和“超值优秀”)

答案 1 :(得分:1)

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

在以前的生活中,我有一个具有一组"属性的实体"。一个关键/价值收集(很像你的成绩)。

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

因此,在您的示例中,我创建了像

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

然后,您可以使用" grade-DP01:优秀"等查询进行搜索。

或者你可以只有一个固定的字段名称(类似于@ cris-almodovar)并将值设置为" id = grade"。再次NOT_ANALYZED。搜索"等级:DP01 =优秀"。

要么工作。我已成功使用这两种方法,但通常更喜欢第一种方法。

响应编辑的其他内容......

我想我理解这个问题......如果你有" scenery = industrial style = vintage"和" scenery =自然风格=现代"如果你搜索了#34;自然和复古",你不希望它匹配吗?

您可以添加" imageType"每个集合的字段,其值为" scenery = industrial style = vintage abc = xyz"使用KeywordAnalyzer(只是按空格分割)。

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

相关问题