2011-09-21 33 views
6

我正在使用SOLR 3.2。我的应用程序针对文本字段类型在SOLR实例上发布搜索查询。如何让SOLR返回像“book”,“bookshelf”,“bookasd”等结果,当用户发出像“book”这样的查询时。我应该手动追加“*”字符到查询字符串,还是在SOLR中有一个设置,所以默认情况下它会在字段上进行前缀搜索?如何配置SOLR,以便用户可以默认进行前缀搜索?

这是文本字段类型schema.xml中部分:

<fieldType name="text" class="solr.TextField" positionIncrementGap="100"> 
     <analyzer type="index"> 
     <charFilter class="solr.HTMLStripCharFilterFactory"/> 
     <tokenizer class="solr.WhitespaceTokenizerFactory"/> 
     <filter class="solr.StopFilterFactory" 
       ignoreCase="true" 
       words="stopwords.txt" 
       enablePositionIncrements="true" 
       /> 
     <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="1" splitOnCaseChange="0"/> 
     <filter class="solr.LowerCaseFilterFactory"/> 
     <filter class="solr.SnowballPorterFilterFactory" language="English" protected="protwords.txt"/> 
     </analyzer> 
     <analyzer type="query"> 
     <charFilter class="solr.HTMLStripCharFilterFactory"/> 
     <tokenizer class="solr.WhitespaceTokenizerFactory"/> 
     <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/> 
     <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenat0All="1" splitOnCaseChange="0"/> 
     <filter class="solr.LowerCaseFilterFactory"/> 
     <filter class="solr.SnowballPorterFilterFactory" language="English" protected="protwords.txt"/> 
     </analyzer> 
    </fieldType> 
+0

您是否找到答案? –

回答

0

你要么必须通过在搜索字词的末尾追加通配符做在客户端的处理。

的影响: -

  1. 通配符查询会影响性能
  2. 通配符查询不进行分析。所以查询时间分析将不会适用于您搜索条件

另一种选择是实现自定义查询分析器与您需要的处理。

1

我对一个项目有同样的要求。我必须执行建议。我所做的就是确定这个建议者的字段类型

<fieldType class="solr.TextField" name="suggester"> 
    <analyzer type="index"> 
     <tokenizer class="solr.StandardTokenizerFactory"/> 
     <filter class="solr.LowerCaseFilterFactory"/> 

     <filter class="solr.ShingleFilterFactory" minShingleSize="2" maxShingleSize="3" outputUnigrams="true" outputUnigramsIfNoShingles="false" /> 
     <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords_en.txt" enablePositionIncrements="true" /> 
    </analyzer> 
    <analyzer type="query"> 
     <tokenizer class="solr.KeywordTokenizerFactory"/> 
     <filter class="solr.LowerCaseFilterFactory"/> 
    </analyzer> 
</fieldType> 

我用ShingleFilterFactory,因为我需要得到的一个或多个单词组成的建议。

然后我用faceting查询来获取建议。

Facet.Limit = 10

Facet.Prefix = “书”

Facet.Field = “建议者” //这是与字段类型= “建议者”领域中,我保存数据

我知道它使用方面的结果,但它可能会解决您的问题。

如果我或Jayendra Patil's answer不会向您提供一个解决方案,您还可以看看EdgeNGramFilterFactory

0

我嗯,你现在已经明白了这一点,但这里有一个答案:

我处理了这一点,通过把最后一个术语加上一个OR加上一个通配符,例如“我最喜欢的书”变成“我最喜欢的+(书或书*)”,并且会返回“我最喜欢的书架”。无论如何,你可能想要对输入进行一些处理(转义等)。

如果您正在寻找输入的文本以匹配结果的开头,那么边缘n-gram是要走的路,但是通过阅读您的问题,您似乎并没有真正要求这样做。

相关问题