我在schema.xml
中有以下字段:
<field name="content" type="text_snowballstem" indexed="true" stored="true" multiValued="true" omitNorms="false" termVectors="true" />
字段类型定义:
<fieldType name="text_snowballstem" class="solr.TextField" positionIncrementGap="100">
<analyzer>
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
<filter class="solr.ASCIIFoldingFilterFactory"/>
<filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt"/>
<filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1"
catenateWords="1" catenateNumbers="1" catenateAll="1"
splitOnCaseChange="1" splitOnNumerics="1"
stemEnglishPossessive="1" preserveOriginal="1" />
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.KeywordRepeatFilterFactory"/>
<filter class="solr.SnowballPorterFilterFactory" protected="no_stemming.txt"/>
<filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
</analyzer>
</fieldType>
现在,让我们说索尔索引2条记录,内容为:
对于此查询
content:"description"
solr将返回2条记录。这是我们所期望的。但是对于查询
content:"descirption\:"
它还返回2条记录。为什么在这里忽略冒号?我希望在结果中只收到1条记录。
感谢任何建议。
UPD
我已对WordDelimeterFilterFactory
实施了建议的更改:
<filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1"
catenateWords="1" catenateNumbers="1" catenateAll="1"
splitOnCaseChange="1" splitOnNumerics="1"
stemEnglishPossessive="1" preserveOriginal="1" types="nosplit.txt"/>
和nosplit.txt
文件:
# Don't split numbers at '$', '.' or ':'
: => ALPHA
$ => ALPHA
. => ALPHA
- => ALPHA
然而,Solr分析器仍显示content:description:
有什么想法吗?
答案 0 :(得分:0)
WordDelimiterFilterFactory 为说明生成两个令牌:
你可以检查一下。只需在solr管理界面进行分析即可。选择fieldType并粘贴数据,然后您就可以看到相应的标记。
这就是为什么当你搜索描述时,描述:也会出现在结果中
我们可以控制 WDF 不会在冒号上拆分的行为。
<filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1"
catenateWords="1" catenateNumbers="1" catenateAll="1"
splitOnCaseChange="1" splitOnNumerics="1"
stemEnglishPossessive="1" preserveOriginal="1" types="nosplit.txt"/>
[<强> nosplit.txt 强>
# Don't split numbers at '$', '.' or ':'
: => ALPHA
$ => ALPHA
. => ALPHA
我添加了一个类型参数,它将改变 WDF 的拆分行为。在此之后它将只产生第一个令牌而不是第二个令牌。
P.S: - 类型参数从6.5开始可用。因此,如果您使用的是旧版本,则无法使用。
您可以使用受保护的参数
protected :(可选)包含列表的文件的路径名 受保护的词语应该在不分裂的情况下传递。
<filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1"
catenateWords="1" catenateNumbers="1" catenateAll="1"
splitOnCaseChange="1" splitOnNumerics="1"
stemEnglishPossessive="1" preserveOriginal="1" protected="prot.txt"/>
[prot.txt]
description:
此功能在Solr 5和6中均可用。
您可以使用原始查询解析器。此查询解析器搜索输入测试,无需任何文本分析或转换。
{!raw f=content}description\: