17

我在这里查看了大量示例和其他问题,从他们那里,我的配置非常接近我需要的,但我错过了最后一点,我正在努力锻炼. 我正在搜索以下值:

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

我想要的是:

  1. 如果我搜索sol结果应该包括所有这些值。这行得通。
  2. 如果我搜索,solar我应该只得到前五个。这行得通。
  3. 如果我搜索,solar gl我应该只得到solar glassand solar globe。这不起作用。相反,我得到了一组匹配项solar和另一组匹配项gl

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

我(未成功)尝试过:

  • 查询"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>
4

3 回答 3

17

终于找到答案了!我知道我真的很亲近。事实证明我上面的配置是正确的,我只需要更改我的查询。

  1. 使用KeywordTokenizerFactory以便将字符串作为一个整体编入索引。
  2. 用于SpellCheckComponent请求处理程序。
  3. 我错过的那块——不要用q=<string>但用. 查询spellcheck.q=<string>

给定上面提到的源字符串和对此的查询会spellcheck.q=solar+gl产生所需的结果:

solar glass
solar globe
于 2013-09-19T19:42:57.500 回答
1

您可以使用AnalyzingInfixLookupFactoryFreeTextLookupFactory

  • AnalyzingInfixLookupFactory 返回字段的全部内容。
  • FreeTextLookupFactory 返回定义数量的标记。

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

Solr 配置

<lst name="suggester">
  <str name="name">AnalyzingInfixSuggester</str>
  <str name="lookupImpl">AnalyzingInfixLookupFactory</str> 
  <str name="dictionaryImpl">DocumentDictionaryFactory</str>
  <str name="field">title</str>
  <str name="weightField">price</str>
  <str name="suggestAnalyzerFieldType">text_en</str>
</lst>

<lst name="suggester">
  <str name="name">FreeTextSuggester</str>
  <str name="lookupImpl">FreeTextLookupFactory</str> 
  <str name="dictionaryImpl">DocumentDictionaryFactory</str>
  <str name="field">title</str>
  <str name="ngrams">3</str>
  <str name="separator"> </str>
  <str name="suggestFreeTextAnalyzerFieldType">text_general</str>
</lst>
于 2017-09-10T08:38:55.477 回答
0

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

我对数据进行了索引,在每个单词之间添加了特殊的字符,这样它们就不会被标记化。例如:

solarzzzzzzpowered
solarzzzzzzglass
solarzzzzzzglobe

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

这将实现您所要求的行为。

另一种选择是不使用自动建议字段并为自己创建一个自定义字段,但是您将不得不自己管理通配符搜索和所有索引,并且在时间和性能方面不太方便。

于 2013-08-09T08:49:11.747 回答