映射
- 前面我们创建的索引以及插入数据,都是由Elasticsearch进行自动判断类型,有些时候我们是需要进行明确字段类型的,否则,自动判断的类型和实际需求是不相符的。
- 自动判断的规则如下:
- Elasticsearch中支持的类型如下:
- text和keyword的区别
- 准确数据类型: keyword,直接被存储为了二进制,检索时我们直接匹配,不匹配就返回false 没有进行分词操作. 只能通过精确值搜索到。
- 全文文本类型: text,这个的检索不是直接给出是否匹配,而是检索出相似度,进行分词操作, 并按照相似度由高到低返回结果
创建映射索引
- put localhost:9200/jie
{
"settings": {
"index": {
"number_of_shards": "2",
"number_of_replicas": "0"
}
},
"mappings": {
"person": {
"properties": {
"name": {
"type": "text"
},
"age": {
"type": "integer"
},
"mail": {
"type": "keyword"
},
"hobby": {
"type": "text"
}
}
}
}
}
- 查看映射 localhost:9200/jie/_mapping
{
"jie": {
"mappings": {
"person": {
"properties": {
"age": {
"type": "integer"
},
"hobby": {
"type": "text"
},
"mail": {
"type": "keyword"
},
"name": {
"type": "text"
}
}
}
}
}
}
结构化查询
term查询
- 主要用于精确匹配哪些值,比如数字,日期,布尔值或 not_analyzed 的字符串(未经分析的文本数据类型):
// 查询格式
{ "term": { "age": 26 }}
{ "term": { "date": "2014-09-01" }}
{ "term": { "public": true }}
{ "term": { "tag": "full_text" }}
terms查询
- terms 跟 term 有点类似,但 terms 允许指定多个匹配条件。 如果某个字段指定了多个值,那么文档需要一起去做匹配:
//格式
{
"terms": {
"tag": ["search","full_text","nosql"]
}
}
range查询
- range 过滤允许我们按照指定范围查找一批数据
// 格式
{
"range": {
"age": {
"gte": 20,
"lt": 30
}
}
}
exists查询
- exists 查询可以用于查找文档中是否包含指定字段或没有某个字段,类似于SQL语句中的 IS_NULL 条件
//格式 :
//如下表示查询title字段不为空的数据 相当于sql的 is not null
{
"exists": {
"field": "title"
}
}
match查询
- match 查询是一个标准查询,不管你需要全文本查询还是精确查询基本上都要用到它。
- 如果你使用 match 查询一个全文本字段,它会在真正查询之前用分析器先分析 match 一下查询字符
"match": {
"content" : {
"字段名称" : "查询内容"
}
}