🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
[TOC] # 简介 es是功能非常强大的全文搜索引擎,用它的目的是为了能快速的查询你想要的数据 基本查询: 利用es内置查询条件进行查询 组合查询: 把多个基本查询组合在一起的复合性查询 过滤: 查询同时,通过filter条件在不影响打分的情况下筛选出想要的数据 **字段含义** * took:耗费了几毫秒 * timed_out:是否超时,这里是没有 * _shards:数据拆成了5个分片,所以对于搜索请求,会打到所有的primary shard(或者是它的某个replica shard也可以) * hits.total:查询结果的数量,3个document * hits.max_score:score的含义,就是document对于一个search的相关度的匹配分数,越相关,就越匹配,分数也高 * hits.hits:包含了匹配搜索的document的详细数据 * score: 打分 **基本查询** * term,terms查询 * from,size * 返回版本号`_version` * match查询 * 升序降序 * prefix前缀匹配查询 * range范围查询 * wildcard通配符查询 * fuzzy模糊查询 * `more_like_this & more_like_this_field`查询 # 简单查询 创建7个这样的数据 ~~~ POST /library/books/1 { "title": "elasticsearch", "price":"1", "preview": "books-1", "publish_date": "2015-02-06" } ~~~ 查看数据 ~~~ GET /library/books/_mget { "ids": ["1","2","3","4","5","6","7"] } ~~~ 查看mapping ~~~ GET /library/_mapping ~~~ 简单查询 ~~~ # 指定index名以及type名的搜索 GET /library/books/_search?q=title:elasticsearch ~~~ 返回值多条中,会有`_score`这个key,这个值越大就排在前面,这个就叫打分,es认为这个文档比较有价值 ~~~ # 指定index名没有type名的搜索 GET /library/_search?q=title:mongo ~~~ ~~~ # 既没有index名也没有type名的搜索 GET /_search?q=title:elasticsearch ~~~ # term查询 查询某个字段里有某个关键词的文档 ~~~ //books GET /library/books/_search { "query": { "term": { "preview": "es" } } } ~~~ ## `minimum_should_match`:某个字段里有多个关键词的文档 `minimum_should_match`: 最小匹配集: 1.说明两个关键词里最少有一个, 2.说明文档里这两个关键词都得存在 ~~~ GET /library/books/_search { "query": { "bool": { "minimum_should_match": 2, "should": [ { "term": { "preview": "books" } }, { "term": { "preview": "1" } }, { "term": { "preview": "2" } } ] } } } ~~~ ## form和size:控制查询返回的数量 form和size 相当于mysql里的limit from: 从哪个结果开始返回 size: 定义返回最大的结果数 ~~~ GET /library/books/_search?q=title:elasticsearch GET /library/books/_search { "from": 1, "size": 2, "query": { "term": { "title": "elasticsearch" } } } ~~~ ## `_version`:返回版本号 ~~~ GET /library/books/_search { "version": true, "query": { "term": { "preview": "books" } } } ~~~ # queryString查询 query里面的他会进行分析,进行分词,然后查询. ~~~ POST blog/hello/_search { "query": { "term": { "default_field": "title", "query": "今天在修公路" } } } ~~~ 比如没有这整个,但是如果有修这个能匹配到,也能搜索出来. 他是一种先对这个分析,然后在查询的 # match查询 match查询可以接收文字,数字日期等数据类型 match跟term区别是,match查询的时候,elasticsearch会根据你给定的字段提供合适的分析器,而term查询不会有分析器分析过程 ~~~ GET /library/books/_search { "query": { "match": { "preview": "es" } } } GET /library/books/_search { "query": { "match": { "price": 3 } } } ~~~ # `match_phrase` 跟全文检索相对应,相反,全文检索会将输入的搜索串拆解开来,去倒排索引里面去一一匹配,只要能匹配上任意一个拆解后的单词,就可以作为结果返回 phrase search,要求输入的搜索串,必须在指定的字段文本中,完全包含一模一样的,才可以算匹配,才能作为结果返回 短语查询,slop定义的是关键词之间间隔多少未知单词 ~~~ GET /library/books/_search { "query": { "match_phrase": { "preview": { "query": "books,es", "slop": 3 } } } } ~~~ `multi_match`查询 可以指定多个字段 比如查询title和preview这两个字段里都包含Elasticsearch关键词的文档 ~~~ GET /library/books/_search { "query": { "multi_match": { "query": "es", "fields": ["title","preview"] } } } ~~~ # field指定返回的字段 注意只能返回store为yes的字段 ~~~ GET /library/books/_search { "fields": ["preview","title"], "query": { "match": { "preview": "es" } } } ~~~ # partial_fields控制加载字段 include表示包含 exclude表示排除 ~~~ GET /library/books/_search { "partial_fields": { "partial": { "include": ["preview"], "exclude": ["title,price"] } }, "query": { "match_all": {} } } ~~~ 还可以加通配符* ~~~ GET /library/books/_search { "partial_fields": { "partial": { "include": ["pr*"], "exclude": ["tit*"] } }, "query": { "match_all": {} } } ~~~ # sort排序 通过sort把结果排序 desc降序 asc升序 ~~~ GET /library/books/_search { "query": { "match_all": {} }, "sort": [ { "price": { "order": "desc" } } ] } ~~~ # prefix前缀匹配查询 prefix ~~~ GET /library/books/_search { "query": { "prefix": { "title": { "value": "e" } } } } ~~~ # range控制范围 range查询:范围查询 有from,to,include_lower,include_upper,boots这些参数 include_lower: 是否包含范围的左边界,默认是true include_upper: 是否包含范围的右边界,默认是true ~~~ GET /library/books/_search { "query": { "range": { "price": { "from": "10", "to": "20", "include_lower": true, "include_upper": false } } } } ~~~ # wildcard通配符查询 允许你使用通配符`*`和?来进行查询 `*`代表一个或多个字符 ?仅代表一个字符 注意:这个查询很影响性能 ~~~ GET /library/books/_search { "query": { "wildcard": { "preview": "book*" } } } ~~~ ~~~ GET /library/books/_search { "query": { "wildcard": { "preview": "boo?s" } } } ~~~ # fuzzy模糊查询 value查询的关键字 boost设置查询的权值,默认为1.0 min_similarity:设置匹配的最小相似度,默认值是0.5,对于字符串取值为0-1(包括0和1),对于数值,取值可能大于1,对于日期型取值为1d,2d,1m这样,1d就代表一天 prefix_length:指明区分词项的共同前缀长度,默认是0 max_expansions:指明查询中的词项可扩展的数目,默认可无限大 ~~~ GET /library/books/_search { "query": { "fuzzy": { "preview": "php" } } } ~~~ ~~~ GET /library/books/_search { "query": { "fuzzy": { "preview": { "value": "php", "min_similarity": 0.5 } } } } ~~~ # fuzzy_like_this查询与给定内容相似的所有文档 查询得到与给定内容相似的所有文档 fields:字段组,默认是`_all` like_text: 设置关键词 ignore_tf:设置忽略词项的频次,默认是false max_query_terns:指明在生成的查询中查询词项的最大数目.默认是25 min_similarity:指明区分词项最小的相似度,默认是0.5 prefix_length:指明区分词项共同前缀的长度,默认是0 boost:设置权值,默认是1.0 analyze:指明用于分析给定内容的分析器 ~~~ GET /library/books/_search { "query": { "fuzzy_like_this": { "fields": ["preview"], "like_text": "php", "min_similarity": 0.5, "prefix_length": 0.2 } } } ~~~ # fuzzy_like_this_field查询 只作用在一个字段里 其他与fuzzy_like_this功能一样 ~~~ GET /library/books/_search { "query": { "fuzzy_like_this_field": { "preview": { "like_text": "php", "min_similarity": 0.5, "prefix_length": 0.2 } } } } ~~~ # more_like_this查询 fields:定义字段组,默认是`_all` like_text:定义要查询的关键词 percent_terms_to_match: 该参数指明一个文档必须匹配多大比例的词项才能被视为相似,默认值是0.3,意思30%比例 min_term_freq:该参数指明在生成的查询中查询词项的最大数目.默认为25 stop_words:该参数指明将被忽略的单词集合 min_doc_freq:该参数指明词项应至少在多个文档中出现才不会被忽略.more是5 max_doc_freq:该参数指明出现词项的最大数目,以避免词项被忽略,默认是无穷大 min_word_len: 该参数指明单个单词的最小长度,低于该值的单词将被忽略,默认值是0 max_word_len: 该参数指明单个单词的最大长度,高于该值的单词将被忽略,默认是无限大 boost_terms: 该参数指明提升每个单词的权重时使用的权值.默认是1 boost: 指明提升一个查询的权值,默认是1.0 analyer:指定用于分析的分析器 ~~~ GET /library/books/_search { "query": { "more_like_this": { "fields": ["preview"], "like_text": "php", "min_term_freq": 1, "min_doc_freq": 1 } } } ~~~ # more_like_this_field查询 只作用一个字段里 其他与more_like_this功能一样 ~~~ GET /library/books/_search { "query": { "more_like_this_field": { "preview": { "like_text": "php", "min_term_freq": 1, "min_doc_freq": 1 } } } } ~~~