成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

ES學(xué)習(xí)筆記之--fielddata的起源

ES的官方文檔中關(guān)于 檢索和排序的關(guān)系說(shuō)得特別好:

網(wǎng)站建設(shè)哪家好,找創(chuàng)新互聯(lián)建站!專(zhuān)注于網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開(kāi)發(fā)、小程序設(shè)計(jì)、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶(hù)創(chuàng)新互聯(lián)還提供了泰州免費(fèi)建站歡迎大家使用!

Search needs to answer the question "Which documents contain this term?", 
while sorting and aggregations need to answer a different question: "What is the value of this field for this document?".

搜索要解決的問(wèn)題是: "哪些文檔包含給定的關(guān)鍵詞?"
排序和聚合要解決的問(wèn)題是: “這個(gè)文檔中對(duì)應(yīng)字段的值是多少?”

同樣,以需求為出發(fā)點(diǎn): "檢索的結(jié)果按時(shí)間排序" 這個(gè)需求在商品搜索和日志分析系統(tǒng)中是非常普遍的。 眾所周知,Lucene是通過(guò)倒排索引解決了“檢索的問(wèn)題”,那么“排序的問(wèn)題” 怎么處理呢?

最開(kāi)始,Lucene是通過(guò)FieldCache來(lái)解決這個(gè)需求。就是通過(guò)FieldCache建立docId - value的映射關(guān)系。 但是FieldCache有個(gè)兩個(gè)致命的問(wèn)題: 堆內(nèi)存消耗 和 首次加載耗時(shí) 。 如過(guò)索引更新頻率較高,這兩個(gè)問(wèn)題引發(fā)的GC和超時(shí)導(dǎo)致系統(tǒng)不穩(wěn)定估計(jì)是程序員的噩夢(mèng)。

從Lucene4.0開(kāi)始,引入了新的組件IndexDocValues,就是我們常說(shuō)的doc_value。

它有兩個(gè)亮點(diǎn):

1. 索引數(shù)據(jù)時(shí)構(gòu)建 doc-value的映射關(guān)系。注: 倒排索引構(gòu)建的是value-doc的映射關(guān)系。

2. 列式存儲(chǔ)

這基本上就是“空間換時(shí)間”和“按需加載”的典型實(shí)踐了。 而且,列式存儲(chǔ)基本上是所有高效NOSQL的標(biāo)配,Hbase, Hive 都有列式存儲(chǔ)的身影。

IndexDocValues跟FieldCache一樣解決了“通過(guò)doc_id查詢(xún)value”的問(wèn)題, 同時(shí)也解決了FieldCache的兩個(gè)問(wèn)題。

ES基于doc_value構(gòu)建了fielddata, 用于排序和聚合兩大功能。 所以,可以毫不客氣地說(shuō), doc_value是ES aggregations的基石。

那么在ES中, fielddata如何使用呢? 以binary類(lèi)型為例,參考: org.elasticsearch.index.fielddata.BinaryDVFieldDataTests

s1: 建mappings時(shí)需要特殊處理

        String mapping = XContentFactory.jsonBuilder().startObject().startObject("test")
                .startObject("properties")
                .startObject("field")
                .field("type", "binary")
                .startObject("fielddata").field("format", "doc_values").endObject()
                .endObject()
                .endObject()
                .endObject().endObject().string();

s2: 通過(guò)leafreader構(gòu)建doc_values

 LeafReaderContext reader = refreshReader();
        IndexFieldData<?> indexFieldData = getForField("field");
        AtomicFieldData fieldData = indexFieldData.load(reader);

        SortedBinaryDocValues bytesValues = fieldData.getBytesValues();

s3: 定位到指定文檔, 用setDocument()方法。

/**
 * A list of per-document binary values, sorted
 * according to {@link BytesRef#getUTF8SortedAsUnicodeComparator()}.
 * There might be dups however.
 */
public abstract class SortedBinaryDocValues {

    /**
     * Positions to the specified document
     */
    public abstract void setDocument(int docId);

    /**
     * Return the number of values of the current document.
     */
    public abstract int count();

    /**
     * Retrieve the value for the current document at the specified index.
     * An index ranges from {@code 0} to {@code count()-1}.
     * Note that the returned {@link BytesRef} might be reused across invocations.
     */
    public abstract BytesRef valueAt(int index);

}

注意,如果reader是組合的,也就是有多個(gè),需要用到docBase + reader.docId。 這里是容易采坑的。

s4: 獲取文檔的指定field的value,使用 valueAt()方法。

最后總結(jié)一下, 本文簡(jiǎn)述了lucene的doc_value和 es的fielddata的關(guān)系, 簡(jiǎn)要描述了一下doc_value的基本思想。最后給出了在ES中使用fielddata的基本方法。這對(duì)于自己開(kāi)發(fā)plugin是比較有用的。

當(dāng)前文章:ES學(xué)習(xí)筆記之--fielddata的起源
分享URL:http://jinyejixie.com/article22/psphcc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)頁(yè)設(shè)計(jì)公司、ChatGPT、品牌網(wǎng)站建設(shè)、網(wǎng)站改版網(wǎng)站制作、網(wǎng)站設(shè)計(jì)公司

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)公司