1、term查询简介

term是表达语义的最小单位,在搜索的时候基本都要使用到term。 term查询的种类有:Term Query、Range Query等。 在ES中,Term查询不会对输入进行分词处理,将输入作为一个整体,在倒排索引中查找准确的词项。 我们也可以使用 Constant Score 将查询转换为一个filter,避免算分,利用缓存,提高查询的效 率。

2、term与terms

查询电影名字中包含有 beautiful 这个单词的所有的电影,用于查询的单词不会进行分词的处理

GET movies/_search
 {
     "query": {
         "term": {
             "title": {
                 "value": "beautiful"
             }
         }
     }
 }

查询电影名字中包含有 beautiful 或者 mind 这两个单词的所有的电影,用于查询的单词不会进行 分词的处理

GET movies/_search
 {
     "query": {
         "terms": {
             "title": [
                 "beautiful",
                 "mind"
             ]
         }
     }
 }

3、range

查询上映在2016到2018年的所有的电影,再根据上映时间的倒序进行排序

GET movies/_search
 {
     "query": {
         "range": {
             "year": {
                 "gte": 2016,
                 "lte": 2018
             }
          }
     },
     "sort": [
         {
             "year": {
                 "order": "desc"
             }
         }
     ]
 }

4、Constant Score

查询title中包含有beautiful的所有的电影,不进行相关性算分,查询的数据进行缓存,提高效率

GET movies/_search
 {
     "query": {
         "constant_score": {
             "filter": {
                 "term": {
                     "title": "beautiful"
                 }
             }
         }
     }
 }

5、全文查询

全文查询的种类有: Match Query、Match Phrase Query、Query String Query等 索引和搜索的时候都会进行分词,在查询的时候,会对输入进行分词,然后每个词项会逐个到底层进行 查询,将最终的结果进行合并

6、match

查询电影名字中包含有beautiful的所有电影,每页十条,取第二页的数据

GET movies/_search
 {
     "query": {
         "match": {
             "title": "beautiful"
         }
     },
     "from": 10,
     "size": 10
 }

查询电影名字中包含有 beautiful 或者 mind 的所有的数据,但是只查询title和id两个属性

GET movies/_search
 {
     "_source": ["title", "id"],
         "query": {
             "match": {
                 "title": "beautiful mind"
             }
         }
 }

7、match_phrase

查询电影名字中包含有 "beautiful mind" 这个短语的所有的数据

GET movies/_search
 {
     "query": {
         "match_phrase": {
             "title": "beautiful mind"
         }
     }
 }

注意:match_phrase和term区别

term是将传入的文本原封不动地(不分词)拿去查询。
match会对输入进行分词处理后再去查询,部分命中的结果也会按照评分由高到低显示出来。
match_phrase是按短语查询,只有存在这个短语的文档才会被显示出来。

也就是说,term和match_phrase都可以用于精确匹配,而match用于模糊匹配。

上面说的也不是很准确:

match_phrase总结如下:

  1. match_phrase还是分词后去搜的
  2. 目标文档需要包含分词后的所有词
  3. 目标文档还要保持这些词的相对顺序和文档中的一致

8、multi_match

查询 title 或 genre 中包含有 beautiful 或者 Adventure 的所有的数据

GET movies/_search
     {
     "query": {
         "multi_match": {
             "query": "beautiful Adventure",
             "fields": ["title", "genre"]
         }
     }
 }

9、match_all

查询所有的数据

GET movies/_search
 {
     "query": {
         "match_all": {}
     }
 }

10、query_string

查询 title 中包含有 beautiful 和 mind 的所有的电影

GET movies/_search
 {
     "query": {
         "query_string": {
             "default_field": "title",
             "query": "mind AND beautiful"
         }
     }
 }


或者

GET movies/_search
 {
     "query": {
         "query_string": {
             "default_field": "title",
             "query": "mind beautiful",
             "default_operator": "AND"
         }
     }
 }


 

