【问题标题】:E-Commerce product search: whitespace or not?电子商务产品搜索:空格与否?
【发布时间】:2015-01-18 13:27:16
【问题描述】:

我正在为电子商务网站构建产品搜索引擎。

文档来自不同的来源,所以目前我无法修复它们。

我有一些这样的文档描述:

GOPRO CAMERA 32
GOPRO CAMERA 35

其他一些类似的:

GO-PRO BATTERY 1000
GO-PRO BATTERY 2000

最后还有其他类似的:

GO PRO CASE SLIM BLUE
GO PRO CASE SLIM RED
GO PRO CASE SLIM GREEN

描述字段的字段类型是“text_it”:

<fieldType name="text_it" class="solr.TextField" positionIncrementGap="100">
            <analyzer type="index">
                <tokenizer class="solr.WhitespaceTokenizerFactory"/>
                <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0" splitOnCaseChange="1"/>
                <filter class="solr.ElisionFilterFactory" ignoreCase="true" articles="lang/contractions_it.txt"/>
                <filter class="solr.LowerCaseFilterFactory"/>
                <filter class="solr.ASCIIFoldingFilterFactory"/>
                <filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_it.txt" format="snowball" />
                <filter class="solr.ItalianLightStemFilterFactory"/>
            </analyzer>
            <analyzer type="query">
                <tokenizer class="solr.WhitespaceTokenizerFactory"/>
                <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0" splitOnCaseChange="1"/>
                <filter class="solr.ElisionFilterFactory" ignoreCase="true" articles="lang/contractions_it.txt"/>
                <filter class="solr.LowerCaseFilterFactory"/>
                <filter class="solr.ASCIIFoldingFilterFactory"/>
                <filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_it.txt" format="snowball" />
                <filter class="solr.ItalianLightStemFilterFactory"/>
                <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>x
            </analyzer>
        </fieldType>

显然,当我提交 GO PRO 之类的查询时,我会从上面列出的三个组中的每一个中找到结果。

当我搜索 GOPRO 时,我只找到前两组的结果。我从分析表中知道,其原因是被索引的标记是:

GOPRO => GOPRO GO-PRO => 去,去,亲 GO PRO => 去,亲

对于 gopro 查询(不带空格)也与 GO PRO 产品(带空格)匹配,您有什么建议?

更新

我尝试在 LowerCaseFilter 之后将其添加到我的查询分析器中:

<filter class="solr.EdgeNGramFilterFactory" minGramSize="1" maxGramSize="50" side="front" />

...对于我的用例,它可以工作:查询“gopro”生成 g,go,gop,gopr,gopro 令牌,就在这里。好的,但是现在所有其他查询结果都被破坏了! 查询“essential”的第一个结果是“dvd player es-124”,因为正在生成“es”令牌。

【问题讨论】:

    标签: solr lucene search-engine information-retrieval


    【解决方案1】:

    我认为使用适用于文档中所有单词的通用分词器不会让您感兴趣 - 无论您尝试哪种解决方案,您都会遇到您描述的问题类型,因为“特殊”分词器会适用于所有内容(不仅仅是您感兴趣的单词,例如 gopro 在您的案例中),这将导致虚假匹配。

    相反,我会说您需要单独查看您的品牌,并列出所有不同的拼写方式,例如:gopro、go pro。然后使用 SynonymFilterFactory - 官方文档给出了一个清晰且相关的示例:

    http://wiki.apache.org/solr/AnalyzersTokenizersTokenFilters#solr.SynonymFilterFactory

    【讨论】:

    • 制作“带状疱疹”怎么样? "go pro camera" => "gopro", "procamera" + original ?
    • 同样的问题;您只想对一个非常具体的单词列表(品牌名称 - 例如,您不想要一个通用的标记器也可以使用“慢动作相机”)执行此操作,因此您必须去一个手工策划的列表的同义词。我认为对于您的示例,如果您需要识别搜索 procamera,则同义词列表中需要两行,一行用于 gopro,另一行用于 gopro camera。
    • 你最后做了什么?如果它有用,请接受答案:)
    • 确实是这样,但我最终尝试了带状疱疹令牌过滤器
    猜你喜欢
    • 2017-03-08
    • 1970-01-01
    • 2011-10-07
    • 2012-05-06
    • 1970-01-01
    • 2017-12-16
    • 2019-02-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多