【发布时间】:2013-01-14 20:59:33
【问题描述】:
我正在尝试创建一个索引,该索引允许我基于“开始于”对单个单词和部分短语进行查询。
例如,给定文本“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' 的查询返回带有“情侣”或“鼓”的结果。
<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>
是否有分词器和过滤器的组合可以完成我想要做的事情?
【问题讨论】:
-
我刚刚发现使用 text_general fieldType,我可以对单个单词进行通配符,对多个单词进行短语查询。现在这可能是“短语查询中的通配符”问题。我正在为 Solr 4.0 研究这个。相关:stackoverflow.com/questions/1088558/lucene-wildcards-in-phrases
-
你能在这里发表你的答案吗:stackoverflow.com/questions/20142716/…我几乎同样的问题,提前谢谢
-
@rodi 听起来我们确实遇到了类似的问题,但不幸的是我从未找到可接受的解决方案。我们最终更改了要求以匹配 Solr 的可能性。 :(
-
现在我决定拆分短语并将其与“?”连接,所以“我的长短语是verycomplexxxxx”-> text:my?long?phrase?is?veryco* 并且它匹配.你怎么看?