Solr 4.0存储和搜索Profile的Normalize数据
Posted
技术标签:
【中文标题】Solr 4.0存储和搜索Profile的Normalize数据【英文标题】:Solr 4.0 storing and searching Normalize data of Profile 【发布时间】:2013-02-15 22:47:03 【问题描述】:我正在评估 Solr 4.0 和 Elastic Search 0.20.5 用于链接类型搜索,并想知道如何存储用户配置文件的规范化数据,这可以使用嵌套文档在弹性搜索中轻松实现。
例如 Person 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 中索引和搜索它的最佳方法是什么?
【问题讨论】:
见***.com/questions/5584857/… 【参考方案1】:不幸的是,Solr 无法像 elasticsearch 那样定义嵌套文档。
在 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" />
不要忘记结束日期。您可能还想考虑学生可以拥有多个学位,尽管这可以通过简单地在学校上加倍来解决,或者在同一起始年将学位设为数组。
【讨论】:
【参考方案2】:我相信您可以完全实现您想要的。有许多字段类型和社区插件。唯一的问题是很难找到好的文档。
您显然可以选择@pickypg 建议的多值字段。当您尝试在一个查询中按 school_name 和 school_degree 进行搜索时,就会出现此问题。结果将不正确。
我正在为稍微不同的问题做的是使用PointType
类:
<fieldType name="range" class="solr.PointType" dimension="1" subFieldType="double" />
<field name="cat_lr" type="range" indexed="true" stored="true" multiValued="true"/>
它允许我在每个文档中有多个范围。我这样插入它们:
cat_lr=2,5
我会这样寻找他们:
+cat_lr:[1 TO 10]
希望对您的问题有所帮助。祝你好运。
【讨论】:
【参考方案3】:索引应该使用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 允许搜索学校位置的交叉点,并正确找到包含指定 Item 的 Person(school_name:some school and school_degree:x-Degree):
SpanNearQuery(
SpanTermQuery("school_name", "some school”),
FieldMaskingSpanQuery(
SpanTermQuery("school_degree", "x-Degree"),
“school_name”
), -1, false
)
Reference
【讨论】:
以上是关于Solr 4.0存储和搜索Profile的Normalize数据的主要内容,如果未能解决你的问题,请参考以下文章