电子商务产品搜索:空格与否?

E-Commerce product search: whitespace or not?

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

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

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

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 => 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" 令牌。

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

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

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