Solr短语查询通配符



我一直在与Solr v4.10.2与通配符的PhraseQuery抗争!我的字段定义如下:

<!-- 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";
  • 今天我不能改变我的标记器为:"StandardTokenizerFactory"(在这种情况下会工作),因为我需要搜索电子邮件,冒号的单词,例如;
  • 我尝试了:"KeywordTokenizer",但我有与上面相同的行为;
  • 我读到:"ShingleFilterFactory",但我的索引将是巨大的,因为我需要索引全文(超过30000个字符);

你能帮我了解发生了什么,如果有办法使一个通配符的PhraseQuery工作,我的选择是什么?

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

我用下面的配置找到了解决问题的方法:

<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 +解析器# OtherParsers-ComplexPhraseQueryParser

最新更新