2011-10-08 174 views
7

我正在尝试使用Solr搜索部分字词,但我无法使其工作。使用Solr搜索部分字词

我在我的schema.xml文件中使用了这个。

<fieldType name="text" class="solr.TextField" omitNorms="false"> 
    <analyzer type="index"> 
     <tokenizer class="solr.NGramTokenizerFactory" minGramSize="3" maxGramSize="15" /> 
     <filter class="solr.LowerCaseFilterFactory"/> 
    </analyzer> 
    <analyzer type="query"> 
     <tokenizer class="solr.StandardTokenizerFactory"/> 
     <filter class="solr.StandardFilterFactory"/> 
     <filter class="solr.LowerCaseFilterFactory"/> 
     <filter class="solr.PorterStemFilterFactory"/> 
     <filter class="solr.WordDelimiterFilterFactory" stemEnglishPossessive="1" splitOnNumerics="1" splitOnCaseChange="1" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="1" preserveOriginal="1"/> 
    </analyzer> 
</fieldType> 

搜索die h将无法​​正常工作,但die hard返回一些结果。 添加上述配置后,我已经重新编制了数据库索引。

Here是搜索die hard时的网址和输出。调试器已打开。

Here是搜索die h时的网址和输出。调试器已打开。

我正在使用Solr 3.3。 Hereschema.xml文件的其余部分。

+0

我解决了这个问题。去: http://stackoverflow.com/questions/4824954/solr-partial-and-full-string-match/8247013#8247013 – wormhit

回答

6

您共享的查询正在搜索“title_text”字段,但上面发布的模式定义了“text”字段。假设这只是一个疏忽,并且title_text字段被定义为在您的文章中,我认为可能的问题是NGramTokenizer配置了minGramSize =“3”,并且您期望使用单字符标记进行匹配。

您可以尝试将minGramSize更改为1,但这不可避免地会导致一些非常低效的索引;我想知道你是否真的热衷于让电影中的每部电影与电影中的电影匹配?

+0

是否有可能为所有索引定义一个'NGramTokenizerFactory',而不仅仅是' text'?我尝试使用'Danci'寻找电影“The Dancing Masters”,该电影奏效了。但是为了寻找“Danc”没有用,为什么?不应该将'NGramTokenizerFactory'限制设置为3? – Oleander

+0

分析(tokenizer等)是在Solr的每个字段中定义的。如果您想一次为所有字段中的所有文本编制索引,则可以定义一个自动执行此操作的copyField。我怀疑“Danci”匹配是由于标记而不是NGram。如果你在管理工具中乱搞,你可以看到分析结果,你应该能够知道。 –

+0

使用copyField效果很好。 [这里](https://gist.github.com/1272526)是结果。你有没有机会知道我可能包含在我的schema.xml文件中的其他上帝过滤器? – Oleander