当前位置:首页 > ES > 正文内容

elasticsearch高亮搜索highlight

phpmianshi1年前 (2019-07-13)ES39

概念


我们在浏览器上搜索文本时,发现我们输入的关键字有高亮显示,查看html源码就知道,高亮的部分是加了<em>标签的,ES也支持高亮搜索这种操作的,并且在返回的文档中自动加了<em>标签,兼容html5页面。


highlight基本语法

GET my_index/_search 
{
  "query": {
    "match": {
      "content": "happy"
    }
  },
  "highlight": {
    "fields": {
      "content": {}
    }
  }
}

highlight里面的参数即为高亮搜索的语法,指定高亮的字段为content,我们可以看到命中的happy里面带了<em>高亮标签,<em></em>表现在html上会变成红色,所以说你的指定的field中,如果包含了那个搜索词的话,就会在那个field的文本中,对搜索词进行红色的高亮显示。


highlight下的字段可以指定多个,这样就可以在多个字段命中的关键词进行高亮显示,例如:

GET my_index/_search 
{
  "query": {
    "match": {
      "content": "happy"
    }
  },
  "highlight": {
    "fields": {
      "name":{},
      "content": {}
    }
  }
}

三种高亮语法

有三种高亮的语法:

  1. plain highlight:使用standard Lucene highlighter,对简单的查询支持度非常好。

  2. unified highlight:默认的高亮语法,使用Lucene Unified Highlighter,将文本切分成句子,并对句子使用BM25计算词条的score,支持精准查询和模糊查询。

  3. fast vector highlighter:使用Lucene Fast Vector highlighter,功能很强大,如果在mapping中对field开启了term_vector,并设置了with_positions_offsets,就会使用该highlighter,对内容特别长的文本(大于1MB)有性能上的优势。


一般情况下,用plain highlight也就足够了,不需要做其他额外的设置 如果对高亮的性能要求很高,可以尝试启用unified highlight 如果field的值特别大,超过了1M,那么可以用fast vector highlight



自定义高亮html标签

我们知道高亮的默认标签是<em>,这个标签可以自己定义的,然后使用自己喜欢的样式:

GET my_index/_search 
{
  "query": {
    "match": {
      "content": "happy"
    }
  },
  "highlight": {
    "pre_tags": ["<tag1>"],
    "post_tags": ["</tag2>"], 
    "fields": {
      "content": {
        "type": "plain"
      }
    }
  }
}

高亮片段fragment的设置

针对一些很长的文本,我们不可能在页面上完整显示的,我们需要只显示有关键词的上下文即可,这里设置fragment就行:

GET my_index/_search
{
    "query" : {
        "match": { "content": "happy" }
    },
    "highlight" : {
        "fields" : {
            "content" : {"fragment_size" : 150, "number_of_fragments" : 3, "no_match_size": 150 }
        }
    }
}

fragment_size: 设置要显示出来的fragment文本判断的长度,默认是100。

number_of_fragments:你可能你的高亮的fragment文本片段有多个片段,你可以指定就显示几个片段。


版权声明:本文由PHP面试资料网发布,如需转载请注明出处。
分享给朋友:

相关文章

elasticsearch中mapping全解实战

Mapping简介#mapping 是用来定义文档及其字段的存储方式、索引方式的手段,例如利用mapping 来定义以下内容:哪些字段需要被定义为全文检索类型哪些字段包含number、dat...

elasticsearch模糊查询match match_phrase wildcard regexp prefix的区别

1.match查询会先对搜索词进行分词,比如“白雪公主和苹果”,会分成“白雪”“公主”“苹果”。含有相关内容的字段,都会被检索出来。2.match_phrase查询match_phrase与slop一...

logstash过滤器--mutate

概念filters/mutate 插件是 Logstash 另一个重要插件。它提供了丰富的基础类型数据处理能力。包括类型转换,字符串处理和字段处理等。Plugin version: v3.5.0执行顺...

elasticsearch用于html去标签化搜索

场景elasticsearch用于html去标签化搜索:即在Index的时候忽略html tag,同时又存储了完整的html,在使用的时候可以正常读出来。示例假设我们给content字段自定义anal...

elasticsearch中重新索引数据

概念虽然你可以给索引添加新的类型,或给类型添加新的字段,但是你不能添加新的分析器或修改已有字段。假如你这样做,已被索引的数据会变得不正确而你的搜索也不会正常工作。 修改在已存在的数据最简单的...

es的基本概念和原理

基本概念和原理 ES其实就是基于lucene之上封装的一个分布式 索引框架,所以lucene拥有的特性,它都是有的,同时因为它使基于分布式的,所以对很多的功能进行了扩展,要想掌握ES,需要先熟悉一...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。