1. 程式人生 > >solr 分析器

solr 分析器

字段 col 步驟 註意 前綴 規範 dto actor all

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 分析器