我在我的应用程序中有solr,我需要涵盖以下场景: 我有一个有三个值的字段: 咖啡店 甜甜圈店 体育用品店
当我搜索“咖啡店”时,我得到所有具有上述任何值的文件。原因是所有人都有“商店”。 我正在尝试改变这种搜索行为,以便当我搜索“咖啡店”时,我只获得有“咖啡店”的文件,当我搜索“商店”时,我得到具有上述所有值的文件。下面是我的fieldType定义
<fieldType name="text_general" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
<filter class="solr.ReversedWildcardFilterFactory"/>
<filter class="solr.WordDelimiterFilterFactory"
splitOnNumerics="0"
stemEnglishPossessive="1"
splitOnCaseChange="1"
generateWordParts="1"
generateNumberParts="1"
catenateWords="1"
catenateNumbers="1"
catenateAll="0"
preserveOriginal="1"
protected="protwords.txt"/>
<filter class="solr.StopFilterFactory"
ignoreCase="true"
words="stopwords.txt"
enablePositionIncrements="true" />
<filter class="solr.HunspellStemFilterFactory"
dictionary="en_US.dic"
affix="en_US.aff"
ignoreCase="true" />
</analyzer>
<analyzer type="query">
<tokenizer class="solr.StandardTokenizerFactory"/>
<charFilter class="solr.HTMLStripCharFilterFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.TrimFilterFactory"/>
<filter class="solr.WordDelimiterFilterFactory"
splitOnNumerics="0"
stemEnglishPossessive="1"
splitOnCaseChange="1"
generateWordParts="1"
generateNumberParts="1"
catenateWords="0"
catenateNumbers="0"
catenateAll="0"
preserveOriginal="1"
protected="protwords.txt"/>
<filter class="solr.StopFilterFactory"
ignoreCase="true"
words="stopwords.txt"
enablePositionIncrements="true" />
<filter class="solr.HunspellStemFilterFactory"
dictionary="en_US.dic"
affix="en_US.aff"
ignoreCase="true" />
</analyzer>
</fieldType>
谢谢
答案 0 :(得分:2)
我似乎有同样的需求,搜索sac à main
(法语为handbag
)只返回sac
的内容,这是我不想要的。但我希望搜索sac
以使用sac à main
返回内容。
以下是我在网上进行了几个小时的研究后所做的事情:
在schema.xml
中,至少包含以下参数:
<fieldType name="text" class="solr.TextField" indexed="true" stored="true" multiValued="true" positionIncrementGap="100">
<analyzer type="index">
…
<filter class="solr.SynonymFilterFactory"
synonyms="fr_expressions.txt"
ignoreCase="true"
expand="true" />
…
</analyzer>
<analyzer type="query">
…
<filter class="solr.SynonymFilterFactory"
synonyms="fr_expressions.txt"
ignoreCase="true"
expand="false" />
…
</analyzer>
</fieldType>
在fr_expressions.txt
中,这一行如下:
sac_a_main,sac a main,sacs a main
index
分析器将全部替换索引文本中的3个值。
query
分析器将使用sac_a_main
替换查询中的3个值。
搜索sac à main
只会找到sac_a_main
的内容,但搜索sac
也会找到这些内容。
HTH
答案 1 :(得分:0)
在schema.xml中有一个默认运算符,默认为OR。 但是,据说不要依赖它(虽然我将它改为AND)。
假设您正在“描述”字段中搜索,您可以执行以下操作:
描述:“咖啡店”&lt;&lt;&lt;这是一个完全匹配(案例被忽略),按照确切的顺序(我认为没有分离)
描述:(咖啡店)&lt;&lt;&lt;这将匹配包含两个单词的描述,以任何顺序(我认为有任何距离)