2014-01-13 27 views
0

我有一個包含歌曲的名字和藝術家的名字,當有人搜索「madona」的音樂目錄我想他們找到麥當娜的歌曲,無所謂如果他們只用一個「n」來寫「madona」。SOLR - 如何得到麥當娜的結果如果查詢是Madona

帶我讀到的同義詞,然後我把一個文件的同義詞列表,像這樣:

madona => madonna 
metalica => metallica 

這schema.xml中:

<filter class="solr.SynonymFilterFactory" synonyms="lang/synonyms.txt" ignoreCase="true" expand="true"/> 

但目前還沒有結果。

我該怎麼辦?請幫忙!

+0

使用SynonymFilterFactory只在索引時間,無法查詢的時間。此更改後,請重新索引您的數據以顯示在搜索結果中。看到這個問題: http://stackoverflow.com/questions/9998480/how-to-use-synonymfilterfactory-in-solr – Meet

回答

0

同義詞是一種可能的方法,但當您想在運行時替換或附加其他查詢詞時,它是最合適的。例如,如果有人正在搜索傢俱並輸入關鍵字「沙發」,那麼在邏輯上可能會包含「沙發」的同義詞。這是同義詞的預期用法。

在處理拼寫錯誤和/或拼寫錯誤時,通常通過詞幹處理這些情況。詞幹需要一個詞(記號),並將其縮減爲一個經常縮寫的單詞核心表示。不同的分析器可以使用各種令牌干擾源來將文本減少爲可以產生更有效搜索的內容,例如涉及同一文檔的「madonna」和「madona」。

詞幹回溯到語言分析領域,所以它不是一個快速命中的學習週期。也就是說,您可以通過管理工具來試用Solr中包含的不同分析儀。根據您使用的Solr版本,菜單包含「分析」選項。此頁面允許您選擇任何底層Solr字段類型(以及您自己的模式中的任何字段類型),爲索引和查詢插入一些文本,並查看分析器生成的內容。您可能無法準確找到您要查找的內容,但Solr的可配置性允許您以不同的組合連接這些設備。一旦你有了這樣的背景,你可以構建這些來滿足你的特定用例。

1

我能想到這些替代品:

  1. 同義詞已經提到的,不足之處是,你需要知道他們提前
  2. 語音分析儀,there are several options here。我認爲這將最適合藝術家的名字和這樣的,是錯誤的拼寫是比較常見的
  3. 使用模糊搜索,see the doc應太
0

非常感謝大家!

我發現了一些關於同義詞的有趣的事情:該列表應該包括令牌不是單詞,所以即使使用同義詞,也沒有預期的結果,因爲麥當娜的索引令牌是Madonn,而爲麥當娜查詢生成的令牌是madon,所以在同義詞列表中將包括:

madon => madonn 

只有這樣才能得到結果。

至於使用另一個分析器,它是目前使用::

<!-- Portuguese --> 
<fieldType name="text_pt" class="solr.TextField" positionIncrementGap="100"> 
    <analyzer type="index"> 
    <tokenizer class="solr.StandardTokenizerFactory"/> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords_pt.txt" format="snowball" enablePositionIncrements="true"/> 
    <filter class="solr.SnowballPorterFilterFactory" language="Portuguese"/> 
    <filter class="solr.SynonymFilterFactory" synonyms="synonyms_pt.txt" ignoreCase="true" expand="true"/> 
    </analyzer> 
    <analyzer type="query"> 
    <tokenizer class="solr.StandardTokenizerFactory"/> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords_pt.txt" format="snowball" enablePositionIncrements="true"/> 
    <filter class="solr.SnowballPorterFilterFactory" language="Portuguese"/> 
    <filter class="solr.SynonymFilterFactory" synonyms="synonyms_pt.txt" ignoreCase="true" expand="true"/> 
    </analyzer> 
</fieldType> 

enter image description here