Elasticsearch高亮功能詳解

一、Elasticsearch高亮顯示name欄位

在Elasticsearch中,高亮功能是通過在搜索結果中對搜索關鍵字進行標記、突出顯示的功能。為了快速了解高亮顯示,我們可以通過對name欄位進行高亮來體驗一下。

curl -X GET "localhost:9200/my_index/_search?pretty" -H 'Content-Type: application/json' -d'
{
  "query": {
    "match": {
      "name": "elasticsearch"
    }
  },
  "highlight": {
    "fields": {
      "name": {
        "number_of_fragments": 3
      }
    }
  }
}
'

通過以上代碼,可以看到在搜索結果中,對包含搜索關鍵字的name欄位進行了突出顯示。

二、Elasticsearch啟動

在使用Elasticsearch高亮功能前,我們需要先啟動Elasticsearch。

cd elasticsearch-7.14.1/bin
./elasticsearch

以上代碼啟動Elasticsearch。如果您已經安裝了 Elasticsearch,可以直接在終端輸入 elasticsearch 命令啟動。如果您是通過安裝包或者其他方式安裝的Elasticsearch,命令會有所不同,請自行查詢。

三、Elasticsearch高亮查詢

在Elasticsearch中,高亮查詢是用於查找指定欄位中包含關鍵字的文檔,並將匹配關鍵字的部分進行標記、突出顯示的功能。

GET /my_index/_search
{
    "query": {
        "match_phrase" : {
            "text" : "elasticsearch"
        }
    },
    "highlight": {
        "fields" : {
            "text" : {}
        }
    }
}

以上代碼用於查詢text欄位中包含關鍵字「elasticsearch」的文檔,並對匹配的部分進行標記、突出顯示。

四、Elasticsearch高亮內容回填

Elasticsearch高亮功能支持將高亮顯示的內容回填到原有的數據中。回填功能主要會在搜索結果中將高亮顯示的內容回填到原始文檔中。

GET /my_index/_search
{
    "query": {
        "match_phrase" : {
            "text" : "elasticsearch"
        }
    },
    "highlight": {
        "fields" : {
            "text" : {}
        },
        "pre_tags" : [""],
        "post_tags" : [""]
    }
}

以上代碼用於將在搜索結果中搜索關鍵字「elasticsearch」並對匹配部分進行標記、突出顯示,同時將標記的信息回填到原始的文檔中。

五、Elasticsearch高亮設置

Elasticsearch高亮功能支持對高亮部分進行設置,如設置標記色、截取長度、顯示位置等等。常見設置如下:

GET /my_index/_search
{
    "query": {
        "match_phrase" : {
            "text" : "elasticsearch"
        }
    },
    "highlight": {
        "fields" : {
            "text" : {"number_of_fragments" : 2, "fragment_size" : 150}
        },
        "pre_tags" : [""],
        "post_tags" : [""]
    }
}

以上代碼用於將在搜索結果中搜索關鍵字「elasticsearch」並對匹配部分進行標記、突出顯示,同時設置每個匹配部分最多返回2段節選,每段節選最多返回150個字元。

六、Elasticsearch高亮跳轉

在搜索結果中點擊高亮顯示的部分可以跳轉至原始文檔中的對應位置。

涉及到html標籤的部分,在此省略轉義處理,下同。

curl -X GET "localhost:9200/my_index/_search?pretty" -H 'Content-Type: application/json' -d'
{
  ...
  "highlight": {
      "pre_tags": [""],
      "post_tags": [""],
      "fields": {
          "title": {},
          "content": {},
          "comments.comment": {}
      }
  }
}
'

以上代碼用於將在搜索結果中搜索關鍵字並對匹配部分進行標記、突出顯示,並設置每個匹配部分的開始和結束標記,以便實現跳轉到指定部分的效果。

七、Elasticsearch高亮還原

當文檔中含有HTML或其他轉義字元時,高亮顯示的內容未必適用於所有界面。我們需要用到escape_html參數,以便還原標記後的內容,即將文檔中的HTML標記轉義還原。

curl -X GET "localhost:9200/my_index/_search?pretty" -H 'Content-Type: application/json' -d'
{
  ...
  "highlight": {
      "fields": {
          "title": {"escape": true}
      }
  }
}
'

以上代碼用於將在搜索結果中搜索關鍵字並對匹配部分進行標記、突出顯示,並設置escapte_html參數以便還原HTML標記。

八、Elasticsearch高亮用什麼框架實現

Elasticsearch的高亮功能可以通過多種框架實現,如Java、Python等。以下是Java實現的示例代碼:

public class SearchDemo {
    private TransportClient client;
    private static final String ES_CLUSTER_NAME = "my_cluster";
    private static final String ES_SERVER_IP = "127.0.0.1:9300;";

    public void initialize() throws Exception {
        //設置連接池配置
        Settings settings = Settings.builder().put("cluster.name", ES_CLUSTER_NAME).build();
        TransportClient transportClient = new PreBuiltTransportClient(settings).addTransportAddresses(
                new TransportAddress(InetAddress.getByName(ES_SERVER_IP.split(":")[0]), Integer
                        .valueOf(ES_SERVER_IP.split(":")[1])));
        this.client = transportClient;
    }

    public void search(String index, String type, String name) {
        QueryBuilder query = QueryBuilders.matchQuery("name", name);
        HighlightBuilder hiBuilder = new HighlightBuilder();
        hiBuilder.preTags("");
        hiBuilder.postTags("");
        hiBuilder.field("name");
        SearchResponse response = client.prepareSearch(index).setTypes(type).setQuery(query)
                .highlighter(hiBuilder).get();
        SearchHits hits = response.getHits();
        for (SearchHit hit : hits) {
            Map fields = hit.getHighlightFields();
            HighlightField text = fields.get("name");
            Text[] fragments = text.fragments();
            String fragmentString = fragments[0].string();
            System.out.println(fragmentString);
        }
    }
}

