【问题标题】:Solr: Searching with/without spaces in keywordsSolr:在关键字中搜索带/不带空格
【发布时间】:2020-12-04 15:19:48
【问题描述】:

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

  • 我们有一个标题为“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 =&gt; playstation 的同义词)是不可行的。

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

  • N-GRAM 过滤器和标记器
  • 模糊搜索
  • 删除空格
  • 转义空格

【问题讨论】:

    标签: web search solr


    【解决方案1】:

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

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

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

    【讨论】:

    • 感谢您的帮助!这是迄今为止我尝试过的最有效的方法,稍加微调应该可以解决我的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-07
    • 2023-03-31
    • 1970-01-01
    • 2020-05-11
    相关资源
    最近更新 更多