与通配符的Solr PhraseQuery

时间:2016-06-27 19:41:20

标签: solr lucene wildcard

我一直在与 Solr v4.10.2 一起使用 PhraseQuery with wildcard 进行挣扎! 我的字段定义如下:

<!-- Search field -->
<field name="title" type="text_pt_en" indexed="true" stored="true" />

<!-- Field definition -->
<fieldType name="text_pt_en" class="solr.TextField" positionIncrementGap="100">
    <analyzer type="index">
        <charFilter class="solr.HTMLStripCharFilterFactory" />

        <filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_pt.txt" format="snowball" enablePositionIncrements="true" />

        <tokenizer class="solr.WhitespaceTokenizerFactory" />
        <!-- <tokenizer class="solr.KeywordTokenizerFactory" /> -->

        <filter class="solr.LowerCaseFilterFactory"/>
        <filter class="solr.ASCIIFoldingFilterFactory" preserveOriginal="false" />
        <filter class="solr.ReversedWildcardFilterFactory" />
    </analyzer>

    <analyzer type="query">
        <charFilter class="solr.HTMLStripCharFilterFactory"/>
        <filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_pt.txt" format="snowball" enablePositionIncrements="true" />

        <tokenizer class="solr.WhitespaceTokenizerFactory" />
        <!-- <tokenizer class="solr.KeywordTokenizerFactory" /> -->

        <filter class="solr.LowerCaseFilterFactory" />
        <filter class="solr.ASCIIFoldingFilterFactory" preserveOriginal="false" />
    </analyzer>
</fieldType>

假设我在上面的字段索引中添加了以下值(葡萄牙语):

Teste de texto; Será quebrado em espaços em branco!

根据分析器链添加到索引的值将是(来自Solr“Analysis”):

etset teste ;otxet texto; odarbeuq quebrado socapse espacos !ocnarb branco!

今天,我可以搜索,例如:

title:teste
title:(teste texto)
title:(teste de texto)
title:("teste de texto;") // (PhraseQuery) matches because of ";" in the end of the string

但是,如果我尝试搜索(PhraseQuery):

title:("teste de texto")
    "parsedquery": "PhraseQuery(title:\"teste ? texto\")"

title:("teste de texto*")
    "parsedquery": "PhraseQuery(title:\"teste ? texto*\")"

不会返回任何结果。

我已经阅读过有关此问题的可能解决方案,但它们似乎都没有效果:

  • MultitermQueryAnalysis
  • 复杂词组查询解析器

而我无法理解为什么最后使用通配符的查询:“*”不起作用,不会返回任何结果。

一些意见:

  • 我无法控制搜索中输入的内容,它是由应用程序的用户输入的,但我希望它像“文件列表”一样工作,就像一个简单的“glob”;
  • 今天我无法将我的tokenizer更改为:“StandardTokenizerFactory”(在这种情况下可以使用),因为我需要搜索电子邮件,例如冒号的单词;
  • 我尝试了:“KeywordTokenizer”,但我的行为与上面相同;
  • 我读到:“ShingleFilterFactory”,但我的索引会很大,因为我需要索引全文(超过30000个字符);

如果有办法用通配符制作PhraseQuery并有什么选择,请你帮我理解会发生什么?

如果您需要进一步的信息,请告诉我,非常感谢您的关注和帮助!

1 个答案:

答案 0 :(得分:0)

我通过以下配置找到了解决问题的方法:

<analyzer type="index">
    <charFilter class="solr.HTMLStripCharFilterFactory" />

    <tokenizer class="solr.WhitespaceTokenizerFactory" />

    <filter class="solr.LowerCaseFilterFactory"/>
    <filter class="solr.ASCIIFoldingFilterFactory" preserveOriginal="false" />
    <filter class="solr.ReversedWildcardFilterFactory" />
</analyzer>

使用复杂词组查询解析器进行搜索,如下所示,现在返回所需的文档:

{!complexphrase df=title}"teste de texto*"

我认为我最后一个字段设置的问题是StopFilterFactory,因为复杂短语查询解析器文档指出:“建议不要使用此查询解析器禁用停用词。” [1]

我已经完成了一些测试,到目前为止,这个设置符合我的需求(查询)。

[1] https://cwiki.apache.org/confluence/display/solr/Other+Parsers#OtherParsers-ComplexPhraseQueryParser