当查询包含多个术语时,如何在整个短语上使用Solr自动完成?

Ale*_*sky 17 solr

我已经查看了大量的示例和其他问题,并且从他们那里得到了我的配置非常接近我需要的但我最后一点也不知道我有一点时间锻炼了.我正在寻找以下价值观:

solar powered
solar glass
solar globe
solar lights
solar magic
solid brass
solid copper
Run Code Online (Sandbox Code Playgroud)

我想要的是:

  1. 如果我搜索sol结果应该包括所有这些值.这有效.
  2. 如果我搜索solar我应该只获得前五个.这有效.
  3. 如果我搜索solar gl我应该只得到solar glass和solar globe.这不起作用.相反,我得到一组匹配solar和第二组匹配gl.

简而言之,我想将输入字符串视为一个整体,而不管任何空格.我收集这是通过创建一个单独的查询(与索引)分析器完成,但我无法使其工作.任何人都可以建议一个能让我得到我想要的配置吗?

我(尝试失败)尝试过:

  • 查询 "solar gl"
  • 查询 mm=100%
  • 使用KeywordTokenizerFactory定义单独的查询和索引分析器.(不知道我认为会怎么做.)
  • 定义索引分析器但不定义查询分析器.
  • 定义没有tokenizer的查询分析器.

这是我当前的架构:

<field name="suggest_phrase" type="suggest_phrase"
    indexed="true" stored="false" multiValued="false" />
Run Code Online (Sandbox Code Playgroud)

和字段定义:

<fieldType name="suggest_phrase" class="solr.TextField" positionIncrementGap="100">
    <analyzer>
        <tokenizer class="solr.KeywordTokenizerFactory" />
        <filter class="solr.LowerCaseFilterFactory" />
    </analyzer>
</fieldType>
Run Code Online (Sandbox Code Playgroud)

和配置:

<searchComponent name="suggest_phrase" class="solr.SpellCheckComponent">
    <lst name="spellchecker">
        <str name="name">suggest_phrase</str>
        <str name="classname">org.apache.solr.spelling.suggest.Suggester</str>
        <str name="lookupImpl">org.apache.solr.spelling.suggest.fst.FSTLookup</str>
        <str name="field">suggest_phrase</str>
        <str name="buildOnCommit">true</str>
    </lst>
</searchComponent>
<requestHandler class="org.apache.solr.handler.component.SearchHandler" name="/suggest_phrase">
    <lst name="defaults">
        <str name="spellcheck">true</str>
        <str name="spellcheck.dictionary">suggest_phrase</str>
        <str name="spellcheck.onlyMorePopular">true</str>
        <str name="spellcheck.count">10</str>
        <str name="spellcheck.collate">false</str>
    </lst>
    <arr name="components">
        <str>suggest_phrase</str>
    </arr>
</requestHandler>
Run Code Online (Sandbox Code Playgroud)

Ale*_*sky 17

终于找到了答案!我知道我非常接近.原来我的配置是正确的,我只需要更改我的查询.

  1. 使用 KeywordTokenizerFactory以便将字符串作为整体索引.
  2. 使用 SpellCheckComponent的请求处理程序.
  3. 我失踪的那篇文章 - 不要查询,q=<string>而是查询spellcheck.q=<string>.

给定上面提到的源字符串并对其进行查询会spellcheck.q=solar+gl得到所需的结果:

solar glass
solar globe
Run Code Online (Sandbox Code Playgroud)