摘要: Solr的分析器在檢索過程中起著關鍵作用,這個分析就是提取關鍵信息的過程,就相當于把我們能看懂的句子轉化成Solr能識別的信息。Analyzer用來校驗字段的文本并生成標記流token stream. 參見原文
可以在schema.xml中找到Analyzer的身影,通常來說,在配置solr.TextField的時候,會指定Analyzer,用一個<analyzer>標簽來聲明一個Analyzer,這個屬性”class”則派生自org.apache.lucene.analysis.Analyzer。 例如:
這里的WhitespaceAnalyzer就是一種分析器,負責分析文本字段的內容并生成相應的token。有時,單一的Analyzer就足夠用了,但是,大多數情況下都是需要更復雜地分析文本。
對于那些復雜的分析需求,我們可以將其分解成一系列簡單的步驟。Solr提供了許多的tokenizers和filters來應對一些常見的情景。在實際運用中,可能常見的情況是將analyzer拆解成一個tokenizers和多個filters。
例如:
<fieldType name="nametext" class="solr.TextField"> <analyzer> <tokenizer class="solr.StandardTokenizerFactory"/> <filter class="solr.StandardFilterFactory"/> <filter class="solr.LowerCaseFilterFactory"/> <filter class="solr.StopFilterFactory"/> <filter class="solr.EnglishPorterFilterFactory"/> </analyzer></fieldType>這里的前綴solr.實際上代表的是org.apache.solr.analysis。沒有給<analyzer>指定一個”class”,而是用一系列的”class”來共同作為一個字段的分析器。文本字段將首先由StandardTokenizerFactory處理,然后生成的token傳入下一個”calss” StandardFilterFactory處理,直到最后一個EnglishPorterFilterFactory得到的token作為最終的結果,用于index或者query。
Analyzer 的結果影響的是字段的index效果,不影響其stored的值。假如分析器將文本”Those fields”分析成了”they”和”filed”,但是真正存儲的值還是”Those fields”。
一般來說,分析器在兩個階段使用:index和query。索引階段:在字段創建好后,Analyzer就將token stream添加到索引,并定義好字段的位置position和大小size等信息。查詢階段:將關鍵詞分析以后去字段的索引庫匹配。 通常,我們對這兩個階段設置相同的Analyzer。 有時候,有特殊的業務需求,我們需要設置不同的Analyzer。 例如:
<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>這個例子中,在index和query階段使用了不同的分析策略。在index階段使用更復雜的分析方式,而在query階段只簡單的處理要查詢的關鍵詞可以讓檢索更準確。
在Solr3.6以后,又加入一種新的分析鏈analyzer chains,一般定義為<analyzer type="multiterm">。 在分析某些查詢(例如含有通配符、同義詞)的時候,Solr使用了特殊的邏輯。對于MultiTermAwareComponents的分析,Solr可以處理多值(Multi-Term)的字段,但是不屬于MultiTermAwareComponents的,多值字段可能會被忽略。大多數情況下,這樣的設計時合理的,但是如果你有特殊的分析需求,需要定義一個multiterm分析器。 例如:
目前已知的MultiTermAwareComponents: ArabicNormalizationFilterFactory, ASCIIFoldingFilterFactory, CJKWidthFilterFactory, DecimalDigitFilterFactory, ElisionFilterFactory, GermanNormalizationFilterFactory, GreekLowerCaseFilterFactory, HindiNormalizationFilterFactory, IndicNormalizationFilterFactory, IrishLowerCaseFilterFactory, LowerCaseFilterFactory, LowerCaseTokenizerFactory, MappingCharFilterFactory, PersianCharFilterFactory, PersianNormalizationFilterFactory, ScandinavianFoldingFilterFactory, ScandinavianNormalizationFilterFactory, SerbianNormalizationFilterFactory, SoraniNormalizationFilterFactory, TurkishLowerCaseFilterFactory, UpperCaseFilterFactory
新聞熱點
疑難解答