elasticsearch 简单实用介绍

Search APIs简介

  • query: 在请求消息体中的query允许我们用Query DSL的方式查询。
  • term: 查询时判断某个document是否包含某个具体的值,不会对被查询的值进行分词查询
  • match: 将被查询值进行分词,然后用评分机制(TF/IDF)进行打分
  • match_phrase: 查询指定段落
  • Bool: 结合其他真值查询,通常和mustshouldmustnot(与或非)一起组合出复杂的查询
  • range: 查询时指定某个字段在某个特定的范围 (gte:>=;gt:>;lte:<=;le:<)
  • from: 以一定的偏移量来查看我们检索的结果,缺省从检索的第一条数据开始显示
  • size: 指定检索结果中输出的数据条数,缺省为10条
  • sort: 允许我们将检索的结果以指定的字段进行排序显示
  • _source: 指定检索结果输出的字段
  • script_fields: 该类型允许我们通过一个脚本来计算document中不存在的值,比如我们需要计算install/click得到cti之类的
  • aggs: 基于搜索查询,可以嵌套聚合来组合复杂的需求

返回数据含义

  • took:表示该操作的耗时(单位为毫秒)
  • timed_out:表示是否超时
  • hits:表示命中的记录
  • total:返回记录数,本例是2条。
  • max_score:最高的匹配程度,本例是1.0。
  • hits:返回的记录组成的数组。
  • _score:表示匹配的程序,默认是按照这个字段降序排列。


text字段和keyword字段的区别

字段被设置成  keyword  类型,录入数据该字段是不会被分词,所以使用term查询时候,需要全匹配才能查询到。

text,会将字段进行分词,如“hello world”会被分词为["hello","world",...],而term必须匹配到数组中的一项,才能查出结果。

 

match,match_phrase和term区别

elastic会对查询语句进行分词


term

term 查询语句不分词

term查询keyword字段

keyword字段不分词
term查询keyword字段,需要完全匹配

term查询text字段

text字段分词
term查询text字段,必须为text字段分词后中的某一个才行。如“我真帅”分词为["我","真","帅"],term必须为“我”或“真”或“帅”,才能查到,而“我帅”、“真帅”不行。


match

match 查询语句分词

match查询keyword字段

keyword字段不分词
match查询keyword字段,需要完全匹配

match查询text字段

text字段分词
match查询text字段,只需要match分词结果中和text分词有匹配就可以查出。如“我真帅”分词为["我","真","帅"],match的查询语句“真帅”被分词为["真","帅"],其中“真”、“帅”能匹配上text字段的分词结果,所以能查出。


match_phrase

match_phrase 查询语句分词

match_phrase 查询keyword字段

keyword字段不分词
match_phrase 查询keyword字段,需要完全匹配

match_phrase 查询text字段

text字段分词
match_phrase 查询text字段,只需要match_phrase 分词结果中和text分词有匹配且查询语句必须包含在text分词结果中,同时顺序相同且连续,才可以查出。如“我真帅”分词为["我","真","帅",“真帅”],match_phrase 的查询语句“真帅”被分词为["真帅"],其中“真帅”能匹配上text字段的分词结果,连续且顺序相同,所以能查出。


ES与RDBMS数据库比较

简单对比

RDBMSElasticsearch备注
Database(数据库)Index(索引)
Table(表)Type(类型)ES6.x后一个index对应一个type
Row(行)Docment(文档)es保存json
Column(列)Field(字段)
Schema(约束)Mapping(映射)只能说类似,不完全一样
Index(所以)Everything is indexed(万物皆为索引)es中存储数据都是索引
SQL(结构化查询语言)DSL(ES独特的查询语言)

 

QueryBuilder 同时使用 should must

QueryBuilder query = QueryBuilders.boolQuery()
        .should(QueryBuilders.boolQuery()
                .filter(QueryBuilders.matchPhraseQuery("tablenamecn","*"+keyWords1 +"*")))
        .should(QueryBuilders.boolQuery()
                .filter(QueryBuilders.wildcardQuery("tablename","*"+keyWords1 +"*")));

BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
boolQueryBuilder.must(QueryBuilders.matchQuery("disabled", 0))
                .must(QueryBuilders.matchQuery("tablestatus", 0))
                .must(QueryBuilders.matchQuery("type", TABLE_TYPE))
                .must(query);
 

bool 过滤

must :must子句(查询)必须出现在匹配的文档中,并有助于得分,类似于 and。

filter : filter子句(查询)必须出现在匹配的文档中。但是不同于 must查询的分数将被忽略(必须匹配,运行在非评分&过滤模式)。

must_not :不包含条件查询的数据,类似于 not,

should:至少有一个查询条件匹配, 类似于 or。

 

1.例入我们查询一个where field1 = xx and field2 in (xx,xxx,xxxx);

{
    "query":{
        "bool": {
            "must":[
                {"terms": {"field2":["xx","xxx","xxxx"]}},
                {"term" : {"field1":"xx "}}
            ]
        }
    }
}


2.例入我们查询一个where field1 = xx and field2 =xx or field3 =xx and field4 !=xx;

{
    "query":{
        "bool": {
            "must":[
                {"term" : {"field1":"xx"}},
                {"term" : {"field2":"xx"}}
            ],
            "should":{"term" : {"field3":"xx"}},
            "must_not":{"term" : {"field4":"xx"}}
        }
    }
}

 

{
  "query": {
    "bool": {
      "must": [
        {"term": {"a": "1"}},
        {"term":{"b": "2"}}
        {
          "bool": {
            "should": [
                {"term": {"c": "1"}},
              {"term": {"d": "2"}}
            ]
          }
        }
      ]
    }
  },
  "sort": {
    "time": {
      "order": "desc"
    }
  },
  "size": 100
}

 

4)范围条件查询

gt: > 大于

lt: < 小于

gte: >= 大于或等于

lte: <= 小于或等于

range查询,它允许我们通过一定范围的值来过滤文档。这通常用于数字或日期过滤。例:

①.{ "query":{ "bool": { "filter": { "range":{ "stu_age":{ "gte":20, "lte":22 } } } } }}

5)wildcards :通配符查询,类似模糊查询。

{  "query": {    "wildcard": {      "field": "*xx*"    }  }}

(注:两边加*则匹配添加前后的所有符合的结果,可以使用正则匹配)

6)sort : 排序(sort":{"field ":{"order":"desc"}})

{ "query": { "match_all": {} }, "sort": { "field": { "order": "desc" } }}

7)_source :搜索指定的字段 ("_source":["field1","field2"])

{ "query": { "match_all": {} }, "_source": ["field1", "field2"]}

from : 查询开始参数,from默认为0.

size : 查询条数;size未指定默认为10.

{ "query": { "match_all": {} }, "from": 0, "size": 10}


 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值