目录
ES基础查询
1、充分理解倒排索引及token的概念
搜索引擎其实跟我们的使用图书很相似,下面我来对图书和搜索引擎进行一个简单的类比,来看一下搜素引擎中正排和倒排索引。
- 图书
- 正排索引-目录页
- 倒排索引-索引页
- 搜索引擎
- 正排索引-文档 Id 到文档内容和单词的关联
- 倒排索引-单词到文档 Id 的关系
2、倒排索引的核心组成
倒排列表的元数据结构:
(DocID;TF;<POS>)
其中:
- DocID:出现某单词的文档ID
- TF(词频):单词在该文档中出现的次数
- POS:单词在文档中的位置
则它们生成的倒排索引
3、存储并索引
只有被analyze后生成的索引存储下来后才能被搜索到,单纯的存储不analyze的数据不能被搜索,但可以读取出来展示给用户
4、 利用analyze api搜索
建立索引
PUT /employee/_doc/1
{
"name": "Eating an apple a day & keeps the doctor away",
"age": 30
}
然后搜索
GET /employee/_search
{
"query":{
"match": {"name":"eat"}
}
}
没搜到后使用analyze api查看分析处理结果,可以看到没有分出eat,所以搜不到,改成用english分词器做
GET /employee/_analyze
{
"field":"name",
"text":"Eating an apple a day & keeps the doctor away"
}
重新创建索引
PUT /employee
{
"settings" : {
"number_of_shards" : 1,
"number_of_replicas" : 1
},
"mappings" : {
"properties" : {
"name" : { "type" : "text","analyzer": "english"},
"age" : {"type":"integer"}
}
}
在用analyze api,可以看到eat
GET /employee/_analyze
{
"field":"name",
"text":"Eating an apple a day & keeps the doctor away"
}
英文分析器的步骤
- 1.字符过滤 &过滤掉
- 2.字符处理 以空格和标点符号分割
- 3.分词过滤 变小写,去掉停用词(the),同义词,词干转化器
-
5、field类型
-
类型 说明 text
被分析索引的字符串类型
keyword
不能被分析只能被精确匹配的字符串类型
date
日期时间类型 可以配合
format一起使用({"type":"date","format":"yyyy-MM-dd"})
数字类型:long,integer,short,double等
-
boolean类型:true,false
array类型:[“one”,“two”]等
object类型:json嵌套{“property1”:“value1”,“property2”:“value2”}
ip:ip类型
geo_point:地理位置类型 -
地址定义
-
{ "mappings": { "_doc": { "properties": { "location": { "type": "geo_point" } } } } }
建立索引
-
"location": { "lat": 41.12, "lon": -71.34 }