11、simple_query_string

simple_query_string 覆盖了很多其他查询的用法。

查询 title 中包含有 beautiful 和 mind 的所有的电影

GET movies/_search
 {
     "query": {
         "simple_query_string": {
             "query": "beautiful + mind",
             "fields": ["title"]
         }
     }
 }

或者

GET movies/_search
 {
     "query": {
         "simple_query_string": {
             "query": "beautiful mind",
             "fields": ["title"],
             "default_operator": "AND"
         }
     }
 }

查询title中包含 "beautiful mind" 这个短语的所有的电影 (用法和match_phrase类似)

GET movies/_search
 {
     "query": {
         "simple_query_string": {
             "query": "\"beautiful mind\"",
             "fields": ["title"]
         }
     }
 }

查询title或genre中包含有 beautiful mind romance 这个三个单词的所有的电影 (与multi_match类似)

GET movies/_search
 {
     "query": {
         "simple_query_string": {
             "query": "beautiful mind Romance",
             "fields": ["title", "genre"]
         }
     }
 }

查询title中包含 “beautiful mind” 或者 "Modern Romance" 这两个短语的所有的电影

GET movies/_search
 {
     "query": {
         "simple_query_string": {
             "query": "\"beautiful mind\" | \"Modern Romance\"",
             "fields": ["title"]
         }
     }
 }

查询title或者genre中包含有 beautiful + mind 这个两个词,或者Comedy + Romance + Musical + Drama + Children 这个五个词的所有的数据

GET movies/_search
 {
     "query": {
         "simple_query_string": {
             "query": "(beautiful + mind) | (Comedy + Romance + Musical + Drama + Children)",
             "fields": ["title","genre"]
         }
     }
 }

查询 title 中包含 beautiful 和 people 但是不包含 Animals 的所有的数据

GET movies/_search
 {
     "query": {
         "simple_query_string": {
             "query": "beautiful + people + -Animals",
             "fields": ["title"]
         }
     }
 }

12、模糊搜索

查询title中从第6个字母开始只要最多纠正一次,就与 neverendign 匹配的所有的数据

GET movies/_search
 {
     "query": {
         "fuzzy": {
             "title": {
                 "value": "neverendign",
                 "fuzziness": 1,
                 "prefix_length": 5
             }
         }
     }
 }

13、多条件查询

查询title中包含有beautiful或者mind单词,并且上映时间在2016~1018年的所有的电影

GET movies/_search
 {
     "query": {
         "bool": {
             "must": [
                 {
                     "simple_query_string": {
                         "query": "beautiful mind",
                         "fields": ["title"]
                     }
                 },
                 {
                     "range": {
                         "year": {
                             "gte": 2016,
                             "lte": 2018
                         }
                     }
                 }
             ]
         }
     }
 }

查询 title 中包含有 beautiful 这个单词,并且上映年份在2016~2018年间的所有电影,但是不 进行相关性的算分

# filter不会进行相关性的算分,并且会将查出来的结果进行缓存,效率上比 query 高

GET movies/_search
 {
     "query": {
         "bool": {
             "filter": [
                 {
                     "term": {
                         "title": "beautiful"
                     }
                 },
                 {
                     "range": {
                         "year": {
                             "gte": 2016,
                             "lte": 2018
                         }
                     }
                 }
             ]
         }
     }
 }

14、Mapping

mapping类似于数据库中的schema,作用如下:

        1. 定义索引中的字段类型;

        2. 定义字段的数据类型,例如:布尔、字符串、数字、日期.....

        3. 字段倒排索引的设置

数据类型

es 字段 不分词 elasticsearch不分词查询_数据

Mapping的定义语法如下:

PUT users
 {
     "mappings": {
         // define your mappings here
     }
 }

定义mapping的建议方式: 写入一个样本文档到临时索引中,ES会自动生成mapping信息,通过访问 mapping信息的api查询mapping的定义,修改自动生成的mapping成为我们需要方式,创建索引,删 除临时索引,简而言之就是 “卸磨杀驴” 。

15、常见参数

1)index

      可以给属性添加一个 布尔类型的index属性,标识该属性是否能被倒排索引,也就是说是否能通过 该字段进行搜索。

2) null_value

在数据索引进ES的时候,当某些数据为 null 的时候,该数据是不能被搜索的,可以使用 null_value 属性指定一个值,当属性的值为 null 的时候,转换为一个通过 null_value 指 定的值。 null_value属性只能用于Keyword类型的属性

16、聚合查询

1)聚合搜索的语法格式如下:

GET indexName/_search
 {
     "aggs": {
         "aggs_name": { #聚合分析的名字是由用户自定义的
             "aggs_type": {
                 // aggregation body
             }
         }
     }
 }


2)给users索引创建mapping信息

es 字段 不分词 elasticsearch不分词查询_elasticsearch_02

3)往 users 索引中写入数据

PUT employee/_bulk
{"index": {"_id": 1}}
{"id": 1, "name": "Bob", "job": "java", "age": 21, "sal": 8000, "gender": "female"}
{"index": {"_id": 2}}
{"id": 2, "name": "Rod", "job": "html", "age": 31, "sal": 18000, "gender": "female"}
{"index": {"_id": 3}}
{"id": 3, "name": "Gaving", "job": "java", "age": 24, "sal": 12000, "gender": "male"}
{"index": {"_id": 4}}
{"id": 4, "name": "King", "job": "dba", "age": 26, "sal": 15000, "gender": "female"}
{"index": {"_id": 5}}
{"id": 5, "name": "Jonhson", "job": "dba", "age": 29, "sal": 16000, "gender": "male"}
{"index": {"_id": 6}}
{"id": 6, "name": "Douge", "job": "java", "age": 41, "sal": 20000, "gender": "female"}
{"index": {"_id": 7}}
{"id": 7, "name": "cutting", "job": "dba", "age": 27, "sal": 7000, "gender": "male"}
{"index": {"_id": 8}}
{"id": 8, "name": "Bona", "job": "html", "age": 22, "sal": 14000, "gender": "female"}
{"index": {"_id": 9}}
{"id": 9, "name": "Shyon", "job": "dba", "age": 20, "sal": 19000, "gender": "female"}
{"index": {"_id": 10}}
{"id": 10, "name": "James", "job": "html", "age": 18, "sal": 22000, "gender": "male"}
{"index": {"_id": 11}}
{"id": 11, "name": "Golsling", "job": "java", "age": 32, "sal": 23000, "gender":
"female"}
{"index": {"_id": 12}}
{"id": 12, "name": "Lily", "job": "java", "age": 24, "sal": 2000, "gender": "male"}
{"index": {"_id": 13}}
{"id": 13, "name": "Jack", "job": "html", "age": 23, "sal": 3000, "gender": "female"}
{"index": {"_id": 14}}
{"id": 14, "name": "Rose", "job": "java", "age": 36, "sal": 6000, "gender": "female"}
{"index": {"_id": 15}}
{"id": 15, "name": "Will", "job": "dba", "age": 38, "sal": 4500, "gender": "male"}
{"index": {"_id": 16}}
{"id": 16, "name": "smith", "job": "java", "age": 32, "sal": 23000, "gender": "male"}

4)单值的输出,ES中大多数的数学计算只输出一个值,如:min、max、sum、avg、cardinalit

    4.1)查询工资的总和

          

es 字段 不分词 elasticsearch不分词查询_搜索_03

    4.2)查询员工的平均工资

          

es 字段 不分词 elasticsearch不分词查询_java_04

    4.3)查询总共有多少个岗位, cardinality的值类似于sql中的 count distinct,即去重统计总数

           

es 字段 不分词 elasticsearch不分词查询_elasticsearch_05

    4.4)查询航班票价的最高值、平均值、最低值

           

es 字段 不分词 elasticsearch不分词查询_java_06

5)多值的输出,ES还有些函数,可以一次性输出很多个统计的数据: terms、stats

     5.1)查询工资的信息

            

es 字段 不分词 elasticsearch不分词查询_java_07

     5.2)查询到达不同城市的航班数量

            

es 字段 不分词 elasticsearch不分词查询_es 字段 不分词_08

     5.3)查询每个岗位有多少人

            

es 字段 不分词 elasticsearch不分词查询_es 字段 不分词_09

     5.4)查询目标地的航班次数以及天气信息

            

es 字段 不分词 elasticsearch不分词查询_数据_10

     5.5)查询每个岗位下工资的信息(平均工资、最高工资、最少工资等)

            

es 字段 不分词 elasticsearch不分词查询_elasticsearch_11

     5.6)查询不同工种的男女员工数量、然后统计不同工种下男女员工的工资信息

              

es 字段 不分词 elasticsearch不分词查询_es 字段 不分词_12

     5.7)查询年龄最大的两位员工的信息

          

es 字段 不分词 elasticsearch不分词查询_es 字段 不分词_13

     5.8)查询不同区间员工工资的统计信息

          

es 字段 不分词 elasticsearch不分词查询_搜索_14

    5.9)以直方图的方式以每5000元为一个区间查看工资信息

         

es 字段 不分词 elasticsearch不分词查询_es 字段 不分词_15

    5.10)查询平均工资最低的工种

         

es 字段 不分词 elasticsearch不分词查询_数据_16

    5.11)求工资和工种的信息

         

es 字段 不分词 elasticsearch不分词查询_数据_17

    5.12)查询年龄大于30岁的员工的平均工资

       

es 字段 不分词 elasticsearch不分词查询_java_18

    5.13)查询Java员工的平均工资

         

es 字段 不分词 elasticsearch不分词查询_es 字段 不分词_19

    5.14)求30岁以上的员工的平均工资和所有员工的平均工资

       

es 字段 不分词 elasticsearch不分词查询_elasticsearch_20

17、推荐搜索

在搜索过程中,因为单词的拼写错误,没有得到任何的结果,希望ES能够给我们一个推荐搜索。

es 字段 不分词 elasticsearch不分词查询_数据_21

多个suggest:

GET /personal_report_chapter_es/_search
{
  "suggest": {
    "title_suggest": {
      "text": "消费品",
      "term": {
        "field": "title",
        "suggest_mode":"popular"
      }
    },
    "chaptertext_suggest":{
      "text": "消费品",
      "term": {
        "field": "chapterTextContent",
        "suggest_mode":"popular"
      }
    }
  }
}

18、自动补全

自动补全应该是我们在日常的开发过程中最常见的搜索方式了,如百度搜索和京东商品搜索。

es 字段 不分词 elasticsearch不分词查询_数据_22

es 字段 不分词 elasticsearch不分词查询_es 字段 不分词_23

定义mapping:

es 字段 不分词 elasticsearch不分词查询_java_24

es 字段 不分词 elasticsearch不分词查询_数据_25

前缀搜索

es 字段 不分词 elasticsearch不分词查询_es 字段 不分词_26

es 字段 不分词 elasticsearch不分词查询_es 字段 不分词_27

19、高亮显示

高亮显示在实际的应用中也会碰到很多,如下给出了百度和极客时间的两个高亮搜索的案例:

es 字段 不分词 elasticsearch不分词查询_elasticsearch_28

es 字段 不分词 elasticsearch不分词查询_es 字段 不分词_29

将所有的包含有 beautiful 的单词高亮显示

es 字段 不分词 elasticsearch不分词查询_es 字段 不分词_30

es 字段 不分词 elasticsearch不分词查询_elasticsearch_31