我正在尝试创建一个索引,允许我根据单个词和部分短语的“开头”进行查询。
例如,给定文本“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'或'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>
是否有一些令牌化器和过滤器组合可以完成我想要做的事情?
答案 0 :(得分:1)
如果您的输入实际上是一个短语,那么使用Lucene的短语搜索将排除像情侣鼓这样的查询(除非您的输入包含“情侣鼓”作为短语)。
您可能还想查看Stupid Lucene Tricks: Exact Match, Starts With, Ends With。
答案 1 :(得分:0)
我认为您需要使用Expose SpanFirst in eDismax补丁构建solr-core。