我正在评估Solr 4.0和Elastic Search 0.20.5以进行linkedin类型搜索,并想知道如何存储使用嵌套文档在弹性搜索中轻松实现的用户配置文件的规范化数据。
例如
人Json
{
first_name: abc,
last_name: xyz,
school: [{
name: some school,
degree: x-Degree,
startDate:12-02-2009
},
{
name: some school2,
degree: x-Degree-2,
startDate:12-02-2012
}
]
}
我想搜索用户学校的名称,学位,目前学习类似于linkedin搜索,
在Solr中索引和搜索它的最佳方法是什么?
答案 0 :(得分:1)
不幸的是,Solr不像将弹性搜索定义为嵌套文档。
在Solr的案例中,答案是使用模仿展平文档中所需信息的multiValued
字段。就个人而言,我发现这是非常有限的,特别是因为分组的细节(对象)可能是分开的,但它是Solr的方式。您可以使用动态字段来解决此问题(例如,school_name_1
与school_degree_1
和school_name_2
与school_degree_2
相关联),如arun引用的链接所示,但这是一个更大的麻烦与弹性研究的灵活性相比。
如果您的文档是XML格式,那么您可以使用XPathEntityProcessor
自动展平它。也许更不幸的是,我不知道任何执行类似操作的JSON处理器。
您将需要类似于以下的架构:
<field name="first_name" indexed="true" />
<field name="last_name" indexed="true" />
<field name="school_name" multiValued="true" indexed="true" />
<field name="school_degree" multiValued="true" indexed="true" />
<field name="school_start_date" multiValued="true" indexed="true" />
不要忘记结束日期。你可能还想考虑学生可以拥有多个学位,虽然这可以通过简单地加倍学校来解决,或者在同一个学年开始时使学位成为一个数组。
答案 1 :(得分:0)
建立索引应使用 multiValued 字段
完成<field name="first_name" indexed="true" />
<field name="last_name" indexed="true" />
<field name="school_name" multiValued="true" indexed="true" />
<field name="school_degree" multiValued="true" indexed="true" />
<field name="school_start_date" multiValued="true" indexed="true" />
的搜索下,
像school_name一样搜索单个字段将像普通字段搜索一样简单,但是对多个嵌套字段的搜索应该区别对待,
将SpanTermQueries与FiledMaskingSpanQuery结合起来并将它们放在SpanNearQuery中可以搜索学校的交叉点&#39;位置,并正确找到包含指定项目的Person(school_name:some school和school_degree:x-Degree):
SpanNearQuery(
SpanTermQuery("school_name", "some school”),
FieldMaskingSpanQuery(
SpanTermQuery("school_degree", "x-Degree"),
“school_name”
), -1, false
)