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

时间:2015-01-18 13:27:17

标签: solr lucene search-engine information-retrieval

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

文档来自异构来源,因此,目前我无法修复它们。

我有一些类似的文档描述:

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 =&gt; GOPRO GO-PRO =&gt; gopro,go,pro GO PRO =&gt;去吧,亲

你建议我将 gopro 查询(没有空格)与GO PRO产品(带空格)相匹配,你有什么建议?

更新

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

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

...并且它的作用,对于我的用例:查询“gopro”生成g,go,gop,gopr,gopro令牌,这里是。好的,但现在所有其他查询结果都毁了! 查询“必要”的第一个结果是“dvd player es-124”,因为生成了“es”令牌。

1 个答案:

答案 0 :(得分:0)

我认为你不会对适用于你文档中所有单词的通用标记器感兴趣 - 无论你尝试哪种解决方案,你都会遇到你描述的问题类型,因为“特殊”标记将会适用于所有事物(不仅仅是你感兴趣的词语,如你的情况下的gopro),这将导致虚假的比赛。

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

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