搜索引擎(Solr-模式詳解)

Schema介紹

Schema 是什麼?html

問題1:在lucene中咱們要對文檔字段進行索引存儲,須要如何作?web

問題2:如今咱們使用Solr搜索服務平臺了,不須要編碼了,還須要定義如何索引存儲字段嗎?apache

須要一種機制來定義、存儲這些字段的索引信息,讓solr運行時知道各個內核/集合的字段定義信息,這就是schema。app

Schema:模式,是集合/內核中字段的定義,讓solr知道集合/內核包含哪些字段、字段的數據類型、字段該索引存儲。less

Schema 的定義方式ide

Solr中提供了兩種方式來配置schema,二者只能選其一學習

1.默認方式,經過Schema API 來實時配置,模式信息存儲在 內核目錄的conf/managed-schema文件中。
2.傳統的手工編輯conf/schema.xml的方式,編輯完後需重載集合/內核纔會生效。測試

Schema兩種配置方式切換ui

schema.xml 到 managed schema編碼

只需將 solrconfig.xml中的<schemaFactory class =「ClassicIndexSchemaFactory」/>  去掉,或改成ManagedIndexSchemaFactory Solr重啓時,它發現存儲schema.xml 但不存儲在 managed-schema,它會備份schema.xml,而後改寫schema.xml 爲 managed-schema。此後就能夠經過Schema API 管理schema了。

managed schema 到 schema.xml

將managed-schema 重命名爲 schema.xml
將solrconfig.xml 中schemaFactory  的ManagedIndexSchemaFactory去掉(若是存在)
增長<schemaFactory class =「ClassicIndexSchemaFactory」/> 

Schemaless mode

Solr還支持無模式方式,solr會猜想該如何索引字段,不可用在生成環境下。

查看 managed-schema文件,瞭解它的構成

<?xml version="1.0" encoding="UTF-8" ?>
<schema version="1.6">
	<field .../>  
	<dynamicField .../>
	<uniqueKey>id</uniqueKey>
	<copyField .../>
	<fieldType ...>
		<analyzer type="index">
			<tokenizer .../>
			<filter ... />
		</analyzer>
		<analyzer type="query">
			<tokenizer.../>
			<filter ... />
		</analyzer>
	</fieldType>
</schema>

字段定義詳解

字段定義示例

<field name="name" type="text_general" indexed="true" stored="true"/> 
<field name="includes" type="text_general" indexed="true" stored="true" termVectors="true" termPositions="true" termOffsets="true" />

好熟悉的感受!
問1:lucene中字段包含哪幾個屬性?
疑惑:這裏的type和lucene中字段的type是一回事嗎?

字段屬性說明

name:字段名,必需。字段名能夠由字母、數字、下劃線構成,不能以數字開頭。如下劃線開頭和結尾的名字爲保留字段名,如 _version_

type:字段的fieldType名,必需。爲 FieldType定義的name 屬性值。

default:默認值,若是提交的文檔中沒有該字段的值,則自動會爲文檔添加這個默認值。非必需。

字段中用於覆蓋fieldType的可選屬性說明

FieldType字段類型

定義在索引時該如何分詞、索引、存儲字段,在查詢時該如何對查詢串分詞

<fieldType name="managed_en" class="solr.TextField" positionIncrementGap="100">
  <analyzer type="index">
	<tokenizer class="solr.StandardTokenizerFactory"/>
	<filter class="solr.ManagedStopFilterFactory" managed="english" />
	<filter class="solr.ManagedSynonymGraphFilterFactory" managed="english" />
	<filter class="solr.FlattenGraphFilterFactory"/>
  </analyzer>
  <analyzer type="query">
	<tokenizer class="solr.StandardTokenizerFactory"/>
	<filter class="solr.ManagedStopFilterFactory" managed="english" />
	<filter class="solr.ManagedSynonymGraphFilterFactory" managed="english" />
  </analyzer>
</fieldType>

FieldType 的屬性

Solr中提供的 FieldType 類,在 org.apache.solr.schema 包下

http://lucene.apache.org/solr/guide/7_3/field-types-included-with-solr.html

FieldType 的 Analyzer

對於 solr.TextField or solr.SortableTextField 字段類型,須要爲其定義分析器。

