什么是全文检索?
将非结构化数据中的一部分信息提取出来,重新组织,使其变得有一定的结构,然后对此有一定结构的数据进行搜索,从而达到搜索相对较快的目的。这部分从非结构化数据中提取出来的然后重新组织的信息,我们称之为索引。
例如:字典,字典的拼音表和部首检字表就相当于字典的索引,对每一个字的解释是非结构化的,如果字典么有音节表或部首检字表,早茫茫辞海中找一个字只能顺序扫描。然而字的某些信息可以提取出来进行结构化处理,比如读音,就笔记结构化,分声母和韵母,分别只有几种可以一一举例,于是将读音拿出来按一定顺序排序,每一项读音都指向此字的详细解释的页数,我们搜索时按结构化的拼音搜索读音,然后按其指向的页数,便可找到我们非结构化数据意义也即对字节的解释。
这种先建立索引,在对索引进行搜索的过程就叫全文检索(Full-text Search)
虽然创建索引的过程也是非常耗时的,但是索引一旦创建就可以多次使用,全文检索主要处理的是查询,所以耗时时间创建索引也是值得的。
IK分词器
ik_smart 既能满足英文的要求,又更智能更轻量,占用存储最小
standard 对英语支持是最好的,但是对中文是简单暴力每个字建一个反向索引,浪费存储空间而且果很c差
ik_max_word 比 ik_smart 对中文的支持更全面,但是存储上的开销实在太大,不建议使用
Kibana安装
启动容器。–restart=always表示开启自启。
DSL语句使用
Query DSL结构化查询介绍
Query DSL是一个Java开源框架用于构建类型安全的SQL查询语句。采用API代替传统的拼接字符串来构造查询语句。目前Querydsl支持的平台包括JPA,JDO,SQL,Java Collections,RDF,Lucene,Hibernate Search。elasticsearch提供了一整套基于JSON的查询DSL语言来定义查询。 Query DSL当作是一系列的抽象的查询表达式树(AST)特定查询能够包含其它的查询,(如 bool ), 有些查询能够包含过滤器(如 constant_score), 还有的可以同时包含查询和过滤器 (如 filtered). 都能够从ES支持查询集合里面选择任意一个查询或者是从过滤器集合里面挑选出任意一个过滤器, 这样的话,我们就可以构造出任意复杂的查询了。
创建索引
PUT /user
创建映射
PUT /user/userinfo/_mapping
{
"properties": {
"name":{
"type": "text",
"store": false,
"analyzer": "ik_smart",
"search_analyzer": "ik_smart"
},
"age":{
"type": "long",
"store": false
},
"city":{
"type": "text",
"store": false,
"analyzer": "ik_smart",
"search_analyzer": "ik_smart"
},
"description":{
"type": "text",
"store": false,
"analyzer": "ik_smart",
"search_analyzer": "ik_smart"
}
}
}
删除索引
DELETE /skuinfo
查询所有
GET /_cat/indices
// ?v:显示列名
GET /_cat/indices?v
创建文档
PUT /user/userinfo/1
{
"name":"张三",
"age":20,
"city":"深圳",
"description":"张三哈哈哈哈"
}
更新文档
//使用PUT更新
PUT /user/userinfo/1
{
"name":"更新",
"age":60
}
//使用POST更新
POST /user/userinfo/1/_update
{
"doc": {
"name":"更新",
"age":18
}
}
删除文档
DELETE user/userinfo/1
查询文档
//查询所有
GET /user/_search
//查询指定id
GET /user/userinfo/1
Sort排序
GET /user/_search
{
"sort": [
{
"age": {
"order": "asc"
}
}
]
}
分页
GET user/_search
{
"sort": [
{
"age": {
"order": "asc"
}
}
]
, "from": 0
, "size": 10
}