Web Solr:在关键字中使用/不使用空格进行搜索

Web Solr:在关键字中使用/不使用空格进行搜索,web,search,solr,Web,Search,Solr,在关键字中引入空格时,我遇到了一个问题,例如: 我们有一款名为“Sony Playstation 4 Camera V2 PS4”的产品 (PSVR)” 搜索“playstation”或“playstation camera”将返回此产品 搜索“play station”或“play station camera”不会带回此产品(请注意 (空间) 以下是正在使用的字段类型: <fieldType name="text_en_splitting" cla

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

  • 我们有一款名为“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”和“playstation”匹配?就我的例子而言,这仅限于PlayStation,但它可以出现在任何搜索词上,例如“赛博朋克”、“赛博朋克”。因此,需要大量手动操作的解决方案,例如为
playstation=>playstation
添加同义词,是不可行的

我尝试过但没有成功的事情:

  • N-GRAM过滤器和标记器
  • 模糊搜索
  • 删除空白
  • 转义空白
您可以使用将多个令牌组合成一个令牌

<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>
。。给定
maxShingleSize=2
。如果您将最大大小增加到3,这也将为您提供
playstationcamera
作为单个令牌(在本例中)。如果你有一些术语,人们可能会多次拆分一个单词,那么这可能是必要的

如果您假设您的术语被正确地编入索引,并且这仅在查询时才有必要,那么您的索引将不会更改,也不必重新编入索引(并且大小也不会更改)

您可能必须更改周围过滤器的位置;你的词干筛选将在神秘的地方打破这一点,因为你将连接以前的词干术语。

你可以使用一个将多个标记组合成一个标记

<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>
。。给定
maxShingleSize=2
。如果您将最大大小增加到3,这也将为您提供
playstationcamera
作为单个令牌(在本例中)。如果你有一些术语,人们可能会多次拆分一个单词,那么这可能是必要的

如果您假设您的术语被正确地编入索引,并且这仅在查询时才有必要,那么您的索引将不会更改,也不必重新编入索引(并且大小也不会更改)


您可能必须更改周围过滤器的位置;您的词干筛选将在神秘的地方打破这一点,因为您将连接以前的词干术语。

谢谢您的帮助!这是迄今为止我尝试过的最有效的方法,再微调一下,它应该可以解决我的问题。谢谢你的帮助!这是迄今为止我尝试过的最有效的方法,再微调一下,它应该可以解决我的问题。