Solr使用外部文件和進程

2018-11-11 15:41 更新

ExternalFileField 類型

ExternalFileField 類型可以指定 Solr 索引之外的文件中字段的值。對于這樣的字段,該文件包含從鍵字段到字段值的映射。另一種方法是,如果在文檔中索引時不指定字段,Solr 將在外部文件中查找此字段的值。

Tip:外部字段不可搜索。它們只能用于函數(shù)查詢或顯示。有關函數(shù)查詢的詳細信息, 請參閱函數(shù)查詢一節(jié)。

對于您希望在許多文檔中更新特定字段的情況,ExternalFileField 類型非常方便,它比您要更新其余文檔的時間更頻繁。例如,假設您已經(jīng)根據(jù)視圖的數(shù)量實現(xiàn)了文檔等級。您可能需要每天或每小時更新所有文檔的等級,而文檔的其余內容可能會更少更新。如果沒有 ExternalFileField,則需要更新每個文檔才能更改排名。使用ExternalFileField 效率更高,因為特定字段的所有文檔值都存儲在外部文件中,可以根據(jù)需要隨時更新。

在 schema.xml 中,這個字段類型的定義可能如下所示:

<fieldType name="entryRankFile" keyField="pkId" defVal="0" stored="false" indexed="false" class="solr.ExternalFileField"/>

keyField 屬性定義了將在外部文件中定義的鍵。它通常是索引的唯一鍵,但只要 keyField 可以用來識別索引中的文檔就不需要。defVal 定義了一個默認值,如果外部文件中沒有特定文檔的條目,將使用該默認值。

外部文件的格式

該文件本身位于 Solr 的索引目錄中,默認情況下是 $SOLR_HOME/data。該文件的名稱應該是 external_fieldname_ 或 external_fieldname_.*。對于上面的例子,則文件可以被命名為 external_entryRankFile 或 external_entryRankFile.txt。

Tip:如果出現(xiàn)使用名稱模式.*(如.txt)的任何文件,則將使用最后一個 (按名稱排序后),并且將刪除以前的版本。此行為支持在可能無法覆蓋文件的系統(tǒng)上(例如,在 Windows 上,如果該文件正在使用中)的實現(xiàn)。

該文件包含將等號左邊的關鍵字段映射到右邊的值的條目。以下是一些示例條目:

doc33=1.414
doc34=3.14159
doc40=42

此文件中列出的鍵不需要是唯一的。不需要對該文件進行排序,但如果是的話,Solr 將能夠更快地執(zhí)行查找。

重新加載外部文件

您可以定義一個事件偵聽器來重新加載外部文件,當搜索器重新加載或者當新的搜索器被啟動時。有關更多信息,請參閱 “Query-Related Listeners” 一節(jié),但 solrconfig. xml 中的示例定義可能如下所示:

<listener event="newSearcher" class="org.apache.solr.schema.ExternalFileFieldReloader"/>
<listener event="firstSearcher" class="org.apache.solr.schema.ExternalFileFieldReloader"/>

PreAnalyzedField 類型

PreAnalyzedField 類型提供了一種方法發(fā)送到 Solr 序列化的標記流,可選地使用字段的獨立存儲值,并且存儲和索引這些信息,而不需要在 Solr 中應用任何附加的文本處理。如果用戶希望提交已經(jīng)被一些現(xiàn)有的外部文本處理管道處理的字段內容(例如,已經(jīng)被標記化、注釋、詞干、同義詞插入等等),而使用 Lucene 的TokenStream 提供的所有豐富的屬性(每個令牌屬性)。

序列化格式可以使用 PreAnalyzedParser 接口的實現(xiàn)來插入。有兩個現(xiàn)成的實現(xiàn):

  • JsonPreAnalyzedParser:顧名思義,它解析使用 JSON 來表示字段內容的內容。如果沒有對字段類型進行其他配置,則這是要使用的默認分析器。
  • SimplePreAnalyzedParser:使用簡單嚴格的純文本格式,在某些情況下可能比 JSON 更容易創(chuàng)建。

只有一個配置參數(shù) parserImpl。此參數(shù)的值應該是實現(xiàn) PreAnalyzedParser 接口的類的完全限定類名稱。這個參數(shù)的默認值是:org.apache.solr.schema.JsonPreAnalyzedParser。

默認情況下,這種類型的字段的查詢時間分析器將與 "索引時間分析器" 相同,后者需要序列化的分析文本。您必須將一個查詢類型分析器添加到您的 fieldType 中,以便對未預先分析的查詢執(zhí)行分析。在下面的例子中,索引時間分析器需要默認的 JSON 序列化格式,而查詢時間分析器將使用:StandardTokenizer / LowerCaseFilter:

<fieldType name="pre_with_query_analyzer" class="solr.PreAnalyzedField">
  <analyzer type="query">
    <tokenizer class="solr.StandardTokenizerFactory"/>
    <filter class="solr.LowerCaseFilterFactory"/>
  </analyzer>
</fieldType>

JsonPreAnalyzedParser

這是 PreAnalyzedField 類型使用的默認序列化格式。它使用帶有以下鍵的頂級 JSON 映射:

描述 是否需要

v

版本密鑰。目前支持的版本是1

需要

str

存儲字段的字符串值。您最多可以使用一個strbin

可選的

bin

存儲的字段的二進制值。二進制值必須是 Base64 編碼的。

可選的

tokens

序列化的令牌流。這是一個 JSON 列表。

可選的

任何其他頂級密鑰都將被忽略。

令牌流序列化

