0

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

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

  • 夫妻
  • 情侣蓝
  • 蓝色的情侣
  • 蓝鼓
  • 蓝色德鲁

它不应该匹配“一对鼓”的查询。

我尝试使用“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' 或 'drums' 的查询。

<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>

是否有标记器和过滤器的组合可以完成我想要做的事情?

4

2 回答 2

1

如果您的输入实际上是一个词组,那么使用 Lucene 的词组搜索将排除像 Coupledrums 之类的查询除非您的输入包括“coupledrums”作为词组)。

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

于 2013-01-14T21:20:16.677 回答
0

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

于 2016-10-19T13:44:37.903 回答