Solr 6.4.2,使用startswith string过滤文档

时间:2017-02-13 13:55:29

标签: solr solr-schema

如何按字段过滤文档? 现在我获取所有文档,其中字段包含以此字符串开头的单词。最好的结果是,如果有人回答如何从结果首先得到精确的开始,然后保持,就像最接近过滤器的排序一样。谢谢。
喜欢:

company_name:(max*)
result : ['Min & Max', 'Maximum speed', 'Mirana max parrot']

但我希望它像:

company_name:(max*)
result : ['Maximum speed', 'Min & Max', 'Mirana max parrot']

现在我有了文本字段的配置:

     <fieldType name="text_en" class="solr.TextField" positionIncrementGap="100">
      <analyzer type="index">
        <tokenizer class="solr.StandardTokenizerFactory"/>
        <filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_en.txt" />
        <filter class="solr.LowerCaseFilterFactory"/>
        <filter class="solr.EnglishPossessiveFilterFactory"/>
        <filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/>
        <filter class="solr.EdgeNGramFilterFactory" minGramSize="3" maxGramSize="15" />
        <filter class="solr.PorterStemFilterFactory"/>
      </analyzer>
      <analyzer type="query">
        <tokenizer class="solr.StandardTokenizerFactory"/>
        <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
        <filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_en.txt"/>
        <filter class="solr.LowerCaseFilterFactory"/>
        <filter class="solr.EnglishPossessiveFilterFactory"/>
        <filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/>
        <filter class="solr.EnglishMinimalStemFilterFactory"/>
         <filter class="solr.EdgeNGramFilterFactory" minGramSize="3" maxGramSize="15" />
        <filter class="solr.PorterStemFilterFactory"/>
      </analyzer>
    </fieldType>

2 个答案:

答案 0 :(得分:0)

您必须使用string字段(实现为StrField)或TextField KeywordTokenizer作为标记器类。

这样做的原因是对令牌执行通配符匹配,并且当字符串被拆分为多个令牌时,每个令牌将与通配符匹配。 string类将整个字符串保持为单个标记,而KeywordTokenizer保持相同 - 但使用KeywordTokenizer允许您指定其他过滤器来处理字符串,例如在存储标记之前小写字符串。

答案 1 :(得分:0)

如果您使用的是EdgeNGrams,则不需要在查询中提供*。你只需要提供你的前缀。此外,EdgeNGram应仅位于索引配置中,而不应位于查询中。目前,你基本上只用前三个字符匹配。。

我建议你修复这两件事并再试一次(重新加载,但不需要重新索引,因为索引管道没有改变)。