【发布时间】:2014-06-06 10:25:25
【问题描述】:
我一直在为 Solr 以及如何为我们的德语网站处理复合词而苦苦挣扎。我们主要处理衣服和配饰,所以我们的搜索词通常是与可穿戴物品相关的词。我已经设法微调DictionaryCompoundWordTokenFilterFactory,以便它拆分我们可能遇到的大多数复合搜索词(例如:schwarzkleid => schwarz kleid)。
但是,搜索返回不相关的结果,它返回仅包含单词“schwarz”的项目以及仅包含单词:“kleid”的项目。因此,我不仅看到了黑色连衣裙(schwarzkleid = 黑色连衣裙),还看到了不同颜色的连衣裙以及黑色的物品。
本质上,Solr 对拆分标记执行 OR 并返回包含任一关键字的任何项目。
我的完整查询是这样的:q=keywords:schwarzkleid AND deleted:0(其中 0 表示该产品尚未售罄)。这个查询的调试是这样的:
"debug": {
"rawquerystring": "keywords:schwarzkleid AND deleted:0",
"querystring": "keywords:schwarzkleid AND deleted:0",
"parsedquery": "+((keywords:schwarzkleid keywords:schwarz keywords:kleid)/no_coord) +deleted:0",
"parsedquery_toString": "+(keywords:schwarzkleid keywords:schwarz keywords:kleid) +deleted:`\b\u0000\u0000\u0000\u0000",
这将返回总共 24000+ 个结果,而如果我直接搜索 keywords:schwarz AND keywords:kleid,我将获得 ~10000 个结果,这正是我想要的。我正在使用 Solr 4.7 和 Solr PHP 库通过我的 Web 应用程序与之交互。
关于如何微调我的查询以仅获得相关结果的任何想法?
这里是有问题的字段类型:
<!-- German -->
<fieldType name="text_de" class="solr.TextField" positionIncrementGap="100" autoGeneratePhraseQueries="true">
<analyzer type="index">
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_de.txt" format="snowball" enablePositionIncrements="true"/>
<filter class="solr.GermanNormalizationFilterFactory"/>
<filter class="org.apache.lucene.analysis.de.compounds.GermanCompoundSplitterTokenFilterFactory" compileDict="true" dataDir="/home/ali/Downloads/solr-4.7.0/example/solr/findemode-dev/conf/wordlist/"/>
<filter class="solr.SnowballPorterFilterFactory" language="German2"/>
<tokenizer class="solr.StandardTokenizerFactory"/>
</analyzer>
<analyzer type="query">
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_de.txt" format="snowball" enablePositionIncrements="true"/>
<filter class="solr.GermanNormalizationFilterFactory"/>
<filter class="org.apache.lucene.analysis.de.compounds.GermanCompoundSplitterTokenFilterFactory" compileDict="false" dataDir="/home/ali/Downloads/solr-4.7.0/example/solr/findemode-dev/conf/wordlist/"/>
<filter class="solr.SnowballPorterFilterFactory" language="German2"/>
<tokenizer class="solr.StandardTokenizerFactory"/>
</analyzer>
</fieldType>
【问题讨论】:
-
你能分享你的 schema.xml 中处理那些漂亮衣服的字段类型吗?
-
-
能否在您的问题中添加整个 fieldType?您不能在评论中发布那么多代码,也不应该这样做。这就是您问题下的
edit的好处:) -
抱歉,编辑了我的问题以反映完整的 fieldType。
-
一位用户asking this question 在下面问:“您是如何设法将“org.apache.lucene.analysis.de.compounds.GermanCompoundSplitterTokenFilterFactory”包含到您的 schema.xml 中的?这将很快被一个模组删除,所以如果你能帮助他们解决他们的问题,我相信他们会很感激的!