<fieldType name="nametext" class="solr.TextField">
  <analyzer class="org.apache.lucene.analysis.core.WhitespaceAnalyzer"/>
</fieldType>

能夠直接經過class屬性指定分析器類,必須繼承

org.apache.lucene.analysis.Analyzer 。

也可靈活地組合分詞器、過濾器:

<fieldType name="nametext" class="solr.TextField">
  <analyzer>
    <tokenizer class="solr.StandardTokenizerFactory"/>
    <filter class="solr.StandardFilterFactory"/>
    <filter class="solr.LowerCaseFilterFactory"/>
    <filter class="solr.StopFilterFactory"/>
  </analyzer>
</fieldType>

org.apache.solr.analysis 包下的類能夠簡寫爲 solr.xxx

若是該類型字段索引、查詢時須要使用不一樣的分析器,則需區分配置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>

Solr中提供的tokenizer: http://lucene.apache.org/solr/guide/7_3/tokenizers.html

Solr中提供的 fiter: http://lucene.apache.org/solr/guide/7_3/filter-descriptions.html

經常使用的Filter

Stop Filter   停用詞過濾器

<analyzer>
  <tokenizer class="solr.StandardTokenizerFactory"/>
  <filter class="solr.StopFilterFactory" words="stopwords.txt"/>
</analyzer>

words屬性指定停用詞文件的絕對路徑或相對 conf/目錄的相對路徑

停用詞定義語法:一行一個

Synonym Graph Filter   同義詞過濾器

<analyzer type="index">
  <tokenizer class="solr.StandardTokenizerFactory"/>
  <filter class="solr.SynonymGraphFilterFactory" synonyms="mysynonyms.txt"/>
  <filter class="solr.FlattenGraphFilterFactory"/> <!-- required on index analyzers after graph filters -->
</analyzer>
<analyzer type="query">
  <tokenizer class="solr.StandardTokenizerFactory"/>
  <filter class="solr.SynonymGraphFilterFactory" synonyms="mysynonyms.txt"/>
</analyzer>

同義詞定義語法

couch,sofa,divan
teh => the
huge,ginormous,humungous => large
small => tiny,teeny,weeny

一類一行, =>表示標準化爲後面的

Filter 練習1

一、往停用詞文件中添加
    hello
    like
二、往同義詞文件中添加

couch,sofa,divan
teh => the
huge,ginormous,humungous => large
small => tiny,teeny,weeny

三、用下面的短語在web管理控制檯進行測試
      停用詞測試:      Hello world, do you like apple
      同義詞測試: teh small couch

集成IKAnalyzer 中文分詞器

一、在原來學習lucene集成IKAnalyzer的基礎上,爲IkAnalyzer實現一個TokenizerFactory(繼承它),接收useSmart參數。

二、將這三個類打成jar,如  IKAnalyzer-lucene7.3.jar

三、將這個jar和 IKAnalyzer的jar 拷貝到web應用的lib目錄下

四、將三個配置文件拷貝到應用的classes目錄下

五、在schema中定義一個FieldType,使用IKAnalyzer適配類

<fieldType name=「zh_CN _text" class="solr.TextField">
    <analyzer>
        <tokenizer class="com.dongnao.lucene.demo.analizer.ik.IKTokenizer4Lucene7Factory" useSmart="true" /> 
    </analyzer>
</fieldType>

FieldType 練習2

一、定義一個FieldType,索引的分詞器用IKAnalyzer,查詢的分詞器用IKAnaylzer + 同義詞Filter。
二、配置同義詞:

相同,類似,相近
電腦,筆記本電腦=>計算機

三、測試分詞:
      他的電腦和她的筆記本電腦很類似

CopyField    複製字段

複製字段容許將一個或多個字段的值填充到一個字段中。它的用途有兩種:
一、將多個字段內容填充到一個字段,來進行搜索
二、對同一個字段內容進行不一樣的分詞過濾,建立一個新的可搜索字段
定義方式:
一、先定義一個普通字段

<field name="cc_all" type="zh_CN_text" indexed="true" stored="false" multiValued="false" />

二、定義複製字段

<copyField source="cat" dest="cc_all"/>
<copyField source="name" dest="cc_all"/>
相關文章
相關標籤/搜索