Solr:搜索关键字中带/不带空格的搜索

问题描述 投票:0回答:2

我在关键字中引入空格时遇到问题,例如:

  • 我们有一款名为“Sony Playstation 4 Camera V2 PS4”的产品 (PSVR)”

  • 搜索“PlayStation”或“PlayStation Camera”即可返回该产品

  • 搜索“Play Station”或“Play Station Camera”不会找回此产品(注意 空间)

这是正在使用的字段类型:

    <fieldType name="text_en_splitting" class="solr.TextField" positionIncrementGap="100" autoGeneratePhraseQueries="true">
        <analyzer type="index">
            <tokenizer class="solr.WhitespaceTokenizerFactory"/>
            <filter class="solr.HyphenatedWordsFilterFactory"/>
            <filter class="solr.EnglishMinimalStemFilterFactory"/>
            <filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_en.txt"/>
            <filter class="solr.SynonymGraphFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
            <filter class="solr.WordDelimiterGraphFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" preserveOriginal="1"/>
            <filter class="solr.LowerCaseFilterFactory"/>
        </analyzer>
        <analyzer type="query">
            <tokenizer class="solr.WhitespaceTokenizerFactory"/>
            <filter class="solr.HyphenatedWordsFilterFactory"/>
            <filter class="solr.EnglishMinimalStemFilterFactory"/>
            <filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_en.txt"/>
            <filter class="solr.SynonymGraphFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
            <filter class="solr.WordDelimiterGraphFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" preserveOriginal="1"/>
            <filter class="solr.LowerCaseFilterFactory"/>
        </analyzer>
    </fieldType>

我该如何解决这个问题,并使“PlayStation”和“Play Station”匹配?对于我的示例来说,这仅限于 PlayStation,但它可能发生在任何搜索词上,例如“赛博朋克”、“赛博朋克”。因此,需要大量手动工作的解决方案(例如添加

play station => playstation
的同义词)是不可行的。

我尝试过但未能成功的事情:

  • N-GRAM 过滤器和分词器
  • 模糊搜索
  • 删除空格
  • 转义空白
web search solr
2个回答
0
投票

您可以使用Shingle Filter将多个令牌合并为一个。

<analyzer type="query">
    <tokenizer class="solr.WhitespaceTokenizerFactory"/>
    <filter class="solr.HyphenatedWordsFilterFactory"/>
    <filter class="solr.EnglishMinimalStemFilterFactory"/>
    <filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_en.txt"/>
    <filter class="solr.SynonymGraphFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
    <filter class="solr.WordDelimiterGraphFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" preserveOriginal="1"/>
    <filter class="solr.LowerCaseFilterFactory"/>
    <filter class="solr.ShingleFilterFactory"/>
</analyzer>

如果您假设索引时术语拼写正确,则只能在查询时应用这一点。它会为您连接令牌,有效地为您提供多个“合并”令牌:

play station camera => play, station, camera, playstation, stationcamera

..给予

maxShingleSize=2
。如果将最大大小增加到 3,这也会为您提供
playstationcamera
作为单个标记(在本例中)。如果您的术语中人们可能会多次拆分单词,那么这可能是必要的。

如果您假设您的术语已正确建立索引,并且这仅在查询时才需要,则您的索引不会更改,并且您不必重新索引(并且大小不会更改)。

您可能需要改变周围过滤器的位置;你的词干过滤器会在神秘的地方打破这个,因为你最终会连接之前的词干术语。


0
投票

我们的产品工作原理一样,去尝试一下 https://fuzzymatch.in/

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.