Solr分析器概述

2018-11-13 16:52 更新

分析器檢查字段的文本并生成令牌流。

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 負(fù)責(zé)分析指定文本字段的內(nèi)容并發(fā)出相應(yīng)的令牌。對于簡單的情況,如簡單的英文散文,這樣的單個分析器類可能就足夠了。但是通常需要對字段內(nèi)容進(jìn)行更復(fù)雜的分析。

即使是最復(fù)雜的分析要求,通常也可以分解為一系列離散的、相對簡單的處理步驟。正如你很快就會發(fā)現(xiàn)的那樣,Solr 發(fā)行版提供了大量的標(biāo)記器和過濾器,覆蓋了你可能遇到的大多數(shù)場景。建立一個分析器鏈非常簡單,您可以指定一個簡單的< analyzer >元素(無類屬性),使用子元素命名標(biāo)記器和過濾器的工廠類以使用,按照您希望它們運(yùn)行的??順序。

例如:

<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> 元素上沒有指定分析器類。相反,一系列更專業(yè)化的類連接在一起,共同作為該字段的分析器。該字段的文本被傳遞給list(solr.StandardTokenizerFactory)中的第一個項(xiàng)目,而從最后一個(solr.EnglishPorterFilterFactory)中出現(xiàn)的標(biāo)記是用于對任何使用 "nametext" fieldType 的字段進(jìn)行索引或查詢的術(shù)語。

字段值與索引術(shù)語:分析器的輸出會影響給定字段中索引的術(shù)語 (以及分析對這些字段的查詢時使用的術(shù)語),但不會影響字段的存儲值。例如: “Brown Cow”分成兩個索引詞 “brown” 和 “cow”,但存儲的值仍將是一個字符串: “Brown Cow”。

分析階段

分析發(fā)生在兩種情況下:在索引的時候,當(dāng)一個字段被創(chuàng)建時,分析得到的令牌流將被添加到一個索引中,并為該字段定義一組術(shù)語(包括位置、大小等)。在查詢時間,分析正在搜索的值,并將結(jié)果的條件與存儲在字段索引中的條件進(jìn)行匹配。

在很多情況下,對兩個階段都應(yīng)該進(jìn)行相同的分析。例如,當(dāng)您想要查詢精確的字符串匹配時,這可能是不區(qū)分大小寫的。在其他情況下,您可能希望在索引期間應(yīng)用略有不同的分析步驟,而不是在查詢時使用的分析步驟。

如果您為 <analyzer> 字段類型提供了一個簡單的定義(如上例所示),那么它將用于索引和查詢。如果您想要為每個階段使用不同的分析器,則可以包含兩個與 type 屬性區(qū)分的 <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>

在這個理論性的例子中,在索引時,文本被標(biāo)記化,標(biāo)記被設(shè)置為小寫,任何未列出的 keepwords.txt 都被丟棄,而保留的那些將被映射到文件 syns.txt 中的同義詞規(guī)則所定義的替代值。這基本上是從一組受限制的可能值生成索引,然后將它們規(guī)范化為可能甚至不會出現(xiàn)在原始文本中的值。

在查詢時,唯一發(fā)生的規(guī)范化是將查詢條件轉(zhuǎn)換為小寫。在索引時發(fā)生的篩選和映射步驟不適用于查詢條件。在這個例子中,查詢必須非常精確,僅使用在索引時存儲的規(guī)范化術(shù)語。

分析多期擴(kuò)展

在某些類型的查詢中(即:前綴、通配符、正則表達(dá)式等等),用戶提供的輸入不是用于分析的自然語言。諸如同義詞或停用詞過濾之類的東西在這些類型的查詢中不起作用。

可以在這些類型的查詢((如 Lowercasing 或 Normalizing Factories))中工作的分析工廠被稱為 MultiTermAwareComponents。當(dāng) Solr 需要對導(dǎo)致 Multi-Term 擴(kuò)展的查詢執(zhí)行分析時,只使用在 query 分析器中使用的 MultiTermAwareComponents,不跳過 Multi-Term 的 Factory 將被跳過。

對于大多數(shù)使用情況,這提供了最好的行為,但是如果希望絕對控制對這些類型查詢執(zhí)行的分析,則可以明確定義一個要使用的 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>
以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號