假设我在solr中搜索关键字IPL,我想要包含IPL和#IPL的结果。如何实现这个目标?
我在索引和查询中尝试了如下所示的WordDelimFactory,但没有成功
我想我必须将字符串拆分为" string"和"#string"但不知道该怎么做。
答案 0 :(得分:0)
如果您希望每个keryword都搜索为#keyword,那么您可以尝试在查询中使用OR运算符,如
/select?q="IPL" OR "#IPL"
如果您想在特定字段中搜索
/select?q=title:"IPL" OR title:"#IPL"
您可以尝试使用同义词。但在这种情况下,它只是前缀#。
转到solr实例的配置文件。在conf文件夹中编辑synonyms.txt文件。
IPL => #IPL
OR
在schema.xml文件中更改查询字段标记生成器,
<fieldType name="text" class="solr.TextField" positionIncrementGap="100">
<analyzer type="query">
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
<filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldType>
然后使用字段名称/select?q=text:#IPL
因为在solr文本中是默认的,所以您可以尝试/select?q=#IPL
答案 1 :(得分:0)
这是通过WordDelimiterFilterFactory
完成的。设置generateWordParts=1.
并保留preserveOriginal = 1。
这将保留原始内容并在没有#。
修改schema.xml
后重新启动服务器并重新索引数据。
<fieldType name="text" class="solr.TextField" positionIncrementGap="100">
<analyzer>
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
<filter class="solr.StopFilterFactory"
ignoreCase="true"
words="stopwords.txt"
enablePositionIncrements="true"
/>
<filter class="solr.WordDelimiterFilterFactory"
protected="protwords.txt"
generateWordParts="1"
generateNumberParts="1"
catenateWords="1"
catenateNumbers="1"
catenateAll="0"
splitOnCaseChange="0"
preserveOriginal="1"/>
<filter class="solr.LengthFilterFactory" min="2" max="100" />
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.SnowballPorterFilterFactory" language="English" protected="protwords.txt"/>
<filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
</analyzer>
</fieldType>