【发布时间】:2016-04-28 17:10:17
【问题描述】:
假设如果我在 solr 中使用关键字 IPL 进行搜索,我想要同时包含 IPL 和 #IPL 的结果。如何做到这一点?
我在索引和查询中尝试了下面这样的 WordDelimFactory,但没有成功 .
我想我必须将字符串拆分为“string”和“#string”,但不知道该怎么做。
【问题讨论】:
标签: solr lucene tokenize solr4 stemming
假设如果我在 solr 中使用关键字 IPL 进行搜索,我想要同时包含 IPL 和 #IPL 的结果。如何做到这一点?
我在索引和查询中尝试了下面这样的 WordDelimFactory,但没有成功 .
我想我必须将字符串拆分为“string”和“#string”,但不知道该怎么做。
【问题讨论】:
标签: solr lucene tokenize solr4 stemming
如果您希望每个关键字都作为#keyword 进行搜索,那么您可以尝试在查询中使用 OR 运算符,例如
/select?q="IPL" OR "#IPL"
如果你想在特定领域进行搜索,那么
/select?q=title:"IPL" OR title:"#IPL"
您可以尝试使用同义词。但在这种情况下,它只是前缀#。
转到您的 solr 实例的配置文件。在 conf 文件夹中编辑 synonyms.txt 文件。
IPL => #IPL
或
在 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
【讨论】:
这是通过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>
【讨论】: