如何使用太阳黑子实现通配符搜索

时间:2011-12-02 09:12:10

标签: ruby-on-rails sunspot

随时欢迎任何帮助 我正在使用solrs的太阳黑子,但无法找到如何使用太阳黑子进行通配符搜索的任何好解决方案

如果我搜索8088 * * *

它应该返回所有数字以8088开头而不是228088560

2 个答案:

答案 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所有