十次方学习——elasticsearch(6)

一、ElasticSearch

  • elasticsearch 是一个分布式的搜索引擎,处理速度非常快,基于 Lucenc,使用时要用 restful 风格的接口。
  • 它有三层结构:索引(index);类型(type)和文档(document)。分别对应关系型数据库的 database,table 和 row。
  • 它运行的端口有两个:9200是 http 协议使用,9300是 tcp 协议使用。
  • 使用:
    1. 下载 elasticsearch,尽量使用成熟的版本例如 5.6.8。在bin目录执行命令 elasticsearch 启动服务。
    2. 基本操作:post 请求为添加文档,put 请求为新建索引或修改文档,get 请求为查询,delete 请求为删除文档。
    3. 为使用方便,需安装 head 插件,修改 elasticsearch 的配置使其可以跨域访问,安装完毕后在根目录下执行 grunt server 启动服务,在 9100 端口访问该服务。
    4. 若需为中文分词需给 elasticsearch 安装 IK 分词器。
  • 基本软件安装完毕后开发相关的微服务:
    1. 添加 elasticsearch 的启动器;
    2. 在 application.yml 中添加 elasticsearch 的配置;
    3. 相关的文档类型也就是实体类需要添加 @Document(indexName=“索引名”,type=“文档类型”) 注解,需要搜索并分词的字段还需要添加 @Field(index= true,analyzer=“ik_max_word”,searchAnalyzer=“ik_max_word”,type=FieldType.Auto) 注解。
    4. dao 层需要继承 ElasticsearchRepository 接口。
  • 与数据库同步:
    1. 安装 logstash,在根目录下创建一个英文名称的文件夹例如 mysqletc,在该文件夹下创建一个后缀为conf的配置文件例如 mysql.conf,配置数据源和输出的位置,在 bin 目录下执行 logstash -f …/mysqletc/mysql.conf即可启动 logstash 服务;
    2. 在对应的数据库表中进行增删改查操作,在 head 中观察数据是否更新。一般情况下,删除操作不会在 elasticsearch 中生效。

二、倒排索引

  1. 结构:单词词典、倒排列表、倒排文件。
  2. 传统的搜索一般是根据 id 查询 value,倒排索引是根据 value 查询 id,这是倒排索引中最基本的概念。这显然和搜索的方式和内容有关。
  3. 由单词-文档矩阵是单词去定位某个文档的一种较好的模型。其行表示索引中出现的所有单词(中文的单词需要专门的分词器来生成,行数据是该索引中所有文档中的不重复单词),列表示某个文档包含的所有单词,每个单词都有一个 ID(系统自动生成),每个文档也有 ID(多半是用户指定)。
  4. 单词词典有两种实现方式:
    • 哈希+链表,主体部分是一个哈希表,每项保存一个指针,指针指向冲突链(保存具有相同哈希值的单词)。在建立索引过程中词典也会被建立起来,计算每个不同单词的哈希值,保存在对应的冲突链中。查询过程和其类似,只是不存在的单词不会保存。
    • 树形结构(一般指 B+ 树)。
    • 其中单词字典的结构直接影响查询的效率,每个单词项还会记录对应倒排列表的位置信息。
  5. 倒排索引就是实现单词-文档矩阵的一种具体存储形式。例如有 n 个文档,最终就是对该文档集合建立倒排索引,将文档集合中所有的单词取出并为其编号(建立单词词典),同时建立倒排列表,其中存储了该单词在哪些文档中出现,实际情况中还可能会存储该 单词在文档出现的频率及位置。建立完毕后会保存到磁盘中,一般称为倒排文件。
  6. 查询时一般是输入某个单词,然后在单词词典中查询到该单词对应的倒排列表信息,这时一般会查询到多个文档id,最后再根据某种算法对结果进行排序并返回最终结果。

猜你喜欢

转载自blog.csdn.net/qq_44628734/article/details/121053686