Elasticsearch检索分类

阅读数:102 评论数:0

跳转到新版页面

分类

应用软件

正文

原文:https://blog.csdn.net/laoyang360/article/details/77623013

Elasticsearch中当我们设置Mapping(分词器、字段类型)完毕后,就可以按照设定的方式导入数据。有了数据后,我们可以对数据进行检索。

检索概览

检索子句的行为取决于查询应用filter还是query, filter对应于结构化检索,query对应于全文检索。

GET /_search
{  "query": {  "bool": {  "must": [
  { "match": { "title": "Search" }},
  { "match": { "content": "Elasticsearch" }}
  ],  "filter": [
  { "term": { "status": "published" }},
  { "range": { "publish_date": { "gte": "2015-01-01" }}}
  ]
  }
  }
}

以检索,title中包含“Search”并且content中包含“Elasticsearch”,status中精确定匹配published,并且publish_date大于2015-01-01的全部信息。

1、结构化检索

针对字段类型:日期、时间、数字类型,以及精确的文本匹配。结构化查询得到的结果要么存在于集合中,要么存在集合外,不关心文件的相关度或评分,它简单的对文档包括或排除处理。

(1)精确值查找(必须完全匹配上)

term query

term查询会查找我们指定的精确值,它接受一个字段名以及我们希望查找的数值 。

想要类似mysql中如下sql语句的查询操作:

SELECT document FROM products WHERE price = 20; 

DSL写法:

GET /my_store/products/_search
{
  "query" : {
  "term" : {
  "price" : 20
  }
  }
}

布尔过滤器

一个bool过滤器由三部分组成:

{
   "bool" : {
      "must" :     [],
      "should" :   [],
      "must_not" : [],
      "filter":    []
   }
}

must:所有语句都必须匹配,与AND等价

must_not:所有的语句都不能匹配,与NOT等价

should:至少有一个语句要匹配,与OR等价

filter:必须匹配

GET /my_store/products/_search
{
  "query" : {
  "filtered" : {
  "filter" : {
  "bool" : {
  "should" : [
  { "term" : {"price" : 20}},
 
  { "term" : {"productID" : "XHDK-A-1293-#fJ3"}}
 
  ],
  "must_not" : {
  "term" : {"price" : 30}
 
  }
  }
  }
  }
  }
}

 

多个值精确查找

{
  "terms" : {
  "price" : [20, 30]
  }
}

包含20或者含30.

(2)范围检索

gt: > 大于(greater than)
lt: < 小于(less than)
gte: >= 大于或等于(greater than or equal to)
lte: <= 小于或等于(less than or equal to)

类似于Mysql中的范围查询

SELECT document
FROM   products
WHERE  price BETWEEN 20 AND 40

ES中对应的DSL如下:

GET /my_store/products/_search
{
  "query" : {
  "constant_score" : {
  "filter" : {
  "range" : {
  "price" : {
  "gte" : 20,
  "lt" : 40
  }
  }
  }
  }
  }
}

(3)存在与否检索

mysql中,有如下sql

SELECT tags FROM posts WHERE tags IS NOT NULL;

ES中,exist查询某个字段是否存在:

GET /my_index/posts/_search
{
    "query" : {
        "constant_score" : {
            "filter" : {
                "exists" : { "field" : "tags" }
            }
        }
    }
}

若想要exists查询以匹配null类型,需要设置mapping

"user": {
  "type": "keyword",
  "null_value": "_null_"

(4)前缀检索

GET /_search
{ "query": {
  "prefix" : { "user" : "ki" }
  }
}

(5)通配符检索

为了防止查询慢,通配符不能以任何一个通配符*或?开头。

GET /_search
{
    "query": {
        "wildcard" : { "user" : "ki*y" }
    }
}

(6)正则表达式检索

GET /_search
{
  "query": {
  "regexp":{
  "name.first": "s.*y"
  }
  }
}

(7)模糊检索

在指定的最大编辑距离内的所有可能的匹配项,然后检查术语字典,以找出在索引中实际存在待检索的关键字。

GET /_search
{
  "query": {
  "fuzzy" : { "user" : "ki" }
  }
}

(8)类型检索

GET /my_index/_search
{
  "query": {
  "type" : {
  "value" : "xext"
  }
  }
}

检索索引my_index中,type为xext的全部信息。

(9)Ids检索

GET /my_index/_search
{
  "query": {
  "ids" : {
  "type" : "xext",
  "values" : ["2", "4", "100"]
  }
  }
}

2、全文检索

(1)匹配检索

匹配查询接受文本、数字、日期类型,分析它们,并构造查询。

匹配查询的类型为boolean,这意味着分析所提供的文本,并且分析过程从提供的文本构造一个布尔查询。

文本分析取决于mapping中设定的analyzer(默认是ik分词器)

GET /_search
{
    "query": {
        "match" : {
            "message" : {
                "query" : "this is a test",
                "operator" : "and"
            }
        }
    }
}

(2)匹配解析检索

类似match查询,match_phrase查询首先将查询字符串解析成一个词项列表,然后对这些词项进行搜索,但只保留那些包含全部搜索词项。

GET /my_index/my_type/_search
{
  "query": {
  "match_phrase": {
  "title": "quick brown fox"
  }
  }
}

(3)匹配解析前缀检索

match_phrase_prefix与match_phrase相同,除了它允许文本中最后一个术语的前缀匹配。

GET / _search
{
    “query”:{
        “match_phrase_prefix”:{
            “message”:“quick brown f”
        }
    }
}

(4)多字段匹配检索(暂时不理解)

multi_match查询为能在多个字段上反复执行相同查询提供了一种便捷方式。

(5)字符串检索(暂时不理解)

(6)简化字符串检索(暂时不理解)

 

最后欢迎大家访问我的个人网站:1024s​​​​​​​

 




相关推荐

一、基本概念 Elasticsearch是面向文档型数据库,一条数据在这里就是一个文档,比如下面这条用户数据: <pre class=

1、下载https://mirrors.huaweicloud.com/elasticsearch/ 根据自已的机器型号,连接对应的cpu架构,是x64、还是arm 2、安装 tar -zxvf el

1、下载 https://gith

一、简介 logstash是一款轻量级的日志搜集处理框架,可以方便把分散的。多样化的日志搜集起来,并进行自定义处理,传输到指定的位置,比如某个服务器或者文件。

SearchQuery searchQuery = new NativeSearchQueryBuilder()

一、下载 es需要java运行环境,可以自行安装JDK,参考:http://1024s.top/blog/detail?blogId=42577 当然,es自带jdk环境目录,也可以使用这个目录为ja