我的目标是存储和索引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指出的错误做法。任何想法如何有效地平整这些属性?
答案 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.