Elasticsearch 2.20 高亮顯示

    Elasticsearch中的高亮顯示是來源於lucene的功能,他容許在一個或者多個字段上突出顯示搜索內容, lucene支持三種高亮顯示方式highlighter, fast-vector-highlighter, postings-highlighter,第一種是默認的標準類型。下面先看一個實例,在搜索前,先增長一條文檔。html

請求:PUT http://localhost:9200/secilog/log/10?pretty算法

參數:post

{
"type":"file",
"message":"secilog is a log real-time analyse software,it's full text search is based on Elasticsearch "
}

文檔建立好後,咱們在進行高亮搜索:性能

請求:POST http://localhost:9200/secilog/log/_search?prettyspa

參數:code

{
    "query": {
        "term": {
            "message": "analyse"
        }
    }, 
    "highlight": {
        "fields": {
            "message": { }
        }
    }
}

返回結果以下:htm

{
  "took" : 1,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "failed" : 0
  },
  "hits" : {
    "total" : 1,
    "max_score" : 0.4232868,
    "hits" : [ {
      "_index" : "secilog",
      "_type" : "log",
      "_id" : "10",
      "_score" : 0.4232868,
      "_source" : {
        "type" : "file",
        "message" : "secilog is a log real-time analyse software,it's full text search is based on Elasticsearch "
      },
      "highlight" : {
        "message" : [ "secilog is a log real-time <em>analyse</em> software,it's full text search is based on Elasticsearch " ]
      }
    } ]
  }
}

    從結果中能夠看出,有高亮顯示的內容,<em>analyse</em>。爲了執行高亮顯示,該字段必須有實際的內容。而且這個字段必須進程存儲,就是在字段映射中store的值必須爲ture,不能只在內存中。不然系統會自動加載_source字段並匹配相關的列。字段名稱支持通配符符號,例如能夠用"message*": { }參數匹配全部message開頭的字段。排序

fast-vector-highlighter

    前面的高亮顯示是普通的高亮顯示,lucene還支持fast-vector-highlighter高亮顯示,fast-vector-highlighter高亮顯示具備以下特色:索引

  • 快,特別是內容別大的字段,好比大於1M進程

  • 可定製的boundary_chars,boundary_max_scan,和fragment_offset。

  • 須要設置term_vector的值爲with_positions_offsets,增長索引的大小。

  • 能夠將多個字段的匹配組合成一個結果。

  • 能夠分配不一樣的權重匹配在不一樣的位置上,

    Elasticsearch中須要在創建索引的時候映射字段類型,才能夠實現postings-highlighter高亮顯示,例如對content字段採用fast-vector高亮類型

{
    "type_name" : {
        "content" : {"type":"string","term_vector" : "with_positions_offsets"}
    }
}

postings-highlighter

    lucene還支持postings-highlighter高亮顯示,postings-highlighter高亮顯示具備以下特色:

  • 快,由於它不須要從新分析文檔:尤爲是對大文件對性能的提升更爲明顯。

  • 佔用更少的磁盤空間。

  • 把高亮顯示和句子分開,這個更有利於人類的閱讀。

  • 使用BM25算法,使搜索的時候像是整篇文檔。

    Elasticsearch中須要在創建索引的時候映射字段類型,才能夠實現postings-highlighter高亮顯示,例如對content字段採用postings高亮類型

{
    "type_name" : {
        "content" : {"type":"string","index_options" : "offsets"}
    }
}

備註:高亮查詢不支持複雜的查詢,好比查詢類型設置爲match_phrase_prefix的查詢。

    對於後兩種特殊的類型,都會增長索引的大小,但對於高亮顯示查詢的執行時間會減小。

    使用type字段能夠強制使用特定的高亮類型,當設置了term_vectors高亮類型的時候,想用普通高亮顯示的時候很是有用。這個只有三中類型,plain, postings , fvh分別對應高亮顯示的三種類型,例如:

{
    "query" : {...},
    "highlight" : {
        "fields" : {
            "content" : {"type" : "plain"}
        }
    }}

默認高亮顯示html標記

    默認狀況下,高亮顯示的文本在<em>和</em>中。這能夠經過設置pre_tags和post_tags進行修改,例如:

{
    "query" : {...},
    "highlight" : {
        "pre_tags" : ["<b>"],
        "post_tags" : ["</b>"],
        "fields" : {
            "_all" : {}
        }
    }}

    使用快速矢量記號能夠有多個標籤,按照「重要性」進行排序,例如:

{
    "query" : {...},
    "highlight" : {
        "pre_tags" : ["<tag1>", "<tag2>"],
        "post_tags" : ["</tag1>", "</tag2>"],
        "fields" : {
            "_all" : {}
        }
    }
}

    系統對於這種狀況有默認的多個pre_tags,須要設置tags_schema爲styled,默認post_tags爲</em>,默認多個pre_tags標籤爲:

<em class="hlt1">, <em class="hlt2">, <em class="hlt3">,<em class="hlt4">, <em class="hlt5">, <em class="hlt6">,<em class="hlt7">, <em class="hlt8">, <em class="hlt9">,<em class="hlt10">

   當咱們須要設置默認多個標籤的時候的例子以下:

{
    "query" : {...},
    "highlight" : {
        "tags_schema" : "styled",
        "fields" : {
            "content" : {}
        }
    }
}

    每一個字段均可以設置高亮顯示的字符片fragment_size段大小(默認爲100),以及返回的最大片斷數number_of_fragments(默認爲5),若是number_of_fragments值設置爲0則片斷產生,當order設置爲score時候能夠按照評分進行排序。例如:

{
    "query" : {...},
    "highlight" : {
        "order" : "score",
        "fields" : {
            "content" : {"fragment_size" : 150, "number_of_fragments" : 3}
        }
    }
}

   賽克藍德(secisland)後續會逐步對Elasticsearch的最新版本的各項功能進行分析,近請期待。也歡迎加入secisland公衆號進行關注

相關文章
相關標籤/搜索