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

Lucene-用于索引JSON密钥对值的自定义分析器/标记器,lucene,lucene.net,Lucene,Lucene.net,我的目标是存储和索引JSON密钥对值。 理想情况下,我会将它们存储在一个常量字段名中。(为了简单起见,“等级”) 传入JSON对象的一个示例: "Data": [{ "Key": "DP01", "Value": "Excellent" }, { "Key": "DP02", "Value": "Average" }, { "Key": "DP03", "Value": "Ne

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

传入JSON对象的一个示例:

    "Data": [{
        "Key": "DP01",
        "Value": "Excellent"
    }, {
        "Key": "DP02",
        "Value": "Average"
    }, {
        "Key": "DP03",
        "Value": "Negative"
    }]
JSON对象将被序列化并按原样存储,但我希望以某种方式对其进行索引,使我能够在同一字段中按键和值进行搜索。其主要思想是在同一Lucene字段中搜索多个值

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

[GRADES: "key:DP01 UNIQUEIDasDELIMITER value:Excellent"]
客户分析器/标记器将如何实现这一点

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

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

  • 每个文档都是一个网站

  • 一个网站可以有多个图像(和其他重要的元数据)

  • 每个图像都有多组自由keyvaluepair属性:

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

    {
        "Key": "Scenery",
        "Value": "Industrial"
    }, {
        "Key": "Style",
        "Value": "Vintage"
    }
    
我的挑战来自于类似类型的结构,并以一种使我能够构建查询的方式对其进行索引,例如:

一个有风景图片的网站:工业和风格:复古


我可能采取了安迪·波克所指出的错误方法。有没有办法有效地平展这些属性?

如何将JSON数据存储在一个多值字段中,例如分数,如下所示:

GRADES: "Key DP01 Value Excellent"
GRADES: "Key DP02 Value Average"
GRADES: "Key DP03 Value Negative"
然后可以运行如下查询:

GRADES: "Key DP01 Value Excellent"
GRADES: "Key DP02 Value Average"
GRADES: "Key DP03 Value Negative"
等级:(“关键DP01”和“价值卓越”)


如何将JSON数据存储在多值字段中,例如,GRADES,如下所示:

GRADES: "Key DP01 Value Excellent"
GRADES: "Key DP02 Value Average"
GRADES: "Key DP03 Value Negative"
然后可以运行如下查询:

GRADES: "Key DP01 Value Excellent"
GRADES: "Key DP02 Value Average"
GRADES: "Key DP03 Value Negative"
等级:(“关键DP01”和“价值卓越”)

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

在前世,我有一个具有一组“属性”的实体。关键/价值集合(与你的成绩非常相似)

每个文档都创建了为每个属性命名的字段,即“attr thing”,并添加了值“NOT_analysis”

因此,在您的示例中,我将创建如下字段

new Field("grade-"+gradeID, grade, Field.Store.NO, Field.Index.NOT_ANALYZED)
然后,您可以使用类似“grade-DP01:PROFESSION”的查询进行搜索

或者,您可以只使用一个固定的字段名(类似于@cris almodovar),并将该值设置为类似“id=grade”的值。再次没有分析。搜索“等级:DP01=优秀”

两者都可以。我成功地使用了两种方法,但通常更喜欢第一种

对编辑的额外响应…

我想我理解这个问题。。。如果你有“风景=工业风格=复古”和“风景=自然风格=现代”,如果你搜索“自然和复古”,你不会希望它匹配,对吗

您可以使用KeywordAnalyzer为每个集合添加一个“imageType”字段,该字段的值类似于“布景=工业风格=复古abc=xyz”(仅按空格分割)

然后使用
imageType搜索:“布景=工业风格=年份”~2
。使用slop短语可确保值位于同一字段中,并且slop允许顺序不同或存在额外值。您必须根据每个字段中预期的属性数量计算出的数字。简单地说,如果您希望最大值为N,那么slop也应该为N。

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

在前世,我有一个具有一组“属性”的实体。关键/价值集合(与你的成绩非常相似)

每个文档都创建了为每个属性命名的字段,即“attr thing”,并添加了值“NOT_analysis”

因此,在您的示例中,我将创建如下字段

new Field("grade-"+gradeID, grade, Field.Store.NO, Field.Index.NOT_ANALYZED)
然后,您可以使用类似“grade-DP01:PROFESSION”的查询进行搜索

或者,您可以只使用一个固定的字段名(类似于@cris almodovar),并将该值设置为类似“id=grade”的值。再次没有分析。搜索“等级:DP01=优秀”

两者都可以。我成功地使用了两种方法,但通常更喜欢第一种

对编辑的额外响应…

我想我理解这个问题。。。如果你有“风景=工业风格=复古”和“风景=自然风格=现代”,如果你搜索“自然和复古”,你不会希望它匹配,对吗

您可以使用KeywordAnalyzer为每个集合添加一个“imageType”字段,该字段的值类似于“布景=工业风格=复古abc=xyz”(仅按空格分割)

然后使用
imageType搜索:“布景=工业风格=年份”~2
。使用slop短语可确保值位于同一字段中,并且slop允许顺序不同或存在额外值。您必须根据每个字段中预期的属性数量计算出的数字。简单地说,如果您希望最大值为N,那么slop也应该为N。

中的每个请求:您似乎以不同的方式为这些数据建立索引,因此它并不完全相同。问题是,我在自己的字段中索引键和值:“Data.key”、“Data.value”,允许搜索“Data.key:DP01和Data.value:Average”或其中一个字段,问题是,在这种情况下,这会生成文档,我假设您不希望,这是我在我的案例中接受的一个限制。中的每一个请求:您似乎以一种不同的方式来索引这些数据,所以它并不完全相同。作为公关,我在自己的字段中索引键和值:“Data.key”,“Data.value”,允许搜索“Data.key:DP01和Data.value:Average”或其中一个,问题是这样会生成文档,在这种情况下,我假设您不想要,这是我在我的文档中接受的限制