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/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

发表回复

登录后才能评论