5

我正在评估 Solr 4.0 和 Elastic Search 0.20.5 用于链接类型搜索,并想知道如何存储用户配置文件的规范化数据,这可以使用嵌套文档在弹性搜索中轻松实现。

例如
人 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 中索引和搜索它的最佳方法是什么?

4

3 回答 3

1

不幸的是,Solr 无法像 elasticsearch 那样定义嵌套文档。

在 Solr 的案例中,答案是使用multiValued模拟平面文档中所需信息的字段。就我个人而言,我发现这是非常有限的,特别是因为分组的细节(对象)可能是分开的,但这是 Solr 的方式。正如 arun 的引用链接所建议的,您可以使用动态字段来解决此问题(例如,school_name_1school_degree_1school_name_2withschool_degree_2链接),但与弹性搜索的灵活性相比,这是一个更大的麻烦。

如果您的文档是 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" />

不要忘记结束日期。您可能还想考虑学生可以拥有多个学位,尽管这可以通过简单地在学校加倍来解决,或者在同一起始年将学位设置为数组。

于 2013-03-04T04:39:02.797 回答
1

我相信你可以达到你想要的。有许多字段类型和社区插件。唯一的问题是很难找到好的文档。

您显然可以选择@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]

我希望这对您的问题有所帮助。祝你好运。

于 2013-03-10T09:47:53.730 回答
0

索引应该使用多值字段完成

<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 允许搜索学校位置的交叉点,并正确找到包含指定项目(school_name:some school and school_degree:x-Degree)的 Person:

SpanNearQuery(
    SpanTermQuery("school_name", "some school”),
    FieldMaskingSpanQuery(
               SpanTermQuery("school_degree", "x-Degree"),
               “school_name”
    ), -1, false
)

参考

于 2013-03-11T06:25:47.293 回答