以上代碼用於連接Elasticsearch並設置連接池配置,然後執行關鍵字查詢並對匹配部分進行標記、突出顯示並輸出。可以通過Java語法來實現Elasticsearch高亮功能。

九、Elasticsearch高亮只能高亮一個字

在使用Elasticsearch高亮功能時,當需要高亮的部分只有一個字時,容易出現不亮的情況。這是由於Elasticsearch對高亮的片段長度進行限制,導致出現不亮的情況。可以通過以下方式解決這個問題:

GET /my_index/_search
{
    "query": {
        "match": {
            "text": "elasticsearch"
        }
    },
    "highlight": {
        "fields": {
            "text": {
                "number_of_fragments": 0,
                "require_field_match": false,
                "pre_tags": [""],
                "post_tags": [""]
            }
        }
    }
}

以上代碼用於將一行文本中的每個字元都作為單獨的標記選項,以進行高亮顯示。

十、Elasticsearch高亮截取中文字元串

在使用Elasticsearch高亮功能時,由於中文長度不穩定,會導致一些字元不被高亮顯示,而不同於其他關鍵字匹配的字元。可以使用第三方庫中的SubstringScore分析中文字元,並對匹配部分進行截取,以解決該問題。下面是String分析的示例代碼:

Analyzer analyzer = new StandardAnalyzer();    // 使用標準分詞器
QueryParser parser = new QueryParser("", analyzer);   // 構建QueryParser對象
Query query = parser.parse("text");  // QueryParser.parse(String str)將會調用analyzer對象
TokenStream tokenStream = analyzer.tokenStream("", new StringReader(content));
CharTermAttribute charTermAttribute = tokenStream.addAttribute(CharTermAttribute.class);
tokenStream.reset();
float score = 0;
int start = 0;
int end = 0;
while (tokenStream.incrementToken()) {
    String term = charTermAttribute.toString();
    String pattern = term.replace("*", "");
    if (pattern.length()  loc)
                start = loc;
            if (end FragSize / 2)
        start -= Emergent.length() / 2;
    if (end + FragSize / 2 < content.length())
        end += Emergent.length() / 2;
    if (start = content.length())
        end = content.length() - 1;
    fragmentString = getHighlightSnippet(content, start, end);
}

以上代碼使用StringTokenizer函數處理中文字元,並對關鍵字進行截取和高亮顯示,並解決了中文字元不穩定導致有些字元不被高亮顯示的問題。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/279351.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-20 15:03
下一篇 2024-12-20 15:03

相關推薦

  • Java和Python哪個功能更好

    對於Java和Python這兩種編程語言,究竟哪一種更好?這個問題並沒有一個簡單的答案。下面我將從多個方面來對Java和Python進行比較,幫助讀者了解它們的優勢和劣勢,以便選擇…

    編程 2025-04-29
  • Python每次運行變數加一:實現計數器功能

    Python編程語言中,每次執行程序都需要定義變數,而在實際開發中常常需要對變數進行計數或者累加操作,這時就需要了解如何在Python中實現計數器功能。本文將從以下幾個方面詳細講解…

    編程 2025-04-28
  • Python strip()函數的功能和用法用法介紹

    Python的strip()函數用於刪除字元串開頭和結尾的空格,包括\n、\t等字元。本篇文章將從用法、功能以及與其他函數的比較等多個方面對strip()函數進行詳細講解。 一、基…

    編程 2025-04-28
  • Elasticsearch API使用用法介紹-get /_cat/allocation

    Elasticsearch是一個分散式的開源搜索和分析引擎,支持全文檢索和數據分析,並且可伸縮到上百個節點,處理PB級結構化或非結構化數據。get /_cat/allocation…

    編程 2025-04-28
  • 全能的wpitl實現各種功能的代碼示例

    wpitl是一款強大、靈活、易於使用的編程工具,可以實現各種功能。下面將從多個方面對wpitl進行詳細的闡述,每個方面都會列舉2~3個代碼示例。 一、文件操作 1、讀取文件 fil…

    編程 2025-04-27
  • Elasticsearch Scroll Java的使用指南

    本文旨在詳細介紹如何使用Elasticsearch Scroll Java。Elasticsearch Scroll Java是一種高效的遍歷大型數據集的方法。通過它,我們可以逐個…

    編程 2025-04-27
  • SOXER: 提供全面的音頻處理功能的命令行工具

    SOXER是一個命令行工具,提供了強大、靈活、全面的音頻處理功能。同時,SOXER也是一個跨平台的工具,支持在多個操作系統下使用。在本文中,我們將深入了解SOXER這個工具,並探討…

    編程 2025-04-27
  • 神經網路代碼詳解

    神經網路作為一種人工智慧技術,被廣泛應用於語音識別、圖像識別、自然語言處理等領域。而神經網路的模型編寫,離不開代碼。本文將從多個方面詳細闡述神經網路模型編寫的代碼技術。 一、神經網…

    編程 2025-04-25
  • Linux sync詳解

    一、sync概述 sync是Linux中一個非常重要的命令,它可以將文件系統緩存中的內容,強制寫入磁碟中。在執行sync之前,所有的文件系統更新將不會立即寫入磁碟,而是先緩存在內存…

    編程 2025-04-25
  • git config user.name的詳解

    一、為什麼要使用git config user.name? git是一個非常流行的分散式版本控制系統,很多程序員都會用到它。在使用git commit提交代碼時,需要記錄commi…

    編程 2025-04-25

發表回復

登錄後才能評論