我一直在与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应用程序与它进行交互。
有关如何微调查询以获取相关结果的任何想法?
以下是有问题的fieldType:
<!-- 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>
答案 0 :(得分:1)
我设法通过使用过滤器查询和edismax查询器来解决这个问题(以一种非常黑客的方式)。
我在solrconfig.xml中添加了以下参数:
<str name="defType">edismax</str>
<str name="mm">75%</str>
然后,当搜索多个关键字时(例如:schwarzkleid wenz,其中wenz是德国品牌名称),我使用第一个关键字作为查询,之后我添加任何内容作为过滤器查询。所以我的最终查询看起来像这样:
fl=id&sort=popular+desc&indent=on&q=keywords:'schwarzkleide'+&wt=json&fq={!edismax}+keywords:'wenz'&fq=deleted:0
我的复合分离器过滤器正确分割schwarzkleide并将其解析为edismax,mm = 75%,然后添加过滤器查询,对于关键字,它们也被解析为edismax。返回的结果是来自Wenz&#39;的所有黑色连衣裙。
如果有人对我发布的内容有更好的解决方案,我会非常乐意阅读它,因为我对Solr很新,我认为我的方式有点令人费解
感谢。