elastic search的使用优化

批量导入和导出工具

  1. Elasticsearch索引迁移的四种方式

给出了elasticsearch-dump 和Elasticsearch-Exporter 两种方式导出数据,

问题:基于 ES 都是比较老的版本,所以说不一定能用。并且最好是能够操作docker 的那种。

  1. elasticsearch导出、导入工具-elasticdump

elasticdump 是可以使用docker 安装的,但是这个教程是使用 npm 安装的。可以实现导入数据

1
elasticdump --input /data/shining_index.json --output http://172.16.3.5:9200/shining_index

(一般来说 需要先创建mapping 关系之后再导入数据)

导出数据到文件也能够实现

1
2
3
4
5
6
7
8
elasticdump \
  --input=http://172.16.3.5:9200/shining_index \
  --output=/data/shining_index_mapping.json \
  --type=mapping
elasticdump \
  --input=http://172.16.3.5:9200/shining_index \
  --output=/data/shining_index.json \
  --type=data

结论: 可以尝试使用docker 安装试一下的

  1. elasticsearch-dump 迁移es数据 (elasticdump)

接着上面关于 elasticdump 补充

使用功能指定查询条件,那么就可以对查询结果备份。如果按照日期进行查询,那么可以迁移指定时间段内的数据。

1
2
3
4
5
# 把一个查询结果备份到文件中
elasticdump \
  --input=http://production.es.com:9200/my_index \
  --output=query.json \
  --searchBody '{"query":{"term":{"username": "admin"}}}'
  1. elasticsearch-dump

看了这个github,发现 elasticsearch dump 是一个更加可行的方案。

  1. Backup and Restore ElasticSearch databases using Docker

四年之前的英文教程,可以参考一下。

  1. 23个最有用的Elasticsearch检索技巧

Fuzzy 模糊检索( Fuzzy Queries)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
GET bookdb_index/book/_search
{
  "query": {
    "multi_match": {
      "query": "comprihensiv guide",
      "fields": ["title","summary"],
      "fuzziness": "AUTO"
    }
  },
  "_source": ["title","summary","publish_date"],
  "size": 2
}

那么既然是可以将field 设置为 fields,那么其实就可以使用单个字段拼接的呀(但是这个不知道对于检索的速度有没有影响)

ES 中的组合查询

  1. 基于bool 实现的组合查询

Elasticsearch bool query小结

这个给出了一个es 组合查询时候的一个case,非常建议好好看看总结一下。

  1. ES 自带的多字段检索 (Multi-field Search)

下面是对 multi match 很好的总结文档

multi_match 官方文档 Elasticsearch Query DSL 整理总结—— Multi Match Query

autocompletion

Elasticsearch 的使用优化 中介绍过自动匹配技术,但是没有成型。这里可以再补充一点:使用 match_phrase_prefix 进行前缀查询

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
GET bookdb_index/book/_search
{
  "query": {
    "match_phrase_prefix": {
      "summary": {
        "query": "search en",
        "slop": 3,
        "max_expansions": 10
      }
    }
  },
  "_source": ["title","summary","publish_date"]
}

analyzer 进行分词

分词器是专门处理分词的组件,Analyzer 由三部分组成

  • Character Filters (针对原始文本处理,例如去除 html)
  • Tokenizer(按照规则切分为单词)
  • Token Filter (将切分的单词进行加工,小写,删除 stopwords,增加同义语)

内置的分词器

不同的 analyzer 意味着不同的检索方式。

  • Standard Analyzer - 默认分词器,按词切分,小写处理
  • Simple Analyzer - 按照非字母切分(符号被过滤),小写处理
  • Stop Analyzer - 小写处理,停用词过滤(the ,a,is)
  • Whitespace Analyzer - 按照空格切分,不转小写
  • Keyword Analyzer - 不分词,直接将输入当做输出
  • Patter Analyzer - 正则表达式,默认 \W+
  • Language - 提供了 30 多种常见语言的分词器
  • Customer Analyzer 自定义分词器

从下面的链接中可以查看不同 analyzer 的实际效果

es的分词器analyzer

其他问题

  1. 性能问题,使用filter 和使用 bool 实现相同的功能,两者在时间或者内存使用上的差别。

  2. Function 得分:衰减函数( Function Score: Decay Functions ), 这点可以继续探索一下

参考资料

  1. 23个最有用的Elasticsearch检索技巧