目录
响应结果解释:
映射与分析
分析 包含下面的过程:
- 首先,将一块文本分成适合于倒排索引的独立的 词条 ,
- 之后,将这些词条统一化为标准格式以提高它们的“可搜索性”,或者 recall
date
域包含一个精确值:单独的词条2014-09-15
。_all
域是一个全文域,所以分词进程将日期转化为三个词条:2014
,09
, 和15
。
GET /_search?q=2014-09-15 # 12 results ! all域 GET /_search?q=date:2014-09-15 # 1 result date域 GET /_search?q=date:2014 # 0 results ! date域
测试分词器
GET /_analyze { "analyzer": "standard", "text": "Text to analyze" }
映射
Elasticsearch 支持如下简单域类型:
- 字符串:
string
- 整数 :
byte
,short
,integer
,long
- 浮点数:
float
,double
- 布尔型:
boolean
- 日期:
date
一般我们使用Json,ES会动态映射,猜测出数据类型。
JSON type | 域 type |
布尔型: |
|
整数: |
|
浮点数: |
|
字符串,有效日期: |
|
字符串: |
|
味着如果你通过引号( "123"
)索引一个数字,它会被映射为 string
类型,而不是 long
。但是,如果这个域已经映射为 long
,那么 Elasticsearch 会尝试将这个字符串转化为 long ,如果无法转化,则抛出一个异常。
查询映射
GET bank/_mapping
自定义域
域最重要的属性是 type
。对于不是 string
的域,你一般只需要设置 type
index
index
属性控制怎样索引字符串。它可以是下面三个值:
analyzed
首先分析字符串,然后索引它。换句话说,以全文索引这个域。
not_analyzed
索引这个域,所以它能够被搜索,但索引的是精确值。不会对它进行分析。
no
不索引这个域。这个域不会被搜索到。
string
域 index
属性默认是 analyzed
。如果我们想映射这个字段为一个精确值,我们需要设置它为 not_analyzed
:
{ "tag": { "type": "string", "index": "not_analyzed" } }
其他简单类型(例如 long
, double
, date
等)也接受 index
参数,但有意义的值只有 no
和 not_analyzed
, 因为它们永远不会被分析。
analyzer
对于 analyzed
字符串域,用 analyzer
属性指定在搜索和索引时使用的分析器。默认, Elasticsearch 使用 standard
分析器, 但你可以指定一个内置的分析器替代它,例如 whitespace
、 simple
和 english
:
{ "tweet": { "type": "string", "analyzer": "english" } }
查询
请求体查询 | Elasticsearch: 权威指南 | Elastic
一个查询语句的典型结构
QUERY_NAME:{
ARGUMENT:VALUE,
ARGUMENT:VALUE,...
}
如果针对于某个字段,那么它的结构如下
{
QUERY_NAME:{
FIELD_NAME:{
ARGUMENT:VALUE,
ARGUMENT:VALUE,...
}
}
}
验证查询
GET bank/_validate/query?explain
{
"query": {
"address" : {
"match" : "really powerful"
}
}
}
# 使用 explain 参数将返回可读的描述,这对准确理解 Elasticsearch 是如何解析你的 query
GET bank/_validate/query?explain
{
"query": {
"match" : {
"address" : "really powerful"
}
}
}
GET bank/_search
{
"query": {
"match_all": {}
},
"sort": [
{
"account_number": {
"order": "desc"
}
}
]
}
#返回部分字段
GET bank/_search
{
"query":{
"match_all":{
}
},
"from":0,
"size":5,
"_source":[
"age",
"balance"
]
}
#match【匹配查询】
#基本类型(非字符串),精确匹配
GET bank/_search
{
"query":{
"match":{
"account_number":"20"
}
}
}
#字符串,全文检索
GET bank/_search
{
"query":{
"match":{
"address":"mill address"
}
}
}
#match_phrase【短语匹配】
GET bank/_search
{
"query": {
"match_phrase": {
"address": "Hutchinson Court"
}
}
}
#multi_match【多字段匹配】
GET bank/_search
{
"query": {
"multi_match": {
"query": "Street Hutchinson",
"fields": ["address","lastname"]
}
}
}
#address 包含 mill,并且 gender 是 M,如果 address 里面有 lane 最好不过,但是 email 必 #须不包含 baluba.com
GET bank/_search
{
"query":{
"bool":{
"must":[
{
"match":{
"address":"mill"
}
},
{
"match":{
"gender":"M"
}
}
],
"should":[
{
"match":{
"address":"lane"
}
}
],
"must_not":[
{
"match":{
"email":"baluba.com"
}
}
]
}
}
}
#term 和march 一样。非字符使用term精确查询,字符使用match
GET bank/_search
{
"query":{
"bool":{
"must":[
{
"term":{
"age":{
"value":"28"
}
}
},
{
"match":{
"address":"990 Mill Road"
}
}
]
}
}
}
#filter【结果过滤】不进行算分
GET bank/_search
{
"query":{
"bool":{
"must":[
{
"match":{
"address":"Holmes"
}
}
],
"filter":{
"range":{
"balance":{
"gte":39224,
"lte":39226
}
}
}
}
}
}
#复杂:查出所有年龄分布,并且这些年龄段中 M 的平均薪资和 F 的平均薪资以及这个年龄 段的总体平均薪资
GET bank/_search
{
"query":{
"match_all":{
}
},
"aggs":{
"age_agg":{
"terms":{
"field":"age",
"size":100
},
"aggs":{
"gender_agg":{
"terms":{
"field":"gender.keyword",
"size":100
},
"aggs":{
"balance_avg":{
"avg":{
"field":"balance"
}
}
}
},
"balance_avg":{
"avg":{
"field":"balance"
}
}
}
}
},
"size":1000
}
添加
添加数据