solr 分析器
Solr 分析器被指定為 schema.xml 配置文件中的<fieldType>元素的子元素(在與 solrconfig. xml 相同的 conf/ 目錄中)。
在正常使用情況下,只有類型為 solr.TextField 的字段將指定一個分析器。配置分析器的最簡單的方法是使用單個 <analyzer> 元素,它的類屬性是一個完全限定的Java 類名。命名的類必須派生自 org.apache.lucene.analysis.Analyzer。例如:
<fieldType name="nametext" class="solr.TextField"> <analyzer class="org.apache.lucene.analysis.core.WhitespaceAnalyzer"/> </fieldType>
在這種情況下,單個類 WhitespaceAnalyzer 負責分析指定文本字段的內容並發出相應的令牌。對於簡單的情況,如簡單的英文散文,這樣的單個分析器類可能就足夠了。但是通常需要對字段內容進行更復雜的分析。
即使是最復雜的分析要求,通常也可以分解為一系列離散的、相對簡單的處理步驟。正如你很快就會發現的那樣,Solr 發行版提供了大量的標記器和過濾器,覆蓋了你可能遇到的大多數場景。建立一個分析器鏈非常簡單,您可以指定一個簡單的< analyzer >元素(無類屬性),使用子元素命名標記器和過濾器的工廠類以使用,按照您希望它們運行的??順序。
例如:
<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>
請註意,org.apache.solr.analysis 包中的類可能在這裏用簡寫的 solr. 前綴來引用。
在這種情況下,<analyzer> 元素上沒有指定分析器類。相反,一系列更專業化的類連接在一起,共同作為該字段的分析器。該字段的文本被傳遞給list(solr.StandardTokenizerFactory)中的第一個項目,而從最後一個(solr.EnglishPorterFilterFactory)中出現的標記是用於對任何使用 "nametext" fieldType 的字段進行索引或查詢的術語。
字段值與索引術語:分析器的輸出會影響給定字段中索引的術語 (以及分析對這些字段的查詢時使用的術語),但不會影響字段的存儲值。例如: “Brown Cow”分成兩個索引詞 “brown” 和 “cow”,但存儲的值仍將是一個字符串: “Brown Cow”。
分析階段
分析發生在兩種情況下:在索引的時候,當一個字段被創建時,分析得到的令牌流將被添加到一個索引中,並為該字段定義一組術語(包括位置、大小等)。在查詢時間,分析正在搜索的值,並將結果的條件與存儲在字段索引中的條件進行匹配。
在很多情況下,對兩個階段都應該進行相同的分析。例如,當您想要查詢精確的字符串匹配時,這可能是不區分大小寫的。在其他情況下,您可能希望在索引期間應用略有不同的分析步驟,而不是在查詢時使用的分析步驟。
如果您為 <analyzer> 字段類型提供了一個簡單的定義(如上例所示),那麽它將用於索引和查詢。如果您想要為每個階段使用不同的分析器,則可以包含兩個與 type 屬性區分的 <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>
在這個理論性的例子中,在索引時,文本被標記化,標記被設置為小寫,任何未列出的 keepwords.txt 都被丟棄,而保留的那些將被映射到文件 syns.txt 中的同義詞規則所定義的替代值。這基本上是從一組受限制的可能值生成索引,然後將它們規範化為可能甚至不會出現在原始文本中的值。
在查詢時,唯一發生的規範化是將查詢條件轉換為小寫。在索引時發生的篩選和映射步驟不適用於查詢條件。在這個例子中,查詢必須非常精確,僅使用在索引時存儲的規範化術語
分析多期擴展
在某些類型的查詢中(即:前綴、通配符、正則表達式等等),用戶提供的輸入不是用於分析的自然語言。諸如同義詞或停用詞過濾之類的東西在這些類型的查詢中不起作用。
則可以明確定義一個要使用的 multiterm 分析器,如下例所示:
<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> <!-- No analysis at all when doing queries that involved Multi-Term expansion --> <analyzer type="multiterm"> <tokenizer class="solr.KeywordTokenizerFactory" /> </analyzer> </fieldType>
solr 分析器