5.8.1.2-Elasticsearch-调研

优质
小牛编辑
127浏览
2023-12-01

1.1 倒排索引原理

倒排索引原理举例.PNG 倒排索引原理.PNG

1.2 倒排索引构成

  • 单词词典,记录所有文档的单词,记录单词到倒排列表之间的关联信息。
  • BTree,倒排索引项(Posting)。
  • 文档 Id,用户获取原始信息
  • 单词频率,记录该单词在该文档中出现的次数,用户后续相关性分析
  • 位置,记录单词在文档中的分词位置,用于做词语检索。
  • 偏移(Offset),记录单词在文档的开始和结束为止,用于高亮显示。 对每个属性建立倒排索引。 分词器

    1.2 关键词解释

    | 名称 | 定义 |
    | ------ | ------ | | 索引 | 含有相同属性的文档集合,类似于数据库。 | | 类型 | 索引可以定义一个或多个类型,文档必须属于一个类型,类似于表。| | 文档 | 可以被索引的基本数据单位,类似于记录。 | | 分片 | 每个索引有多个分片,每个分片是一个 Lucene 索引。| | 副本 | 拷贝一个分片就形成该分片的一个副本。| |Mapping|类似于数据库中的表结构定义,主要作用如下:(1)定义 Index 下的字段名(Field Name);(2)定义 字段的类型,比如数值型、字符串型、布尔型等;(3)定义倒排索引相关的配置,比如是否索引、记录 position 等。|

    2. Rest API

    2.1 Mapping 设置

    创建索引:分片数为3,副本数位1的索引,该索引中包含一个 man 类型和一个 woman 类型,其中 man 类型包括 "name"、"country"、"age"和"date"属性。
192.168.102.16:9200/people PUT
{
  "settings":{
        "number_of_shards":3,
        "number_of_replicas":1
  },
  "mapping":{
        "man":{
                "properties":{
                        "name":{
                                "type":"text"
                        },
                        "country":{
                                "type":"keyword"
                        },
                        "age":{
                                "type":"integer"
                        },
                        "date":{
                                "type":"date",
                                "format":"yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
                        }
                }
        },
        "woman":{
        }
  }
}

2.2 增加文档

指定文档 id

192.168.102.16:9200/people/man/1 PUT
{
  "name":"wlj",
  "country":"china",
  "age":"24",
  "date":"1994-06-01"
}

不指定文档 id

192.168.102.16:9200/people/man PUT
{
  "name":"wlj",
  "country":"china",
  "age":"24",
  "date":"1994-06-01"
}

2.3 修改文档

将 id 为 1 的文档 name 属性改为 "wlj1"

192.168.102.16:9200/people/man/1/_update POST
{
        "doc":{
  "name":"wlj1"
        }
}

2.4 Search API

2.4.1 全量查询

192.168.102.16:9200/book/_search POST
{
  "query":{
        "match_all":{}
  }
}

全量查询,返回第一条。

{
  "query":{
        "match_all":{}
  },
  "from":1,
  "size":1
}

2.4.2 主键查询

192.168.102.16:9200/book/novel/1 GET

2.4.3 全文检索

match_phrase 和 match 的区别:关键词出现顺序一致,使用 slop 设置差异度。

{
  "query":{
        "match":{
                "title":"jinpingmei"
        }
  }
}

指定排序方法

{
  "query":{
        "match_phrase":{
                "title":"jinpingmei"

        }
  },
  "sort":[
                {"publish_date":{"order":"desc"}}
        ]
}

多个字段查询(Multi_Match),查询 "author" 属性或者 "title" 属性含有 "jinpingmei" 的图书

{
  "query":{
        "multi_match":{
                "query":"jinpingmei",
                "fields":["author","title"]
        }
  }
}

查询文本属性中含有 "jinpingmei" 或者 "yiming" 的图书

{
  "query":{
        "query_string":{
                "query":"jinpingmei OR yiming"
        }
  }
}

2.4.4 等值查询

查询字数 为 400000 的图书

{
  "query":{
        "term":{
                "word_count":"400000"
        }
  }
}

2.4.5 范围查询

查询出版日期 1990-06-01 至今的图书。

192.168.102.16:9200/book/_search POST
{
  "query":{
        "range":{
                "publish_date":{
                        "lte":"now",
                        "gte":"1990-06-01"

                }
        }
  }
}

2.4.6 复合查询

查询 "word_count" 等于 400000 或"title" 等于 "xiyouji" 的文档

192.168.102.16:9200/book/_search POST
{
  "query":{
        "bool":{
                "should":[
                        {
                                "match":{
                                        "word_count":400000
                                }
                        },
                        {
                                "match":{
                                        "title":"xiyouji"
                                }
                        }
                ]
        }
  }
}

查询 "author" 等于 "yiming","title" 等于 "jinpingmei","word_count" 等于 400000 的文档

192.168.102.16:9200/book/_search POST
{
  "query":{
        "bool":{
                "must":[
                        {
                                "match":{
                                        "authro":"yiming"
                                }
                        },
                        {
                                "match":{
                                        "title":"jinpingmei"
                                }
                        }
                ],
                "filter":[{
                        "term":{
                                "word_count":400000
                        }
                }]
        }
  }
}

查询 "author" 不等于 "yiming" 的文档

{
  "query":{
        "bool":{
                "must_not":{
                        "term":{
                                "authro":"yiming"
                        }
                }

        }
  }
}

2.4.7 聚合查询

按 "publish_date" 聚合计数

{
  "aggs":{
        "group_by_publish_date":{
                "terms":{
                        "field":"publish_date"
                }
        }
  }
}

查询 "publish_date" 的统计值

{
  "aggs":{
        "grades_publish_date":{
                "stats":{
                        "field":"publish_date"
                }
        }
  }
}

查询 "publish_date" 的最小值

{
  "aggs":{
        "grades_publish_date":{
                "min":{
                        "field":"publish_date"
                }
        }
  }
}

2.4.8 指定索引

URL功能
/_search查询所有的索引。
/my_index/_search查询单个索引。
/my_index1,my_index2/_search查询多个索引。
/my_*/_search使用通配符查询多个索引。

2.4.9 关键字

关键字功能
"profile":true显示查询过程。
explain显示相关性算分过程。

参考资料