令牌流表示為 JSON 映射的 JSON 列表。每個令牌的映射由以下鍵和值組成:

描述 Lucene屬性 是否需要

t

令牌

CharTermAttribute

表示當前令牌的 UTF-8 字符串

需要

s

起始偏移量

OffsetAttribute

非負整數(shù)

可選的

e

結束偏移量

OffsetAttribute

非負整數(shù)

可選的

i

位置增量

PositionIncrementAttribute

非負整數(shù) - 默認是 1

可選的

p

有效載荷

PayloadAttribute

Base64 編碼的有效載荷

可選的

y

詞法類型

TypeAttribute

UTF-8 字符串

可選的

f

標志

的FlagsAttribute

以十六進制格式表示整數(shù)值的字符串

可選的

任何其他的關鍵是默默的忽略。

JsonPreAnalyzedParser 示例

{
  "v":"1",
  "str":"test ????ńó???",
  "tokens": [
    {"t":"one","s":123,"e":128,"i":22,"p":"DQ4KDQsODg8=","y":"word"},
    {"t":"two","s":5,"e":8,"i":1,"y":"word"},
    {"t":"three","s":20,"e":22,"i":1,"y":"foobar"}
  ]
}

SimplePreAnalyzedParser

通過 parserImpl 配置參數(shù)指定此格式時使用的完全限定類名為 org.apache.solr.schema.SimplePreAnalyzedParser。

SimplePreAnalyzedParser 語法

這個解析器支持的序列化格式如下:

序列化格式:

content ::= version (stored)? tokens
version ::= digit+ " "
; stored field value - any "=" inside must be escaped!
stored ::= "=" text "="
tokens ::= (token ((" ") + token)*)*
token ::= text ("," attrib)*
attrib ::= name '=' value
name ::= text
value ::= text

“文本”值中的特殊字符可以使用轉義字符 '\' 進行轉義。以下轉義序列被識別:

EscapeSequence 描述

\

文字空間字符

\,

文字,字符

\=

文字=字符

\\

文字\字符

\n

新行

\r

回車

\t

水平選項卡

請注意,不支持 Unicode 序列(例如,\u0001)。

支持的屬性

以下標記屬性受支持,并用短符號名稱標識:

名稱 描述 Lucene 屬性 值格式

i

位置增量

PositionIncrementAttribute

整數(shù)

s

起始偏移量

OffsetAttribute

整數(shù)

e

結束偏移量

OffsetAttribute

整數(shù)

y

詞法類型

TypeAttribute

字符串

f

標志

FlagsAttribute

十六進制整數(shù)

p

有效載荷

PayloadAttribute

十六進制格式的字節(jié); 空白被忽略

令牌位置被跟蹤并隱式添加到令牌流中 - 開始和結束偏移量僅考慮文本和空白字段,并排除令牌屬性占用的空間。

令牌流示例

1 one two three
  • 版本:1
  • 存儲:null
  • 令牌:(term = one,startOffset = 0,endOffset = 3)
  • 標記:(term = two,startOffset = 4,endOffset = 7)
  • 標記:(term = three,startOffset = 8,endOffset = 13)
1 one  two    three
  • 版本:1
  • 存儲:null
  • 令牌:(term = one,startOffset = 0,endOffset = 3)
  • 標記:(term = two,startOffset = 5,endOffset = 8)
  • 令牌:(term = three,startOffset = 11,endOffset = 16)
1 one,s=123,e=128,i=22 two three,s=20,e=22
  • 版本:1
  • 存儲:null
  • 標記:(term = one,positionIncrement = 22,startOffset = 123,endOffset = 128)
  • 令牌:(term = two,positionIncrement = 1,startOffset = 5,endOffset = 8)
  • 令牌:(term = three,positionIncrement = 1,startOffset = 20,endOffset = 22)
1 \ one\ \,,i=22,a=\, two\=
\n,\ =\ \
  • 版本:1
  • 存儲:null
  • 標記:(term = one ,,positionIncrement = 22,startOffset = 0,endOffset = 6)
  • 令牌:(term = two=,positionIncrement = 1,startOffset = 7,endOffset = 15)
  • 令牌:(term = \,positionIncrement = 1,startOffset = 17,endOffset = 18)

請注意,未知屬性及其值將被忽略,因此在本例中,第一個標記上的 “a” 屬性和第二個標記上的“”(轉義空間)屬性與它們的值一起被忽略,因為它們不在受支持的屬性名稱中。

1 ,i=22 ,i=33,s=2,e=20 ,
  • 版本:1
  • 存儲:null
  • 令牌:(term =,positionIncrement = 22,startOffset = 0,endOffset = 0)
  • 標記:(term =,positionIncrement = 33,startOffset = 2,endOffset = 20)
  • 標記:(term =,positionIncrement = 1,startOffset = 2,endOffset = 2)
1 =This is the stored part with \=
\n \t escapes.=one two three
  • 版本:1
  • 存儲: This is the stored part with = \t escapes.
  • 令牌:(term = one,startOffset = 0,endOffset = 3)
  • 標記:(term = two,startOffset = 4,endOffset = 7)
  • 標記:(term = three,startOffset = 8,endOffset = 13)

請注意,\t 在上面存儲的值不是文字;它顯示了以可視方式指示存儲值中的實際制表符字符的方法。

1 ==
  • 版本:1
  • 存儲:“”
  • (沒有令牌)
1 =this is a test.=
  • 版本:1
  • 存儲: this is a test.
  • (沒有令牌)
以上內容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號