首先,不知道大家在前面的例子中沒有試着搜索文本串,就是在第二節,我們添加了很多文檔。如果字段值是一個文本。你如果只搜索這個字段的某個單詞,是不是發現搜不到?
這就是因爲我們沒有配置Analyzer,因此在搜索的時候會“全匹配”。可以從直觀感覺上理解爲SQL的 like和= 的區別。
通過前面這段引文,我們就能知道:Analyzer就是分析我們的文本的。
一般來說:solr.TextField類型的字段才需要分析器。
最簡單的配置分析器的如下:
<fieldType name="nametext" class="solr.TextField">
<analyzer class="org.apache.lucene.analysis.WhitespaceAnalyzer"/>
</fieldType>
其實分析器(Analyzer)還可以包括一個分詞器(Tokenizer)和多個過濾器(filter),這2個東西,是爲了實現更復雜的場景,我們後續再講。
分析器一般出現在2個環境:建索引(index)和查詢(query),大多數情況下這2個場景的分析過程都是一樣,也就是說用的是相同的分析器。但是,你仍然可以爲2個不同的階段指字不同的分析器:
<fieldType name="nametext" class="solr.TextField">
<analyzer type="index">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.KeepWordFilterFactory" words="keepwords.txt"/>
<filter class="solr.SynonymFilterFactory" synonyms="syns.txt"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldType>
同過 type來指階段。
Tokenizer:
分詞器,從字面意思都可以理解,就是將句子拆成一個個的詞(或者是詞組),比如A B C D,可以拆成A,B,C,D4個單獨的單詞,也有可能拆成AB,CD 或者其它。。。。 這個就看你分詞規則了。
使用如下:
<fieldType name="text" class="solr.TextField">
<analyzer>
<tokenizer class="solr.StandardTokenizerFactory"/>
</analyzer>
</fieldType>
值 得注意的是:這裏配的class是Factory,而不是真正的分詞器,他是通過工廠類來創建分詞器實例的。所有的工廠類,必須實現org.apache.solr.analysis.TokenizerFactory
工廠的產出物,也必須派生至:org.apache.lucene.analysis.TokenStream
Filter:
就是經過Tokenizer分詞之後,再再行的繼續處理,比如全轉成小寫,時態處理, 去掉語氣詞等。。。