3

我看过关于跨多个字段执行自动完成但没有在多值字段上执行自动完成的帖子。

我的自动完成功能适用于非多值字段。

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

下面是我的架构,类似于 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

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

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

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

谢谢。

4

3 回答 3

3

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

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

于 2013-02-14T21:35:32.683 回答
1

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

(A) 坚持使用构面并接受您必须通过正则表达式或 String.startsWith 来减少结果。如果你使用像 YUI3 Autocomplete 插件这样的前端组件,它实际上可能并没有那么糟糕,它已经提供了这个功能,而你不必做太多的事情。

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

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

对于每个命中,高亮组件将返回匹配值,包括高亮标签(默认情况下<em>)。如果您的自动完成字段来自多个输入字段并且您不想搜索结果以找出哪个字段包含匹配值,这将更加有用。但是,结果列表可能包含重复项。

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

(在这里使用 SOLR 4.0)

于 2013-02-14T13:02:38.917 回答
1

您可以只使用facet.prefix=new参数并让 solr 为您过滤掉这些条目。我还要考虑的是避免在这里制作 ngram。制作一个方面并使用facet.prefix它已经可以解决问题了。希望您不会有太多独特的术语,并且性能会很好。

于 2013-02-14T18:52:49.683 回答