W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
索引處理程序是一種請求處理程序,旨在添加、刪除和更新文件到索引。除了使用 Tika 導(dǎo)入豐富文檔的插件或使用數(shù)據(jù)導(dǎo)入處理程序的結(jié)構(gòu)化數(shù)據(jù)源外,Solr 本身還支持以 XML、CSV 和 JSON 中的結(jié)構(gòu)化文檔索引。
建議配置和使用請求處理程序的方法是使用基于路徑的名稱映射到請求 url 中的路徑。但是,如果正確配置了 requestDispatcher,則也可以使用 qt(查詢類型)參數(shù)指定請求處理程序??梢允褂枚鄠€名稱來訪問相同的處理程序,如果您希望指定不同的默認選項集,這可能很有用。
一個統(tǒng)一的更新請求處理程序支持 XML、CSV、JSON 和 javabin 更新請求,并根據(jù) ContentStream 的內(nèi)容類型委派給適當(dāng)?shù)?ContentStreamLoader。
默認配置文件具有默認配置的更新請求處理程序。
<requestHandler name="/update" class="solr.UpdateRequestHandler" />
索引更新命令可以使用 Content-type: application/xml 或者 Content-type: text/xml 作為 XML 消息發(fā)送到更新處理程序。
由更新處理程序識別的用于添加文檔的 XML 架構(gòu)非常簡單:
例如:
<add>
<doc>
<field name="authors">Patrick Eagar</field>
<field name="subject">Sports</field>
<field name="dd">796.35</field>
<field name="numpages">128</field>
<field name="desc"></field>
<field name="price">12.40</field>
<field name="title">Summer of the all-rounder: Test and championship cricket in England 1982</field>
<field name="isbn">0002166313</field>
<field name="yearpub">1982</field>
<field name="publisher">Collins</field>
</doc>
<doc>
...
</doc>
</add>
add 命令支持一些可以指定的可選屬性。
在指定的毫秒數(shù)內(nèi)添加文檔。
默認是 true。指示是否應(yīng)檢查唯一鍵約束以覆蓋同一文檔的以前版本(請參見下文)。
如果文檔架構(gòu)定義了唯一的鍵,那么默認情況下,添加文檔的 /update 操作將使用相同的唯一鍵覆蓋(即替換)索引中的任何文檔。如果沒有定義唯一的鍵,索引性能會更快一些,因為不需要對現(xiàn)有文檔進行任何檢查來替換。
如果您有一個唯一的關(guān)鍵字段,但您確信您可以安全地繞過唯一性檢查(例如,在批處理中生成索引,并且索引代碼保證它從不多次添加同一文檔),您可以指定overwrite="false" 選項當(dāng)您添加您的文檔時。
該 <commit> 操作將自從上次提交后加載的所有文檔寫入磁盤上的一個或多個段文件。在提交之前,新索引的內(nèi)容對于搜索是不可見的。提交操作將打開一個新的搜索器,并觸發(fā)已配置的任何事件偵聽器。
可以使用 <commit/> 消息顯式發(fā)出提交,也可以在 solrconfig. xml 中觸發(fā) <autocommit> 參數(shù)。
該 <optimize> 操作請求 Solr 合并內(nèi)部數(shù)據(jù)結(jié)構(gòu)以提高搜索性能。對于大型索引,優(yōu)化需要一些時間才能完成,但是通過將許多小段文件合并為一個更大的文件,搜索性能將會提高。如果您使用 Solr 的復(fù)制機制在多個系統(tǒng)上分發(fā)搜索,請注意,在進行優(yōu)化之后,需要傳輸一個完整的索引。相比之下,提交后的轉(zhuǎn)移通常要小得多。
在 <commit> 和 <optimize> 元素中接受這些可選屬性:
默認是 true。阻塞,直到打開新的搜索器并注冊為主查詢搜索器,使更改可見。
(只提交)默認是 false。合并超過10%已刪除文檔的細分受眾群,并在此過程中將其刪除。
(僅限優(yōu)化)默認是1。將分段合并到不超過此段數(shù)量。
以下是使用 <commit> 和 <optimize> 可選屬性的示例:
<commit waitSearcher="false"/>
<commit waitSearcher="false" expungeDeletes="true"/>
<optimize waitSearcher="false"/>
文件可以通過兩種方式從索引中刪除。“按 ID 刪除”刪除具有指定 ID 的文檔,只有在架構(gòu)中定義了 UniqueID 字段時才能使用?!鞍床樵儎h除”會刪除與指定查詢匹配的所有文檔,但 commitWithin 對于按查詢刪除而言將被忽略。單個刪除消息可以包含多個刪除操作。
<delete>
<id>0002166313</id>
<id>0031745983</id>
<query>subject:sport</query>
<query>publisher:penguin</query>
</delete>
注意:在 Delete By Query(按查詢刪除)中使用 Join 查詢解析器時,應(yīng)該使用值為 “none” 的 score 參數(shù)來避免 ClassCastException。有關(guān) score 參數(shù)的更多詳細信息,請參見 Join Query Parser(聯(lián)接查詢分析器)部分。
回滾操作
回滾命令將回滾自上次提交以來對索引所做的所有添加和刪除操作。它既不調(diào)用任何事件偵聽器也不創(chuàng)建新的搜索器。它的語法很簡單:<rollback/>。
您可以使用 curl 實用程序執(zhí)行上述任何命令,使用其 --data-binary 選項將 XML 消息附加到 curl 命令,并生成 HTTP POST 請求。例如:
curl http://localhost:8983/solr/my_collection/update -H "Content-Type: text/xml" --data-binary '
<add>
<doc>
<field name="authors">Patrick Eagar</field>
<field name="subject">Sports</field>
<field name="dd">796.35</field>
<field name="isbn">0002166313</field>
<field name="yearpub">1982</field>
<field name="publisher">Collins</field>
</doc>
</add>'
要發(fā)布文件中包含的 XML 消息,可以使用其他形式:
curl http://localhost:8983/solr/my_collection/update -H "Content-Type: text/xml" --data-binary @myfile.xml
也可以使用 HTTP GET 命令發(fā)送短請求(如果在 SolrConfig 元素中的 RequestDispatcher 中啟用),請對 URL 進行編碼,如下所示。注意"<" and ">"的轉(zhuǎn)義:
curl http://localhost:8983/solr/my_collection/update?stream.body=%3Ccommit/%3E
Solr 的回應(yīng)采取如下所示的形式:
<response>
<lst name="responseHeader">
<int name="status">0</int>
<int name="QTime">127</int>
</lst>
</response>
在失敗的情況下,狀態(tài)字段將是非零的。
UpdateRequestHandler 允許您使用 <tr> 參數(shù)來應(yīng)用 XSL 轉(zhuǎn)換來索引任意 XML。您必須在配置集的 conf/xslt 目錄中有一個 XSLT 樣式表,可以將傳入的數(shù)據(jù)轉(zhuǎn)換為預(yù)期的 <add><doc/></add> 格式,并使用 tr 參數(shù)指定該樣式表的名稱。
下面是一個 XSLT 樣式表示例:
<xsl:stylesheet version='1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
<xsl:output media-type="text/xml" method="xml" indent="yes"/>
<xsl:template match='/'>
<add>
<xsl:apply-templates select="response/result/doc"/>
</add>
</xsl:template>
<!-- Ignore score (makes no sense to index) -->
<xsl:template match="doc/*[@name='score']" priority="100"></xsl:template>
<xsl:template match="doc">
<xsl:variable name="pos" select="position()"/>
<doc>
<xsl:apply-templates>
<xsl:with-param name="pos"><xsl:value-of select="$pos"/></xsl:with-param>
</xsl:apply-templates>
</doc>
</xsl:template>
<!-- Flatten arrays to duplicate field lines -->
<xsl:template match="doc/arr" priority="100">
<xsl:variable name="fn" select="@name"/>
<xsl:for-each select="*">
<xsl:element name="field">
<xsl:attribute name="name"><xsl:value-of select="$fn"/></xsl:attribute>
<xsl:value-of select="."/>
</xsl:element>
</xsl:for-each>
</xsl:template>
<xsl:template match="doc/*">
<xsl:variable name="fn" select="@name"/>
<xsl:element name="field">
<xsl:attribute name="name"><xsl:value-of select="$fn"/></xsl:attribute>
<xsl:value-of select="."/>
</xsl:element>
</xsl:template>
<xsl:template match="*"/>
</xsl:stylesheet>
此樣式表將 Solr 的 XML 搜索結(jié)果格式轉(zhuǎn)換為 Solr 的更新 XML 語法。一個示例用法是將 Solr 1.3 索引(沒有 CSV 響應(yīng)編寫器)復(fù)制為可以索引到另一個 Solr 文件中的格式(前提是所有字段都存儲):
http://localhost:8983/solr/my_collection/select?q=*:*&wt=xslt&tr=updateXml.xsl&rows=1000
XsltUpdateRequestHandler 更新時也可以使用樣式表來轉(zhuǎn)換索引:
curl "http://localhost:8983/solr/my_collection/update?commit=true&tr=updateXml.xsl" -H "Content-Type: text/xml" --data-binary @myexporteddata.xml
Solr 可以接受符合定義結(jié)構(gòu)的 JSON,或者可以接受任意的 JSON 格式的文檔。如果發(fā)送任意格式的 JSON,則需要使用更新請求發(fā)送一些其他參數(shù),如下面的“自定義JSON 轉(zhuǎn)換和索引”部分所述。
JSON 格式的更新請求可以使用 Content-Type: application/json 或 Content-Type: text/json 發(fā)送到 Solr 的 /update 處理程序。
JSON 格式的更新可以采取 3 種基本形式,下面進行深入的描述:
通過 JSON 添加文檔的最簡單方法是使用以下 /update/json/docs 路徑將每個文檔分別作為 JSON 對象單獨發(fā)送:
curl -X POST -H 'Content-Type: application/json' 'http://localhost:8983/solr/my_collection/update/json/docs' --data-binary '
{
"id": "1",
"title": "Doc 1"
}'
通過 JSON 一次添加多個文檔可以通過 JSON 對象的 JSON 數(shù)組完成,其中每個對象都代表一個文檔:
curl -X POST -H 'Content-Type: application/json' 'http://localhost:8983/solr/my_collection/update' --data-binary '
[
{
"id": "1",
"title": "Doc 1"
},
{
"id": "2",
"title": "Doc 2"
}
]'
一個示例 JSON 文件提供的 example/exampledocs/books.json 并包含可添加到 Solr techproducts 示例的對象數(shù)組:
curl 'http://localhost:8983/solr/techproducts/update?commit=true' --data-binary @example/exampledocs/books.json -H 'Content-type:application/json'
發(fā)送 JSON 更新命令通常, JSON 更新語法通過簡單的映射支持 XML 更新處理程序支持的所有更新命令。多條命令、添加和刪除文檔可能包含在一條消息中:
curl -X POST -H 'Content-Type: application/json' 'http://localhost:8983/solr/my_collection/update' --data-binary '
{
"add": {
"doc": {
"id": "DOC1",
"my_field": 2.3,
"my_multivalued_field": [ "aaa", "bbb" ]【1】
}
},
"add": {
"commitWithin": 5000, 【2】
"overwrite": false, 【3】
"doc": {
"f1": "v1", 【4】
"f1": "v2"
}
},
"commit": {},
"optimize": { "waitSearcher":false },
"delete": { "id":"ID" }, 【5】
"delete": { "query":"QUERY" } 【6】
}'
以下解釋對應(yīng)于上述代碼:
與其他更新處理程序一樣,可以在 URL 而不是消息正文中指定諸如 commit、commitWithin、optimize 和 overwrite 等參數(shù)。
JSON 更新格式允許簡單的刪除 ID。delete 的值可以是一個數(shù)組,其中包含零個或多個特定文檔 ID(不是范圍)的要刪除的列表。例如,單個文檔:
{ "delete":"myid" }
或文檔 ID 的列表:
{ "delete":["id1","id2"] }
“delete”的值可以是包含要刪除的零個或多個 ID 的列表的數(shù)組。這不是一個范圍(開始和結(jié)束)。
您也可以使用每個“delete” 指定 _version_ :
{
"delete":"id":50,
"_version_":12345
}
您也可以在更新請求的主體中指定刪除的版本。
除了 /update 處理程序之外,Solr 中默認還有一些額外的 JSON 特定的請求處理程序路徑,它隱式覆蓋了一些請求參數(shù)的行為:
路徑 | 默認參數(shù) |
---|---|
|
|
|
|
該 /update/json 路徑對于從設(shè)置 Content-Type 的應(yīng)用程序中發(fā)送 JSON 格式的更新命令的客戶端來說非常有用,因為設(shè)置 Content-Type 的應(yīng)用程序證明是困難的,而 /update/json/docs 路徑對于總是希望單獨發(fā)送或作為列表發(fā)送文檔的客戶端而言,可能是特別方便的,無需擔(dān)心完整的 JSON 命令語法。
Solr 可以支持自定義的 JSON。這在 “自定義 JSON 轉(zhuǎn)換和索引” 部分中進行了介紹。
CSV 格式的更新請求可以使用 Content-Type: application/csv 或 Content-Type: text/csv 發(fā)送到 Solr 的 /update 處理程序。
一個示例 CSV 文件提供了 example/exampledocs/books.csv,您可以使用它將一些文檔添加到 Solr techproducts 示例中:
curl 'http://localhost:8983/solr/my_collection/update?commit=true' --data-binary @example/exampledocs/books.csv -H 'Content-type:application/csv'
該 CSV 處理程序允許在表單中的 URL 中的 f.parameter.optional_fieldname=value 指定許多參數(shù)。
下表介紹了更新處理程序的參數(shù)。
用作字段分隔符的字符;默認是“,”。這個參數(shù)是全局的;對于每個字段的使用情況,請參閱split
參數(shù)。
例:separator=%09
如果true
從值中刪除前導(dǎo)和尾隨空白。默認是false
。此參數(shù)可以是全局或每個字段。
例子:f.isbn.trim=true
或trim=false
如果輸入的第一行包含字段名稱,則設(shè)置為 true;如果fieldnames
參數(shù)不存在,將使用這些參數(shù)。這個參數(shù)是全局的。
添加文檔時使用逗號分隔的字段名稱列表。這個參數(shù)是全局的。
例:fieldnames=isbn,price,title
指定字段名稱的文字值。這個參數(shù)是全局的。
例:literal.color=red
逗號分隔的字段名稱列表跳過。這個參數(shù)是全局的。
例:skip=uninteresting,shoesize
在 CSV 數(shù)據(jù)開始之前在輸入流中放棄的行數(shù),包括標題(如果存在)。默認 = 0
。這個參數(shù)是全局的。
例:skipLines=5
字符可選用于包圍值以保留字符(如 CSV 分隔符或空格)。這個標準的 CSV 格式通過加倍封裝器來處理出現(xiàn)在封裝值中的封裝器本身。
這個參數(shù)是全局的;有關(guān)每個字段的使用情況,請參閱split
。
例:encapsulator="
用于轉(zhuǎn)義 CSV 分隔符或其他保留字符的字符。如果指定了轉(zhuǎn)義,則除非明確指定,否則不使用封裝器,因為大多數(shù)格式使用封裝或轉(zhuǎn)義,而不是兩種方式。
例: escape=\
保留和索引零長度(空)字段。默認是false
。此參數(shù)可以是全局或每個字段。
例:f.price.keepEmpty=true
將一個值映射到另一個值。格式是 value:replacement(可以是空的)。此參數(shù)可以是全局或每個字段。
例如:map=left:right
或f.subject.map=history:bunk
如果true
通過單獨的解析器將字段分成多個值。該參數(shù)在每個字段的基礎(chǔ)上使用。
如果true
(默認),根據(jù) Solr 模式中聲明的 uniqueKey 字段檢查并覆蓋重復(fù)的文檔。如果您知道索引的文檔不包含任何重復(fù)內(nèi)容,那么您可能會看到相當(dāng)快的速度false
。
這個參數(shù)是全局的。
數(shù)據(jù)攝取后發(fā)出提交。這個參數(shù)是全局的。
在指定的毫秒數(shù)內(nèi)添加文檔。這個參數(shù)是全局的。
例:commitWithin=10000
將rowid
(行號)映射到由參數(shù)的值指定的字段,例如,如果您的 CSV 沒有唯一鍵,并且您想要使用行標識。這個參數(shù)是全局的。
例:rowid=id
將給定的偏移量(作為整數(shù))rowid
添加到文檔之前。默認是0
。這個參數(shù)是全局的。
例:rowidOffset=10
用于索引 CSV 文檔的相同功能也可以輕松用于索引制表符分隔的文件(TSV 文件),甚至可以處理反斜杠轉(zhuǎn)義而不是 CSV 封裝。
例如,可以使用以下命令將 MySQL 表轉(zhuǎn)儲到制表符分隔的文件中:
SELECT * INTO OUTFILE '/tmp/result.txt' FROM mytable;
然后可以通過將分隔符設(shè)置為 tab(%09)和 轉(zhuǎn)義符(%5c)將該文件導(dǎo)入到 Solr 。
curl 'http://localhost:8983/solr/my_collection/update/csv?commit=true&separator=%09&escape=%5c' --data-binary @/tmp/result.txt
除了 /update 處理程序之外,Solr 中默認還有一個額外的 CSV 特定請求處理程序路徑,它隱式地覆蓋了一些請求參數(shù)的行為:
路徑 | 默認參數(shù) |
---|---|
|
|
該 /update/csv 路徑對于客戶端發(fā)送 CSV 格式的更新命令來說很有用,這些應(yīng)用程序設(shè)置 Content-Type 非常困難。
Solr將嵌套的文檔嵌套在塊中,以將包含其他文檔的文檔(比如一個 blog post 父文檔和注釋作為子文檔)或作為父文檔和大小、顏色或其他變體的子文檔作為子文檔來建模文檔。在查詢時,塊聯(lián)接查詢解析器( Block Join Query Parsers)可以搜索這些關(guān)系。就性能而言,索引文檔之間的關(guān)系可能比試圖僅在查詢時進行連接更有效率,因為關(guān)系已經(jīng)存儲在索引中并且不需要被計算。
嵌套文檔可以通過 XML 或 JSON 數(shù)據(jù)語法(或使用 SolrJ)進行索引- 但是不管語法如何,您都必須包含一個將父文檔標識為父項的字段;它可以是適合這個目的的任何字段,它將被用作塊連接查詢解析器的輸入。
為了支持嵌套文檔,架構(gòu)必須包含 indexed/non-stored 字段_root_。無論繼承深度如何,該字段的值都會自動填充,并且與塊中的所有文檔相同。
例如,這里有兩個文件及其子文件:
<add>
<doc>
<field name="id">1</field>
<field name="title">Solr adds block join support</field>
<field name="content_type">parentDocument</field>
<doc>
<field name="id">2</field>
<field name="comments">SolrCloud supports it too!</field>
</doc>
</doc>
<doc>
<field name="id">3</field>
<field name="title">New Lucene and Solr release is out</field>
<field name="content_type">parentDocument</field>
<doc>
<field name="id">4</field>
<field name="comments">Lots of new features</field>
</doc>
</doc>
</add>
在這個例子中,我們使用字段 content_type 索引父文檔,它具有值 “parentDocument”。我們也可以使用一個布爾型的字段,比如 isParent 值為 “true”,或者其他類似的方法。
這個例子相當(dāng)于上面的 XML 例子,請注意特殊的 _childDocuments_ 鍵需要指示 JSON 中的嵌套文檔。
[
{
"id": "1",
"title": "Solr adds block join support",
"content_type": "parentDocument",
"_childDocuments_": [
{
"id": "2",
"comments": "SolrCloud supports it too!"
}
]
},
{
"id": "3",
"title": "New Lucene and Solr release is out",
"content_type": "parentDocument",
"_childDocuments_": [
{
"id": "4",
"comments": "Lots of new features"
}
]
}
]
注意:對嵌套文檔進行索引的一個限制是,在需要進行任何更改時,必須將整個父子文檔塊一起更新。換言之,即使更改了單個子文檔或父文檔,也必須將整個父子文檔塊編入索引。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: