2013-07-23 54 views
0

时,我有以下字段类型:Apache Solr实现 - 如何防止分裂搜索短语

<fieldType name="textfield" class="solr.TextField" positionIncrementGap="100"> 
    <analyzer type="index"> 
    <charFilter class="solr.HTMLStripCharFilterFactory"/> 
    <tokenizer class="solr.WhitespaceTokenizerFactory"/> 
    <filter class="solr.TrimFilterFactory"/> 
    <filter class="solr.LengthFilterFactory" min="3" max="30"/> 
    <!-- in this example, we will only use synonyms at query time 
    <filter class="solr.SynonymFilterFactory" synonyms="index_synonyms.txt" ignoreCase="true" expand="false"/> 
    --> 
    <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true"/> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" 
      catenateWords="1" catenateNumbers="1" catenateAll="0" splitOnCaseChange="1"/> 
    <filter class="solr.SnowballPorterFilterFactory" language="English" protected="protwords.txt"/> 
    <filter class="solr.RemoveDuplicatesTokenFilterFactory"/> 
    </analyzer> 
    <analyzer type="query"> 
    <tokenizer class="solr.WhitespaceTokenizerFactory"/> 
    <filter class="solr.LengthFilterFactory" min="3" max="30"/> 
    <!--<filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>--> 
    <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true"/> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    <filter class="solr.TrimFilterFactory" /> 
    <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" 
      catenateWords="0" catenateNumbers="0" catenateAll="0" splitOnCaseChange="1"/> 
    <filter class="solr.SnowballPorterFilterFactory" language="English" protected="protwords.txt"/> 
    </analyzer> 
</fieldType> 

我的问题是,使用引号的词组搜索时,结果都是一样的,如果没有引号,所以如果我搜索让我们说:
abc。 8
这将显示相​​同的结果
“abc.8”
并且期间还可以分裂文本吗?

换句话说,我只是想在查询文本被引用时搜索短语。 Thx。

回答

0

您已将LengthFilterFactory并入您的分析仪,其最小长度为3.令牌8的长度为1,因此将从索引和该过滤器的查询中删除。您的查询语法是正确的,如果两个词都被编入索引,则按照您的指定执行短语查询。

+0

有没有一种方法可以避免在查询中被标记的短语?我的意思是,当搜索“abc.8”时,我想将它看作是5个字符的单个标记,所以8不会从查询中消除。 – CCC

+0

这会让搜索非常困难,因为索引中的标记仍然会被标记。您可以使用单个标记'abc创建查询。 8',但你的索引仍然只有标记'abc.'。如果你希望能够找到“8”的标记,我会猜测最小长度根本就不会对你有任何帮助。 – femtoRgon

+0

如果您确实需要支持不同的标记化方案,最好的解决方案是使用不同名称的字段为两个不同版本的文本编制索引。 – femtoRgon