全文检索底层采用的是倒排索引
为什么倒排索引比数据库的B-Tree查询效率要高?
ES引擎把文档数据写入到倒排索引(Inverted Index)的数据结构中,倒排索引建立的是分词(Term)和文档(Document)之间的映射关系,在倒排索引中,数据是面向词(Term)而不是面向文档的。
一个倒排索引由文档中所有不重复词的列表构成,对于其中每个词,有一个包含它的文档列表
序号 |
文档内容 |
1 |
小明是一家科技公司的创始人,开的汽车是奥迪a6,体验很好 |
2 |
小宇是一家科技公司的前台,开的汽车是保时捷911 |
3 |
小亮买了小宇的保时捷,体验很好 |
4 |
小洁是一家科技公司的开发主管,开的汽车是奥迪,体验很好 |
5 |
小娜是一家科技公司的开发,开的汽车是雪弗莱,体验一般 |
倒排索引会对 对象文档内容进行关键字分词,可以使用关键字词直接定位到文档内容。
单词ID |
单词 |
倒排列表 docId |
1 |
小 |
1,2,3,4,5 |
2 |
一家 |
1,2,4,5 |
3 |
开发 |
4,5 |
4 |
汽车 |
1,2,4,5 |
5 |
奥迪 |
1,4 |
6 |
体验很好 |
1,3,4 |
7 |
保时捷 |
2,3 |
8 |
保时捷911 |
2 |
雪弗莱 |
5 |
在Kibana中添加若干条数据
POST /chixing/user/6 { "name":"xiaoyu", "age":21, "gender":"M", "car":"奥迪" } POST /chixing/user/7 { "name":"xiaona", "age":22, "gender":"F", "car":"保时捷" } POST /chixing/user/8 { "name":"xiaoming", "age":21, "gender":"M", "car":"雪弗莱" } POST /chixing/user/9 { "name":"xiaojie", "age":21, "gender":"M", "car":"宝马" } ## insert data without special id,generate id automatically ##添加的数据没有主键,会自生成主键 POST /chixing/user/ { "name":"xiaofeng", "age":21, "gender":"M", "car":"宝马" }
查询数据的语法
# get data by id GET /chixing/user/9 GET /chixing/user/FyQ-P3EBhgCvuwOUebKs # get all data 查询所有 GET /chixing/user/_search # get some data by some assigned id , 根据一部分主键查询数据 GET /chixing/user/_mget { "ids": ["7","8"] }
复杂条件查询
#根据其他字段查询,如根据年龄查询 GET /chixing/user/_search?q=age:21 # 区间查询 GET /chixing/user/_search?q=age[22 TO 30] # 查询年龄在20-30之间,并且按照年龄降序、从第0条数据到第1条数据 GET /chixing/user/_search?q=age[22 TO 30]&sort=age:desc&from=0&size=1 # 查询年龄在20-30之间,并且按照年龄降序、从第0条数据到第1条数据,展示name和age字段 GET /chixing/user/_search?q=age[22 TO 30]&sort=age:desc&from=0&size=1&_source=name,age
DSL语言查询与过滤
ES中查询请求有两种方式,一种格式简易版拆线呢,另一种是使用JSON完整的请求体,叫做结构化查询DSL 由于DSL查询更为直观简易,所以大都使用这种方式 DSL查询时POST过去一个json,由于POST的请求是json格式的,所以存在很多灵活性,也有很多形式。
根据名称精确查询姓名
## term 是精确查询 GET chixing/user/_search { "query": { "term": { "name": "walter" } } } ## match 支持分词查询 GET chixing/user/_search { "query": { "match": { "car": "奥" } } } ## match 是模糊 查询 ## limit 0,1 (分页查询 ) GET chixing/user/_search { "from": 0, "size": 1, "query": { "match": { "car": "奥" } } }
term 与match的区别
term 查询不会对字段进行分词查询,会采用精确匹配 match会根据该字段的分词器,进行分词查询