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

在多值字段上使用Solr4自动完成功能,solr,autocomplete,solr4,Solr,Autocomplete,Solr4,我看到过关于在多个字段中执行自动完成的帖子,但没有看到关于在多值字段中执行自动完成的帖子 我的自动完成功能适用于非多值字段 我的问题是,当我在多值字段上运行查询时,只要文档与该查询匹配,该文档的多值字段中的所有字段都会在方面结果中返回 下面是我的模式,类似于Solr4食谱中提出的内容 <fieldType name="text_autocomplete" class="solr.TextField" positionIncrementGap="100"> <analyze

我看到过关于在多个字段中执行自动完成的帖子,但没有看到关于在多值字段中执行自动完成的帖子

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

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

下面是我的模式,类似于Solr4食谱中提出的内容

 <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"/>
查询是“新建”的,它匹配一组文档。但是,facet结果集包含每个匹配文档的其他publisherText值(包含在多值字段中)

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

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


谢谢。

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

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

(B) 通过向查询中添加以下内容来使用高亮显示:

&hl=true&hl.fl=publisherText-ac
对于每次点击,突出显示组件将返回匹配值,包括突出显示标记(默认情况下
)。如果您的“自动完成”字段由多个输入字段生成,并且您不想通过搜索结果来找出哪个字段包含匹配值,那么这将更有帮助。但是,结果列表可能包含重复项

我使用这两种方法,(A)针对单个字段的自动完成,(B)针对多个字段的自动完成。我试图去掉突出显示结果中包含的
标记,但事实证明这是不可能的(您只能更改它们,但不能完全删除它们)


(在这里使用SOLR 4.0)

您只需使用
facet.prefix=new
参数,让SOLR为您过滤这些条目即可。
我还将考虑避免在这里做NGCG。制作一个facet并使用
facet.prefix
已经完成了这个技巧。希望您不会有太多独特的术语,性能也会很好。

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


然而,如果您不能使用多核/集合方法,那么如果您需要过滤,突出显示可能是最好的方法。在这种情况下,您可能希望启用术语verctors并使用FastVectorHighlighting来提高Solr highlighting()的性能。

看看我的答案,我想您可能会发现它很有趣。干杯谢谢你的回应。facet.prefix有帮助,但不能完全解决问题。结果集应包括任何单词匹配的值。例如,如果我的查询是“new”,那么结果集应该包括“new York Times”和“Times new Roman”(但不需要支持中缀,“Knewton Gazette”不必在结果集中)。好吧,这是一个新问题。然后我将看一下terms组件,它做了一些类似的事情,但方式不同,并允许您指定一个正则表达式,而不是唯一的前缀,以便过滤显示的结果。您的模式可能也需要更改,性能可能会更差,这取决于您对该字段有多少唯一的术语。谢谢。我来看看TermsComponent。似乎它可能有一些限制,因为我想能够过滤以及。我正在考虑设置一个单独的核心,以非规范化的方式索引这个发布者字段(每个文档都是发布者)。然后,该索引将专用于为该数据的自动完成请求提供服务,而不是将数据隐藏在多值字段中。是的,如果要进行筛选,唯一的方法是创建一个方面。独立的核心理念无疑是最好的,它提供了更多的灵活性,但也需要更多的努力。祝你好运“以某种方式对数据进行索引,使其可以成为所需查询结果的查询”-这不是这个问题的主题吗?在这件事上你应该更详细一点:一个单独的核心如何在这里起作用?您的意思是规范化数据以确保自动完成结果不会返回重复的结果吗?此外,问题不在于性能,而在于“更优雅地处理多值字段的自动完成功能”?您必须证明,仅为autocomplete维护一个单独的核心是值得的,而且确实是值得的。比此解决方案的性能更高。
&hl=true&hl.fl=publisherText-ac