【问题标题】:Solr compound word splitting - how to get more relevant resultsSolr 复合词拆分 - 如何获得更多相关结果
【发布时间】: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 中的?这将很快被一个模组删除,所以如果你能帮助他们解决他们的问题,我相信他们会很感激的!

标签: php solr relevance


【解决方案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,并将其解析为 mm=75% 的 edismax,然后添加过滤器查询,对于关键字,它们也被解析为 edismax。返回的结果是来自 'Wenz' 的所有黑色连衣裙。

如果有人对我发布的内容有更好的解决方案,我将非常乐意阅读它,因为我对 Solr 还很陌生,而且老实说,我认为我的方式有点令人费解。

谢谢。

【讨论】:

  • 我现在接受我自己的答案,因为它目前解决了我的问题,但如果其他人提出更好的答案(因为我确信我的方法不必要地复杂),我会接受一。
猜你喜欢
  • 2012-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多