Solr:流表達(dá)式

2018-12-06 10:38 更新

流表達(dá)式為 Solr Cloud 提供了一種簡(jiǎn)單而強(qiáng)大的流處理語(yǔ)言。

流式表達(dá)式是一組可以組合起來(lái)執(zhí)行許多不同的并行計(jì)算任務(wù)的函數(shù)。這些函數(shù)是并行 SQL 接口的基礎(chǔ)。

有越來(lái)越多的函數(shù)庫(kù)可以結(jié)合起來(lái)實(shí)現(xiàn):

  • 請(qǐng)求/響應(yīng)流處理
  • 批量流處理
  • 快速交互式 MapReduce
  • 聚合(兩者都推下了分面和洗牌的 MapReduce)
  • 并行關(guān)系代數(shù)(分布式連接,交集,聯(lián)合,互補(bǔ))
  • 發(fā)布/訂閱消息
  • 分布圖遍歷
  • 機(jī)器學(xué)習(xí)和并行迭代模型訓(xùn)練
  • 異常檢測(cè)
  • 推薦系統(tǒng)
  • 檢索和排序服務(wù)
  • 文本分類和特征提取
  • 流式 NLP
  • 統(tǒng)計(jì)編程

來(lái)自外部系統(tǒng)的流可以與來(lái)自 Solr 的流結(jié)合,用戶可以通過遵循 Solr 的 Java streaming API 來(lái)添加自己的流函數(shù)。

注意:流表達(dá)式和流 API 都被認(rèn)為是實(shí)驗(yàn)性的,并且 API 是可以改變的。

流語(yǔ)言基礎(chǔ)

流表達(dá)式由與 Solr 集合一起使用的流式函數(shù)組成。它們發(fā)出一串元組(鍵/值映射)。

許多提供的流函數(shù)被設(shè)計(jì)用來(lái)處理整個(gè)結(jié)果集,而不是像普通搜索那樣的前 N 個(gè)結(jié)果。這由 /export 處理程序支持。

一些流函數(shù)作為流源來(lái)發(fā)起流式流。其他流函數(shù)充當(dāng)流修飾符來(lái)包裝其他流函數(shù)并在元組流上執(zhí)行操作。許多流函數(shù)可以跨工作集合并行化。這對(duì)于關(guān)系代數(shù)函數(shù)來(lái)說(shuō)可能特別強(qiáng)大。

流請(qǐng)求和響應(yīng)

Solr 有一個(gè) /stream 請(qǐng)求處理程序,它接受流表達(dá)式請(qǐng)求并將這些元組作為 JSON 流返回。這個(gè)請(qǐng)求處理程序是隱式定義的,這意味著在 solrconfig.xml 中沒有任何定義,請(qǐng)參閱隱式RequestHandlers。

/stream 請(qǐng)求處理程序有一個(gè)參數(shù):expr,它是用來(lái)指定流表達(dá)式。例如,這個(gè) curl 命令將一個(gè)簡(jiǎn)單的 search() 表達(dá)式編碼并發(fā)布到 /stream 處理程序:

curl --data-urlencode 'expr=search(enron_emails,
                                   q="from:1800flowers*",
                                   fl="from, to",
                                   sort="from asc",
                                   qt="/export")' http://localhost:8983/solr/enron_emails/stream

每個(gè)函數(shù)的參數(shù)詳情如下。

對(duì)于上面的例子,/stream 處理程序用下面的 JSON 響應(yīng)進(jìn)行響應(yīng):

{"result-set":{"docs":[
   {"from":"1800flowers.133139412@s2u2.com","to":"lcampbel@enron.com"},
   {"from":"1800flowers.93690065@s2u2.com","to":"jtholt@ect.enron.com"},
   {"from":"1800flowers.96749439@s2u2.com","to":"alewis@enron.com"},
   {"from":"1800flowers@1800flowers.flonetwork.com","to":"lcampbel@enron.com"},
   {"from":"1800flowers@1800flowers.flonetwork.com","to":"lcampbel@enron.com"},
   {"from":"1800flowers@1800flowers.flonetwork.com","to":"lcampbel@enron.com"},
   {"from":"1800flowers@1800flowers.flonetwork.com","to":"lcampbel@enron.com"},
   {"from":"1800flowers@1800flowers.flonetwork.com","to":"lcampbel@enron.com"},
   {"from":"1800flowers@shop2u.com","to":"ebass@enron.com"},
   {"from":"1800flowers@shop2u.com","to":"lcampbel@enron.com"},
   {"from":"1800flowers@shop2u.com","to":"lcampbel@enron.com"},
   {"from":"1800flowers@shop2u.com","to":"lcampbel@enron.com"},
   {"from":"1800flowers@shop2u.com","to":"ebass@enron.com"},
   {"from":"1800flowers@shop2u.com","to":"ebass@enron.com"},
   {"EOF":true,"RESPONSE_TIME":33}]}
}

