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_1school_degree_1school_name_2school_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数据的主要内容,如果未能解决你的问题,请参考以下文章

Solr搜索引擎索引管理

复杂Solr排序表达4.0 alpha

Solr 4.0 部署实例教程

ElasticSearch的基本用法与集群搭建

ElasticSearch的基本用法与集群搭建

Solr 4.0 用户界面问题