我正在为电子商务网站构建产品搜索引擎。
文档来自异构来源,因此,目前我无法修复它们。
我有一些类似的文档描述:
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”令牌。
答案 0 :(得分:0)
我认为你不会对适用于你文档中所有单词的通用标记器感兴趣 - 无论你尝试哪种解决方案,你都会遇到你描述的问题类型,因为“特殊”标记将会适用于所有事物(不仅仅是你感兴趣的词语,如你的情况下的gopro),这将导致虚假的比赛。
相反,我会说你需要单独看看你的品牌,并列出他们所有不同的拼写,例如:gopro,go pro。然后使用SynonymFilterFactory - 官方文档提供了一个清晰且相关的示例:
http://wiki.apache.org/solr/AnalyzersTokenizersTokenFilters#solr.SynonymFilterFactory