注意上面的示例流中的最后一個(gè)元組是:{"EOF":true,"RESPONSE_TIME":33}。該 EOF 指示流的結(jié)束。要處理 JSON 響應(yīng),您需要使用流式 JSON 實(shí)現(xiàn),因?yàn)榱鞅磉_(dá)式旨在返回可能有數(shù)百萬(wàn)條記錄的整個(gè)結(jié)果集。在您的 JSON 客戶端中,您需要遍歷每個(gè)文檔(元組),并檢查 EOF 元組來(lái)確定流的結(jié)束。

org.apache.solr.client.solrj.io 軟件包提供了將流表達(dá)式編譯到流 API 對(duì)象中的 Java 類。這些類可以用來(lái)從 Java 應(yīng)用程序中執(zhí)行流表達(dá)式。例如:

StreamFactory streamFactory = new StreamFactory().withCollectionZkHost("collection1", zkServer.getZkAddress())
    .withStreamFunction("search", CloudSolrStream.class)
    .withStreamFunction("unique", UniqueStream.class)
    .withStreamFunction("top", RankStream.class)
    .withStreamFunction("group", ReducerStream.class)
    .withStreamFunction("parallel", ParallelStream.class);

ParallelStream pstream = (ParallelStream)streamFactory.constructStream("parallel(collection1, group(search(collection1, q=\"*:*\", fl=\"id,a_s,a_i,a_f\", sort=\"a_s asc,a_f asc\", partitionKeys=\"a_s\"), by=\"a_s asc\"), workers=\"2\", zkHost=\""+zkHost+"\", sort=\"a_s asc\")");

數(shù)據(jù)要求

由于流表達(dá)式依賴于 /export 處理程序,所以使用 /export 的許多字段和字段類型要求也是 /stream 的要求,特別是對(duì)于 sort 和 fl 參數(shù)。有關(guān)詳細(xì)信息,請(qǐng)參閱導(dǎo)出結(jié)果集部分。

流表達(dá)式的類型

關(guān)于流源

流源來(lái)源于流。最常用的是 search 查詢。

對(duì)所有可用源表達(dá)式的完整引用在流源引用中可用。

關(guān)于流修飾符

流修飾符包裝其他流函數(shù)或在流上執(zhí)行操作。

Stream Decorator Reference 中提供了對(duì)所有可用修飾符表達(dá)式的完整引用。

關(guān)于 Stream 評(píng)估器

流計(jì)算器可以用來(lái)計(jì)算基于元組中其他值的新值。新計(jì)算的值可以放入元組(作為 select(…?) 子句的一部分),用于過濾流(作為 having(…?) 子句的一部分),以及用于其他事情。計(jì)算器可以包含字段名稱、原始值或其他計(jì)算器,從而使您能夠創(chuàng)建復(fù)雜的計(jì)算邏輯,包括有條件的 if/then 選項(xiàng)。

如果您想將原始值用作評(píng)估的一部分,則需要考慮計(jì)算器的解析順序。

  1. 如果參數(shù)可以被解析成一個(gè)有效的數(shù)字,那么它被認(rèn)為是一個(gè)數(shù)字。例如,add(3,4.5)
  2. 如果參數(shù)可以被解析成一個(gè)有效的布爾值,那么它被認(rèn)為是一個(gè)布爾值。例如,eq(true,false)
  3. 如果參數(shù)可以被分析成有效的計(jì)算器,那么它被認(rèn)為是一個(gè)計(jì)算器。例如,eq(add(10,4),add(7,7))
  4. 即使引用了該參數(shù),也會(huì)將其視為字段名稱。例如,eq(fieldA,"fieldB")

如果您希望使用原始字符串作為計(jì)算的一部分,則您將需要考慮使用 raw(string) 計(jì)算程序。無(wú)論輸入什么內(nèi)容,都將始終返回原始值。

Stream Evaluator Reference 中提供了對(duì)所有可用計(jì)算程序表達(dá)式的完整引用。

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)