2014-04-22 41 views
1

我一直在苦苦思索Solr以及如何處理我們德國網站的複合詞。我們主要處理衣服和配件,所以我們的搜索字詞通常是與可穿戴物品有關的詞語。我設法對DictionaryCompoundWordTokenFilterFactory進行了微調,以便它將我們可能遇到的大多數複合搜索項分開(例如:schwarzkleid => schwarz kleid)。Solr複合詞分裂 - 如何獲得更多相關結果

但是,搜索返回不相關的結果,它返回僅包含單詞「schwarz」的項目以及僅包含單詞「kleid」的項目。因此,我不僅看到黑色禮服(黑色禮服),而且看到不同顏色的禮服和黑色物品。

實質上,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應用程序與它進行交互。

關於如何微調我的查詢以獲得相關結果的任何想法?

這裏是有問題的字段類型:使用過濾器的查詢和edismax的QueryParser

<!-- 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

你會分享您的schema.xml中的字段類型,處理那些漂亮的禮服嗎? – cheffe

+0

Alistair

+0

您能否在您的問題中添加整個fieldType?你不能在評論中張貼太多的代碼,你不應該。這是你的問題編輯':) :) – cheffe

回答

1

我已經成功地解決了這個(在一個相當哈克的方式排序)。

我在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,那麼filterqueries添加,關鍵字他們也解析爲edismax。返回的結果是'Wenz'的所有黑色禮服。

如果有人對我發佈的內容有更好的解決方案,我會非常樂意閱讀它,因爲我對Solr頗爲陌生,我認爲我的方式有點複雜,說實話。

謝謝。

+0

我現在接受我自己的答案,因爲它目前解決了我的問題,但是如果有人提出了更好的答案(因爲我確信我的方法不必要地複雜),我會接受這個答案。 – Alistair