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

时间:2013-08-08 17:57:55

标签: solr

我已经在这里和他们看了很多例子和其他问题,我的配置非常接近我需要的但我最后一点也不知道我有一个问题。锻炼的时间。我在寻找像以下这样的价值观:

solar powered
solar glass
solar globe
solar lights
solar magic
solid brass
solid copper

我想要的是什么:

  1. 如果我搜索sol,结果应包含所有这些值。这很有效。
  2. 如果我搜索solar,我应该只获得前五个。这很有效。
  3. 如果我搜索solar gl,我应该只获得solar glasssolar globe。这不起作用。相反,我为solar获得了一组匹配,为gl获得了第二组匹配。
  4. 简而言之,我想将输入字符串视为一个整体,无论是否有任何空格。我收集这是通过创建一个单独的查询(与索引)分析器完成,但我无法使其工作。任何人都可以建议一个能让我得到我正在寻找的配置吗?

    我(尝试失败)尝试过:

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

    这是我目前的架构:

    <field name="suggest_phrase" type="suggest_phrase"
        indexed="true" stored="false" multiValued="false" />
    

    字段定义:

    <fieldType name="suggest_phrase" class="solr.TextField" positionIncrementGap="100">
        <analyzer>
            <tokenizer class="solr.KeywordTokenizerFactory" />
            <filter class="solr.LowerCaseFilterFactory" />
        </analyzer>
    </fieldType>
    

    配置:

    <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>
    

3 个答案:

答案 0 :(得分:16)

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

  1. 使用KeywordTokenizerFactory以便将字符串作为一个整体编入索引。
  2. 使用SpellCheckComponent作为请求处理程序。
  3. 我遗失的文章 - 不要使用q=<string>查询,而是spellcheck.q=<string>查询。
  4. 鉴于上面提到的源字符串和spellcheck.q=solar+gl的查询,这会得到所需的结果:

    solar glass
    solar globe
    

答案 1 :(得分:0)

我已经尝试了很多次,但我得出的结论是开箱即用。 我找到了一个解决方法:

我将数据编入索引,在每个单词之间添加特殊字符,以便它们不会被标记化。 例如:

solarzzzzzzpowered
solarzzzzzzglass
solarzzzzzzglobe

然后在撰写查询时,请确保在您键入的两个字词之间添加相同数量的字符,例如solr gl变为solarzzzzzzgl

这将达到您所要求的行为。

另一个选择是不使用autosuggestion字段并为自己创建一个自定义字段,但是你必须自己管理通配符搜索和所有索引,并且在时间和性能方面不太方便。 / p>

答案 2 :(得分:0)

您可以使用CommitteeAnalyzingInfixLookupFactory

  • AnalyzingInfixLookupFactory返回该字段的全部内容。
  • FreeTextLookupFactory返回已定义数量的令牌。

您可以在此处找到更多详细信息和其他建议算法:http://alexbenedetti.blogspot.de/2015/07/solr-you-complete-me.html

Solr配置

FreeTextLookupFactory