我看过有关在多个字段中执行自动填充功能的帖子,但没有在多值字段上执行自动填充功能。
我的自动填充功能适用于非多值字段。
我的问题是,当我在多值字段上运行查询时,只要文档与该查询匹配, 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结果只包含与查询匹配的值? 或者是否有一种不同的(更好的?)方式来支持完全自动完成功能,可以更优雅地处理多值字段?
感谢。
答案 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
就可以了。希望你不会有太多独特的术语,性能会很好。