在多值字段上使用Solr4的自动完成功能

时间:2013-02-13 23:45:55

标签: solr autocomplete solr4

我看过有关在多个字段中执行自动填充功能的帖子,但没有在多值字段上执行自动填充功能。

我的自动填充功能适用于非多值字段。

我的问题是,当我在多值字段上运行查询时,只要文档与该查询匹配, all 就会在构面结果中返回该文档的多值字段中的字段。

下面是我的模式,类似于Solr 4 Cookbook中提出的模式。

 <fieldType name="text_autocomplete" class="solr.TextField" positionIncrementGap="100">
  <analyzer type="index">
    <tokenizer class="solr.WhitespaceTokenizerFactory"/>
    <filter class="solr.LowerCaseFilterFactory"/>
    <filter class="solr.EdgeNGramFilterFactory" minGramSize="1" maxGramSize="25" />
  </analyzer>
  <analyzer type="query">
    <tokenizer class="solr.WhitespaceTokenizerFactory"/>
    <filter class="solr.LowerCaseFilterFactory"/>
  </analyzer>
</fieldType>

<field name="publisherText-str" type="string" indexed="true" stored="false" multiValued="true"/>
<field name="publisherText-ac" type="text_autocomplete" indexed="true" stored="true" required="false" multiValued="true"/>

正如您所见,publisherText是一个多值字段。我执行这样的查询来测试自动完成功能:

/select?q=publisherText-ac:new&facet=true&facet.field=publisherText-str&facet.mincount=1&rows=0

查询为“new”,这与一组文档相匹配。但是,构面结果集包含每个匹配文档的其他publisherText值(包含在多值字段中)。

更新:查询“新”时,结果集应包含“纽约时报”和“Times New Roman”,但不需要解决中缀问题:“Knewton Gazette”不会需要在结果集中。

有没有办法让facet结果只包含与查询匹配的值? 或者是否有一种不同的(更好的?)方式来支持完全自动完成功能,可以更优雅地处理多值字段?

感谢。

3 个答案:

答案 0 :(得分:3)

我认为最优化的方法是创建一个单独的集合或核心(取决于您是否使用云)并以某种方式索引数据,以便查询所需的查询结果。当然,在某些情况下可能无法实现,但如果是在你的情况下,那就去做吧。在这样的核心中,您只能拥有与自动完成相关的字段和数据,因此在大多数情况下,它将比原始核心更小,更少的术语,这将导致更快的查询。除此之外,此类核心或集合针对自动完成查询进行了优化,您将从中获得更多性能。

但是,如果您不能采用多核心/收藏方法,那么突出显示可能是最好的方法,如果您需要过滤。在这种情况下,您可能希望打开术语验证程序并使用FastVectorHighlighting以更好地执行Solr突出显示(http://solr.pl/en/2011/06/13/solr-3-1-fastvectorhighlighting/)。

答案 1 :(得分:1)

到目前为止,我已经使用了这两种方式:

(A)坚持使用facet并接受你必须通过正则表达式或String.startsWith来减少结果。如果您使用YUI3自动完成插件之类的前端组件,这可能实际上并不是那么糟糕,该插件已经提供此功能,而您无需为此做很多事情。

(B)通过添加到您的查询来使用突出显示:

&hl=true&hl.fl=publisherText-ac

对于每次点击,突出显示组件将返回匹配值,包括突出显示标记(默认为<em>)。如果您的自动填充字段由多个输入字段提供,并且您不想搜索结果以找出哪个字段包含匹配值,那么这将更有帮助。但是,结果列表可能包含重复项。

我使用两种方法,(A)在单个字段上自动完成,(B)从多个字段获取自动完成时。我试图摆脱突出显示结果中包含的<em>标签,但事实证明这是非常不可能的(你只能更改它们但不能完全删除它们)。

(在这里使用SOLR 4.0)

答案 2 :(得分:1)

您可以使用facet.prefix=new参数,让solr为您过滤这些条目。 我还要考虑避免在这里制作ngrams。制作一个方面并使用facet.prefix就可以了。希望你不会有太多独特的术语,性能会很好。