`
gegewuqin9
  • 浏览: 29158 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Elasticsearch搜索

 
阅读更多
简单搜索
在url后面加上_search关键字表示搜索请求,如:GET /megacorp/employee/_search
在?后面添加q的参数可以传入搜索参数,如:GET /megacorp/employee/_search?q=id:123
pretty关键字:在url请求后面加上?pretty(已经有问号时加&pretty),可以把响应结果格式化
http://192.168.23.163:9200/megacorp/employee/_search?q=id:582&pretty
响应结果:
{
  "took" : 3,                 //搜索耗时,单位毫秒
  "timed_out" : false,        //是否超时
  "_shards" : {               //查询分片
    "total" : 5,
    "successful" : 5,
    "failed" : 0
  },
  "hits" : {
    "total" : 1,              //总数
    "max_score" : 3.3513753,  //最大相关性得分
    "hits" : [ {              //查询结果
      "_index" : "megacorp",  //所在索引
      "_type" : "employee",   //所属类别
      "_id" : "582",          //id
      "_score" : 3.3513753,   //当前数据的相关性得分
      "_source" : {           //查询内容
        "id" : 582,
        "type" : "120",
        ...
        "keywords" : "HAMADA,RISDON,Dangerous"
      }
    } ]
  }
}


结构化查询
一些复杂的查询无法直接通过url进行传参,它可以将参数以JSON格式放在request body中进行传递,由于GET请求不被广泛支持,所以也可以通过POST请求
通过一个简单的查询来了解:
GET /_search
{
    "query": {                              // 表示结构化查询
        "match": {                          // 查询方式,匹配查询
            "tweet": "elasticsearch"        // 字段名:查询内容
        }
    }
}

所有的查询请求url都必须以/_search结尾(?后面不算),结构化查询则都是以query为root key(后面介绍中的请求都是query里面的内容)

查询与过滤
查询与过滤语句非常相似,但是它们由于使用目的不同而稍有差异
  • 一条过滤语句会询问每个文档的字段值是否包含着特定值
  • 一条查询语句与过滤语句相似,不同的是查询语句会询问每个文档的字段值与特定值的匹配程度如何

总而言之,最主要的区别在于过滤的条件不影响相关度得分,查询的语句会影响相关度得分
另外,过滤语句会进行缓存,缓存过的过滤语句查询效率要远胜一条查询语句。所以除了需要计算相关度得分的,其它的都应该使用过滤语句。
过滤语句的关键字有:bool、term、terms、range、exists、missing等
查询语句的关键字有:bool、match_all、match、multi_match等,下面将一一介绍

bool过滤
bool 过滤可以用来合并多个过滤条件查询结果的布尔逻辑,它包含一下操作符:
must :: 多个查询条件的完全匹配,相当于 and
must_not :: 多个查询条件的相反匹配,相当于 not
should :: 至少有一个查询条件匹配, 相当于 or
这些参数可以分别继承一个过滤条件或者一个过滤条件的数组
{
    "bool": {
        "must":     { "term": { "folder": "inbox" }},
        "must_not": { "term": { "tag":    "spam"  }},
        "should": [
                    { "term": { "starred": true   }},
                    { "term": { "unread":  true   }}
        ]
    }
}


term过滤
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
        }
    }
}

gt :: 大于
gte:: 大于等于
lt :: 小于
lte:: 小于等于

exists和missing过滤
exists 和 missing 过滤可以用于查找文档中是否包含指定字段或没有某个字段,类似于SQL语句中的IS_NULL条件
{
    "exists":   {
        "field":    "title"
    }
}


match_all查询
使用match_all 可以查询到所有文档,是没有查询条件下的默认语句
{
    "match_all": {}
}


match查询
match查询是一个标准查询,不管你需要全文本查询还是精确查询基本上都要用到它。
如果你使用 match 查询一个全文本字段,它会在真正查询之前用分析器先分析match一下查询字符
{
    "match": {
        "tweet": "About Search"
    }
}

如果用match下指定了一个确切值,在遇到数字,日期,布尔值或者not_analyzed 的字符串时,它将为你搜索你给定的值:
{ "match": { "age":    26           }}
{ "match": { "date":   "2014-09-01" }}
{ "match": { "public": true         }}
{ "match": { "tag":    "full_text"  }}

提示: 做精确匹配搜索时,你最好用过滤语句(term),因为过滤语句可以缓存数据。

multi_match查询
multi_match查询允许你做match查询的的时候指定多个搜索字段
{
    "multi_match": {
        "query":    "full text search",
        "fields":   [ "title", "body" ]
    }
}


bool查询
bool 查询与 bool 过滤相似,用于合并多个查询子句。不同的是,bool 过滤可以直接给出是否匹配成功, 而bool 查询要计算每一个查询子句的 _score (相关性分值)。
must:: 查询指定文档一定要被包含。
must_not:: 查询指定文档一定不要被包含。
should:: 查询指定文档,有则可以为文档相关性加分。
以下查询将会找到 title 字段中包含 "how to make millions",并且 "tag" 字段没有被标为 spam。 如果有标识为 "starred" 或者发布日期为2014年之前,那么这些匹配的文档将比同类网站等级高
{
    "bool": {
        "must":     { "match": { "title": "how to make millions" }},
        "must_not": { "match": { "tag":   "spam" }},
        "should": [
            { "match": { "tag": "starred" }},
            { "range": { "date": { "gte": "2014-01-01" }}}
        ]
    }
}


过滤查询
search API中只能包含 query 语句,所以我们需要用 filtered 来同时包含 "query" 和 "filter" 子句
{
    "query": {
        "filtered": {
            "query":  { "match": { "email": "business opportunity" }},//查询
            "filter": { "term": { "folder": "inbox" }}                //过滤
        }
    }
}


理解查询语句
想知道语句非法的具体错误信息,需要加上 explain 参数,类似sql的explain
GET /gb/tweet/_validate/query?explain
{
   "query": {
      "tweet" : {
         "match" : "really powerful"
      }
   }
}


使用sql查询
参考:https://github.com/NLPchina/elasticsearch-sql
可在线上执行sql:http://192.168.23.163:9200/_plugin/sql/
分享到:
评论

相关推荐

    springboot+ElasticSearch搜索引擎

    Spring Boot简化了Java应用程序的开发过程,而Elasticsearch则是一个强大的分布式搜索引擎。这个压缩包文件"springboot-elasticSearch"似乎提供了一个预配置的项目,允许开发者快速集成这两者,实现高效的全文搜索...

    elasticsearch搜索引擎框架es ORM框架

    elasticsearchElasticsearch 国内Top1 elasticsearch搜索引擎框架es ORM框架,索引全自动智能托管,如丝般顺滑,与Mybatis-plus一致的API,屏蔽语言差异,开发者只需要会MySQL语法即可完成对Es的相关操作,零额外学习成本....

    ElasticSearch搜索引擎使用说明书.docx

    ElasticSearch 搜索引擎使用说明书 ElasticSearch 是一个基于 Lucene 的搜索服务器,提供了一个分布式多用户能力的全文搜索引擎,基于 RESTful web 接口。Elasticsearch 是用 Java 语言开发的,并作为 Apache 许可...

    基于Spring框架开源ElasticSearch搜索

    本书以实例讲述如何在Spring框架之上搭建ElasticSearch开发,以及如何利用JPA建立、更新和删除索引,如何配置ElasticSearch Server的applicationContext等。

    es搜索引擎.doc

    Elasticsearch(ES)是一个高效、可扩展的分布式搜索服务器,基于Apache Lucene构建,具有丰富的功能和强大的性能。它不仅提供了开箱即用的体验,还通过RESTful接口简化了Lucene的复杂操作,使得用户能够方便地进行...

    分布式搜索引擎Elasticsearch开发实战基础篇 (ElasticSearch、ELK、搜索引擎、Lucene).rar

    分享一套完整版视频课程——分布式搜索引擎Elasticsearch开发实战基础篇 (ElasticSearch、ELK、搜索引擎、Lucene),本教程旨在带领大家进入搜索引擎领域,从无到有,深入浅出的讲解了什么是搜索引擎,搜索引擎的...

    ElasticSearch搜索引擎教程实战篇

    ElasticSearch搜索引擎教程实战篇是ElasticSearch搜索引擎的实践教程,旨在帮助读者从基础知识到高级应用掌握ElasticSearch搜索引擎的使用。该教程涵盖了ElasticSearch搜索引擎的基础概念、安装、配置、使用Kibana、...

    maven springmvc集成elasticsearch客户端项目

    "es搜索引擎"标签进一步确认了我们正在处理一个与Elasticsearch相关的项目,Elasticsearch通常用于处理大规模数据的搜索和分析任务。 **文件名称列表详解:** 1. **.classpath** - 这是一个Eclipse项目文件,包含...

    es搜索引擎配置文件完整配置版本

    在"es搜索引擎配置文件完整配置版本"中,我们可以找到适用于Elasticsearch 7.13.0版本的配置文件,这包括了默认设置以及一些高级选项。 ### 1. 配置文件位置 Elasticsearch的主配置文件名为`elasticsearch.yml`,...

    浅入深出ElasticSearch构建高性能搜索架构.docx

    #### 构建高性能ES搜索架构 本章节将聚焦于如何构建一个高效、稳定的ElasticSearch搜索架构。 1. **集群设计**:根据业务需求和数据量,设计合理的集群规模,包括节点数量、分片数量等。 2. **高可用方案**:采用...

    Es搜索引擎

    **Elasticsearch 搜索引擎详解** Elasticsearch 是一个开源的全文搜索引擎,它基于 Lucene 库,并且提供了分布式、RESTful 风格的搜索和数据分析能力。Elasticsearch 的设计目标是易于使用、可扩展性强、实时性高,...

    ElasticSearch搜索引擎使用

    - **ESHead**: 一种图形化管理工具,帮助管理和监控ElasticSearch。 - **安装方法**: 对于2.4.x版本,可以直接下载并解压至`plugins`目录下。 - **访问**: 浏览器访问http://localhost:9100。 #### 四、Elastic...

    C# 对ES搜索引擎 的封装,初学者可以学习学习

    在.NET Core平台上,C#与Elasticsearch的交互是一个常见的需求,特别是在大数据处理、日志分析和实时搜索等场景中。本教程将介绍如何利用C#进行Elasticsearch的封装,帮助初学者快速掌握相关技能。 首先,我们需要...

    十分钟学会使用 Elasticsearch 优雅搭建自己的搜索系统.pdf

    十分钟学会使用 Elasticsearch 优雅搭建自己的搜索系统。 什么是elasticsearch Elasticsearch 是一个开源的高度可扩展的全文搜索和分析引擎,拥有查询近实时的超强性能。 大名鼎鼎的Lucene 搜索引擎被广泛用于搜索...

    基于Java的Elasticsearch搜索引擎ORM框架设计源码

    这些文件详细展示了如何使用JavaScript、Java、HTML和CSS构建一个Elasticsearch搜索引擎ORM框架,该框架提供索引全自动智能托管,与Mybatis-plus一致的API,屏蔽语言差异,开发者只需要会MySQL语法即可完成对Es的...

    es搜索引擎s

    标题中的“es搜索引擎”指的是Elasticsearch,一个流行的开源全文搜索引擎,主要用Java编写,并且基于Lucene库。描述中的“Java搜索引擎”进一步确认了我们讨论的是基于Java的搜索技术。标签“搜索引擎”则明确了...

    Easy-Es是一款简化ElasticSearch搜索引擎操作的开源框架,全自动智能索引托管

    Elasticsearch 国内顶尖elasticsearch搜索引擎框架es ORM框架,索引全自动智能托管,如丝般顺滑,与Mybatis-plus一致的API,屏蔽语言差异,开发者只需要会MySQL语法即可完成对Es的相关操作,零额外学习成本.底层采用...

    ES搜索引擎.pptx

    Elasticsearch是一个基于Apache Lucene(TM)的开源搜索引擎,无论在开源还是专有领域,Lucene可以被认为是迄今为止最先进、性能最好的、功能最全的搜索引擎库。 但是,Lucene只是一个库。想要发挥其强大的作用,你...

    一款简化ElasticSearch搜索引擎操作的开源框架,全自动智能索引托管.功能丰富度和易用度及性能已全面领先SpringDa

    Easy-Es是一款简化ElasticSearch搜索引擎操作的开源框架,全自动智能索引托管.目前功能丰富度和易用度及性能已全面领先SpringData-Elasticsearch.。Elasticsearch 国内Top1 elasticsearch搜索引擎框架es ORM框架,索引...

Global site tag (gtag.js) - Google Analytics