Solr“以”开头“和”短语“索引

时间:2013-01-14 20:59:33

标签: solr indexing

我正在尝试创建一个索引,允许我根据单个词和部分短语的“开头”进行查询。

例如,给定文本“blah blah stuff couple blue drums blah more blah”(注意这基本上是使用复制字段对记录进行全文搜索),我希望能够匹配以下内容:

  • 夫妇
  • couple blu
  • 情侣蓝
  • 蓝鼓
  • blue dru

它不应该匹配“情侣鼓”的查询。

我尝试使用“text_general”类型,但它不会执行部分单词查询,例如“cou”。

<fieldType name="text_general" class="solr.TextField" positionIncrementGap="100">
  <analyzer type="index">
    <tokenizer class="solr.StandardTokenizerFactory"/>
    <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" />
    <!-- in this example, we will only use synonyms at query time
    <filter class="solr.SynonymFilterFactory" synonyms="index_synonyms.txt" ignoreCase="true" expand="false"/>
    -->
    <filter class="solr.LowerCaseFilterFactory"/>
  </analyzer>
  <analyzer type="query">
    <tokenizer class="solr.StandardTokenizerFactory"/>
    <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" />
    <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
    <filter class="solr.LowerCaseFilterFactory"/>
  </analyzer>
</fieldType>

我还试过了一个边缘ngram过滤器,但它没有按照我需要的方式做短语,例如,text:'couple drums'的查询会返回带有'couple'或'drum'的结果。

<fieldType name="fulltext2" class="solr.TextField" positionIncrementGap="100">
  <analyzer type="index">
    <tokenizer class="solr.LowerCaseTokenizerFactory"/>
    <filter class="solr.EdgeNGramFilterFactory" minGramSize="2" maxGramSize="30" side="front"/>
  </analyzer>
  <analyzer type="query">
    <tokenizer class="solr.LowerCaseTokenizerFactory"/>
  </analyzer>
</fieldType>

是否有一些令牌化器和过滤器组合可以完成我想要做的事情?

2 个答案:

答案 0 :(得分:1)

如果您的输入实际上是一个短语,那么使用Lucene的短语搜索将排除像情侣鼓这样的查询(除非您的输入包含“情侣鼓”作为短语)。

您可能还想查看Stupid Lucene Tricks: Exact Match, Starts With, Ends With

答案 1 :(得分:0)

我认为您需要使用Expose SpanFirst in eDismax补丁构建solr-core。