您的位置:

深入探究ES高亮

一、高亮的作用

ES高亮是一种在搜索结果中标识用户查询的关键词的方法,此功能广泛应用于搜索引擎和文本编辑器中。在搜索结果列表中,高亮文本可以帮助用户快速找到相关的信息,提高搜索效率。在文本编辑器中,高亮文本可以帮助用户识别不同的代码语言,减少错误。

二、高亮实现的两种方式

1. 基于字段高亮

基于字段高亮是指将搜索结果中匹配的关键词标记,只标记匹配的字段。可以通过设置字段映射和搜索时指定搜索字段来实现。

PUT my_index/_mapping
{
  "properties": {
    "content": {
      "type": "text",
      "analyzer": "standard"
    }
  }
}

GET my_index/_search
{
  "query": {
    "match": {
      "content": "es 高亮"
    }
  },
  "highlight": {
    "fields": {
      "content": {}
    }
  }
}

2. 基于查询高亮

基于查询高亮是指将搜索结果中匹配的关键词标记,包括所有匹配的部分,不只是字段中匹配的部分。可以通过在查询中指定高亮选项来实现。

GET my_index/_search
{
  "query": {
    "match": {
      "content": "es 高亮"
    }
  },
  "highlight": {
    "require_field_match": false,
    "fields": {
      "content": {}
    }
  }
}

三、高亮的配置选项

1. 简单配置

可以使用默认的高亮选项,只需要在查询中添加highlight字段即可。

GET my_index/_search
{
  "query": {
    "match": {
      "content": "es 高亮"
    }
  },
  "highlight": {}
}

2. 定制标记样式

可以通过设置pre_tags和post_tags选项来定制标记的样式。

GET my_index/_search
{
  "query": {
    "match": {
      "content": "es 高亮"
    }
  },
  "highlight": {
    "pre_tags": [""],
    "post_tags": [""],
    "fields": {
      "content": {}
    }
  }
}

3. 控制标记数量

可以通过设置fragment_size和number_of_fragments选项来控制每个字段的标记数量和标记的大小。

GET my_index/_search
{
  "query": {
    "match": {
      "content": "es 高亮"
    }
  },
  "highlight": {
    "fields": {
      "content": {
        "fragment_size": 100,
        "number_of_fragments": 3
      }
    }
  }
}

4. 针对不同字段设置不同选项

可以为不同的字段设置不同的高亮选项,只需要在highlight选项中指定每个字段的配置。

GET my_index/_search
{
  "query": {
    "match": {
      "content": "es 高亮"
    }
  },
  "highlight": {
    "fields": {
      "title": {"pre_tags": [""], "post_tags": [""]},
      "content": {"pre_tags": [""], "post_tags": [""], "number_of_fragments": 3}
    }
  }
}

四、高亮的性能优化

1. 使用缓存

ES高亮对于大量数据或者复杂查询非常消耗资源,可以通过禁用高亮缓存或者增加缓存大小来提高性能。

PUT my_index/_settings
{
  "index.highlight.max_analyzed_offset": 1000000,
  "index.highlight.max_phrase_window": 500
}

2. 避免不必要的高亮

可以使用pre_tags和post_tags选项来避免对不必要的字段进行高亮。

GET my_index/_search
{
  "query": {
    "match": {
      "title": "es 高亮"
    }
  },
  "highlight": {
    "fields": {
      "title": {"pre_tags": [], "post_tags": []},
      "content": {"pre_tags": [""], "post_tags": [""], "number_of_fragments": 3}
    }
  }
}

3. 压缩标记文本

可以使用encoder选项来压缩标记文本,减少网络传输的数据量。

GET my_index/_search
{
  "query": {
    "match": {
      "content": "es 高亮"
    }
  },
  "highlight": {
    "encoder": "html",
    "fields": {
      "content": {}
    }
  }
}

五、总结

ES高亮是一种强大的搜索功能,可以帮助用户快速找到相关信息。通过灵活的配置选项和性能优化,可以提高搜索效率和用户体验。