Arrays 在Lucene.NET中索引Json对象数组
我正在将任意json对象放入Lucene.NET索引中,给定一个可能如下所示的对象:Arrays 在Lucene.NET中索引Json对象数组,arrays,lucene.net,Arrays,Lucene.net,我正在将任意json对象放入Lucene.NET索引中,给定一个可能如下所示的对象: { name: "Tony", age: 40, address: { street: "Weakroad", number: 10, floor: 2, door: "Left" }, skills: [ { name: ".NET", level: 5, experience: 12 }, { name: "JavaScript"
{
name: "Tony",
age: 40,
address: {
street: "Weakroad",
number: 10,
floor: 2,
door: "Left"
},
skills: [
{ name: ".NET", level: 5, experience: 12 },
{ name: "JavaScript", level: 3, experience: 6 },
{ name: "HTML5", level: 4, experience: 6 },
{ name: "Lucene.NET", level: 1, experience: 12 },
{ name: "C#", level: 10, experience: 12 }
],
aliases: [ "Bucks", "SirTalk", "BeemerBoy" ]
}
这将产生以下字段:
"name": "Tony"
"age": "40"
"address.street": "Weakroad"
"address.number": "10"
"address.floor": "2"
"address.door": "Left"
"skills": ???
"aliases": "Bucks SirTalk BeemerBoy" //should turn into 3 tokens.
正如你可能注意到的,技能有一个???,因为现在我不知道如何处理这个。。。如果有任何“有意义的通用”方法可以做到这一点
以下是我一直在思考的一些选择:
1)串联:但这样我就失去了对Lucene进行更高级查询的能力,比如找到拥有4级以上.NET技能的人 为了澄清,连接可以是类似于:
"skills": ".NET, JavaScript, HTML5, Lucene.NET, C#"
丢弃数字,因为在这种情况下它们没有多大意义。如果子对象上的传统属性是一个也会被收集的字符串。。。另一种方法是单独对每个现场进行施工:
"skills.name": ".NET, JavaScript, HTML5, Lucene.NET, C#"
"skills.level": "5, 3, 4, 1, 10"
"skills.experience": "12, 6, 6, 12, 12"
同样,数字在这里并没有多大意义,但添加它们只是为了提供一个示例
2)链接文档:创建一个新的文档pr.array条目,并反向引用此文档,这可能会起作用,但没有嵌套文档和BlockJoinQuery等新功能,这些新功能尚未移植到.NET版本,但这听起来真的很混乱+听起来会影响性能。虽然这也会扼杀文档评分的有用性,但我认为这可能不是什么问题 基本上,一个文档将包含一个充当外键的存储字段,每当搜索发现该文档时,我们将取而代之的是引用的文档 因此,如果我们举例说明文件,它们将是:
//Primary Document - ContentType: Person
"$id": 1
"$doctype": Primary
"name": "Tony"
...etc
"skills": [ 2, 3 ] //Just a stored field for retrieving data
//Child Document - ContentType: Skill
"$id": 2
"$ref": 1
"$doctype": Secondary
"name": ".NET"
"level": 5
"experience": 12
//Child Document - ContentType: Skill
"$id": 3
"$ref": 1
"$doctype": Secondary
"name": "JavaScript"
"level": 3
"experience": 6
等等
我添加了一些元字段
3)我发现的第三个选项是将属性索引为具有相同名称的多个字段,因此上面的示例将导致:
// index: 0
"skills.name": ".NET"
"skills.level": 5
"skills.experience": 12
// index: 1
"skills.name": "JavaScript"
"skills.level": 3
"skills.experience": 6
// index: 2
"skills.name": "HTML5"
"skills.level": 4
"skills.experience": 6
// index: 3
"skills.name": "Lucene.NET"
"skills.level": 1
"skills.experience": 12
// index: 4
"skills.name": "C#"
"skills.level": 10
"skills.experience": 12
Lucene.NET支持这一点,但我仍然需要查询:[skill.name:“.NET”和skill.level:[3到5]]
但由于这确实允许我在字段中单独搜索,因此我可以通过以下方式以另一种方式解决另一个问题:
- a) 添加一个额外的组合字段
- b) 在收集器中对结果进行后期验证
- c) 综合上述因素
根据上面的场景,我们现在可以:(大大缩短) 我们得到的是3个文档,其中包含
skills.name
和skills.level
的重复字段,这很好。。。我可以搜索{skills.name:'JavaScript',skills.level:[1到5]},它正确地返回Marilyn和Tony
但是,如果我搜索{skills.name:'JavaScript',skills.level:[4到5]},我显然仍然可以通过这种结构文档的方式得到这两种代码,而我本应该只得到Marilyn
因此,需要一个后筛选,将Tony作为实际匹配项拒绝…现在我接受了解决方案3的局限性,其合理性在于,如果需要以这种方式查询数据,那么数据在索引中的结构应该不同(与解决方案2一致)
但我选择了将这一决定转移到外部,如果可能的框架能够处理这一问题的话。因此,我创建了添加到选项3,您可以尝试分别为“技能”编制索引,例如:
"skills.name": ".NET"
"skills.level": 5
"skills.experience": 12
"skills": "name .NET level 5 experience 12"
通过这种方式,您可以执行如下查询:
技能:(“name.NET”和“5级”和“经验12”)
我很想帮忙,但我发现你的问题很难理解。你能举例说明你所说的连接和链接文档是什么意思吗?同样对于选项3)“同名多个字段”是否意味着字段
skills.name
在一个Lucene文档中多次出现?什么是“复合方式”?我试着根据你的问题澄清这个问题,除了多个字段外,数据示例中的每一行都通过名称和值引用一个字段,因此yesskills.name
将在这里提供的示例中的文档中存在5次。自从我发现Lucene处理得很好,我就一直在走这条路。。。尽管如此,仍然有很多问题需要解决,所以我可能会改变路径……这似乎比你自己想出的解决方案要好。你能看一看这个“类似”的问题并给出你的2美分吗?
"skills.name": ".NET"
"skills.level": 5
"skills.experience": 12
"skills": "name .NET level 5 experience 12"