随时欢迎任何帮助 我正在使用solrs的太阳黑子,但无法找到如何使用太阳黑子进行通配符搜索的任何好解决方案
如果我搜索8088 * * *
它应该返回所有数字以8088开头而不是228088560
答案 0 :(得分:9)
在/solr/conf/schema.xml中查找以下代码行:
<fieldType name="text" class="solr.TextField" omitNorms="false">
...
</fieldType>
并将其替换为:
<fieldType name="text" class="solr.TextField" omitNorms="false">
<analyzer type="index">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.StandardFilterFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.EdgeNGramFilterFactory" minGramSize="1" maxGramSize="20" side="front" />
</analyzer>
<analyzer type="query">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.StandardFilterFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldType>
请记住重新启动solr服务器,并在这些更改后重新编制索引
rake sunspot:solr:stop
rake sunspot:solr:start
rake sunspot:reindex
答案 1 :(得分:2)
Sunspot通过NGramToeknizer为您提供免费的通配符*(对于太小的子集和其他怪癖,有时会出现NGramTokenizer问题),这意味着排除实际上是棘手的部分。如果你知道数字中的位数(比如说6),那么处理这个数字的粗略但有效的方法就是不使用(:field).greater_than(808900)而不使用(:field).less_than(808700)&lt ; - 我不记得.greater_than和.less_than是否真的=&gt;和=&lt; ,如果他们只是&gt;和&lt;你可能想做808899和808800,但你明白了。
**更正有一个解决方案:您可以将solr / config / schema.xml中的NGramFilterFactory更改为EdgeNGramFilterFactory(假设您首先使用NGramFilterFactory来获取部分字搜索)。这使索引只分解从字符串开头开始的单词。在此之后,重新启动服务器并重新编制索引。
***此
的所有功劳都归Zach Moazeni at Collective Idea所有