Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 在Lucene.NET中索引Json对象数组_Arrays_Lucene.net - Fatal编程技术网

Arrays 在Lucene.NET中索引Json对象数组

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"

我正在将任意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", 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) 综合上述因素
所有这些都取决于数据,显然,坚持对上述数据进行后验证会产生非常糟糕的结果,因为我很可能会得到错误点击的分配。它仍然会过滤掉没有.NET技能的人,但这是一件好事

但我想,至少到目前为止,我离目标更近了一步


根据上面的场景,我们现在可以:(大大缩短)

我们得到的是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文档中多次出现?什么是“复合方式”?我试着根据你的问题澄清这个问题,除了多个字段外,数据示例中的每一行都通过名称和值引用一个字段,因此yes
skills.name
将在这里提供的示例中的文档中存在5次。自从我发现Lucene处理得很好,我就一直在走这条路。。。尽管如此,仍然有很多问题需要解决,所以我可能会改变路径……这似乎比你自己想出的解决方案要好。你能看一看这个“类似”的问题并给出你的2美分吗?
"skills.name": ".NET"
"skills.level": 5
"skills.experience": 12
"skills": "name .NET level 5 experience 12"