假設我們有一個電子商務網上,我們的搜索引擎是基于solr的。我們索引包含了幾十萬的文檔(圖書信息)。有一天市場部門的人到你的辦公室提了需求。他們希望當用戶搜索“machine”時,返回的結果和搜索“electronics”是一樣的。你可能馬上想到在建立索引的時候將“electronics”替換成“machine”。但是這不是一個很好的方案,因為你有很多文檔包含“electronics”,并且你不修改整個數據庫。在這個時候同義詞搜索可以發揮作用了。下面就舉個簡單的例子。
怎么做1.定義文檔結構(將下面的配置添加到schema.xml的fields節點下):
<fieldname="id"type="string"indexed="true"stored="true"
required="true"/>
<fieldname="description"type="text_syn"indexed="true"
stored="true"/>
2.定義text_syn類型:
<fieldTypename="text_syn"class="solr.TextField">
<***yzertype="query">
<tokenizerclass="solr.WhitespaceTokenizerFactory"/>
<filterclass="solr.LowerCaseFilterFactory"/>
</***yzer>
<***yzertype="index">
<tokenizerclass="solr.WhitespaceTokenizerFactory"/>
<filterclass="solr.SynonymFilterFactory"synonyms="synonyms.
txt"ignoreCase="true"expand="false"/>
<filterclass="solr.LowerCaseFilterFactory"/>
</***yzer>
</fieldType>
3.定義synonyms.txt文件:
machine=>electronics
synonyms.txt文件必須和其他配置文件一樣放在conf目錄下。
4.最后,我們通過solr管理員界面檢查同義詞是否被solr所識別:
分析首先我們定義了文檔結構。文檔包含兩個字段id和description。“description”的類型是“text_syn”。“text_syn”基于“solr.TextField”類,包含兩個分析器,一個是在索引階段,另一個是在查詢階段。查詢階段分析器包含一個使用空格來切分文本的分詞器和將詞匯單元(分詞器切分后的結構)轉換為小寫的過濾器。索引階段的分析器包含和一樣的分詞器和同義詞過濾器。同義詞過濾器和其他過濾器一樣有一個factory類定義。屬性“synonyms”定義了同義詞存放的文件位置。”ignoreCase“屬性告訴solr詞匯單元和同義詞不區分大小寫。屬性“expand”設置為false,則表示一行詞語中,第一個詞語和它之后的詞語是同義詞。當設置為“true”,一行詞語中,每兩個詞語都是同義詞。
放的synonyms.txt文件告訴solr當“text_syn”類型的域里出現“machine”時,使用“electronics”替代。synonyms.txt文件中的一行就對應一份同義詞匹配規則。文件必須使用UTF-8格式。
在上面的截圖中,你會發現同義詞在索引里生效了。
等效同義詞設置讓我們回顧下上面的例子。如果市場部的人不僅僅想要用戶在搜索“machine”時返回搜索“electronics”的結果,同時希望當搜索“machine”時所有含有“electronics”的書籍在結果集里。解決方案很簡單。我們只需要在synonyms.txt文件配置如下,并且設置expand為true:
machine,electronics
正如我們前面所說,expand為true時,詞之間互為同義詞。