2010-08-05 59 views
7

我想要做的就是执行一个查询并获取不区分大小写的结果并且匹配来自索引的部分单词。在Solr中使用多个标记器

我有一个Solr模式设置在此刻被修改,以便我可以查询并返回结果,无论他们是什么情况。所以,如果我搜索iPOd,Iwill会看到iPod返回。要做到这一点的代码是:

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

我发现这个代码,让我们做一个局部的词匹配查询,但我不认为我能有一个字段中的两个断词。

<fieldType name="text" class="solr.TextField" > 
    <analyzer type="index"> 
    <tokenizer class="solr.NGramTokenizerFactory" minGramSize="3" maxGramSize="15" /> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    </analyzer> 
... 
</fieldType> 

那么我能做些什么来在该字段上执行这个标记器呢?
或者有没有办法将它们合并?
或者有另一种方法可以完成这项任务吗?

回答

7

声明具有NGram分词器的另一个字段类型(即不同的名称),然后声明一个字段,该字段使用带有NGram的fieldType和具有标准“text”字段类型的另一个字段。使用copyField将一个复制到另一个。请参阅Indexing same data in multiple fields

+1

但现在该如何查询,以便结果将显示在用两个标记器进行标记的数据中?换句话说 - 如何同时从两个标记器获得结果? – 2014-11-19 10:37:07

7

另一种方法是将EdgeGramFilterFacgtory应用到现有字段并保留在当前的标记器(WhitespaceTokenizerFactory)中,例如,

<filter class="solr.EdgeNGramFilterFactory" minGramSize="3" maxGramSize="15" /> 

这将保持当前的模式不变,即你不需要它有另一个标记生成器(NGramTokenizerFactory)

你现场看看,然后像下面的附加字段:

<fieldType name="text" class="solr.TextField" positionIncrementGap="100"> 
    <analyzer type="index"> 
    <tokenizer class="solr.WhitespaceTokenizerFactory"/> 
    <filter class="solr.EdgeNGramFilterFactory" minGramSize="3" maxGramSize="15" /> 
    <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" /> 
    <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0" splitOnCaseChange="1"/> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    <filter class="solr.SnowballPorterFilterFactory" language="English" protected="protwords.txt"/> 
    </analyzer> 
... 
</fieldType>