Warm tip: This article is reproduced from serverfault.com, please click

web-Solr:搜索关键字中是否包含空格

(web - Solr: Searching with/without spaces in keywords)

发布于 2020-12-04 15:19:48

我在将空格引入关键字时遇到了一个问题,例如:

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

  • 搜索“ playstation”或“ playstation摄像机”将带回此产品

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

这是正在使用的fieldType:

    <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,但它可以出现在任何搜索词上,例如“ cyberpunk”,“ cyber punk”。因此,需要大量人工工作(例如添加的同义词)的解决方案play station => playstation是不可行的。

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

  • N-GRAM过滤器和标记器
  • 模糊搜索
  • 删除空格
  • 转义空格
Questioner
Jacob-Fitzpatrick
Viewed
11
MatsLindh 2020-12-05 04:05:19

你可以使用碎片过滤器将多个令牌合并为一个。

<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提供单个令牌(在这种情况下)。如果你有一些术语,人们可能会多次拆分一个单词,那么这可能是必要的。

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

你可能需要更改过滤器的位置。你的词干过滤器会在神秘的地方打破这种局面,因为你最终会串联以前的词干。