带你读《Elastic Stack 实战手册》之34:——3.4.2.17.3.全文搜索/精确搜索(15)

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介: 带你读《Elastic Stack 实战手册》之34:——3.4.2.17.3.全文搜索/精确搜索(15)


《Elastic Stack 实战手册》——三、产品能力——3.4.入门篇——3.4.2.Elasticsearch基础应用——3.4.2.17.Text analysis, settings 及 mappings——3.4.2.17.3.全文搜索/精确搜索(14) https://developer.aliyun.com/article/1229925


4.6 query string

 

Query string 查询是一种便捷的语法查询方式,解析器根据提供的查询字符串进行严格的语法解析,最后返回相应的文档。

 

主要有这些特点:


1、严格的语法解析,对查询内容的正确性要求较高。也因此 ES 官方不建议在搜索框使用 query_string 查询。

2、操作符的使用使得查询语句更加简洁,且逻辑更加清晰。

3、允许使用通配符、正则表达式等方法。

4、基本覆盖了全文搜索的绝大数功能。

 

使用方法:


GET /_search
{
  "query": {
    "query_string": {
      "query": "(new york city) OR (big apple)",
      "default_field": "content"
    }
  }
}

这个查询等同于下面的查询:


GET my-index-000002/_search
{
  "query": {
    "bool": {
      "should": [
        {
          "match": {
            "content": "new york city"
          }
        },
        {
          "match": {
            "content": "big apple"
          }
        }
      ]
    }
  }
}

query_string 的主要参数都在之前的篇幅中都解释过,因此不在这里赘述了。

 

我们主要看一下 query_string 的语法运用规则:

 

1、字段查询:默认的查询方式是status:active这样的方式。可以在字段中添加操作符,比如

title:(quick OR brown);也可以对字段使用匹配,book.\*:(quick OR brown)注意转义符的使用;对被查询的文档是使用英文双引号可以达到 match_phrase 的效果,author:"John Smith"; exists 方法的使用则是这样 _exists_:title

2、wildcards方法:匹配符的方法也是 ? 代表一个字符, * 代表多个字符。

3、正则表达式:正则表达式模式可以嵌入到查询字符串中,方法是将用斜杠/括起来,比如:name:/joh?n(ath[oa]n)/

4、模糊查询:模糊查询的符号是 ~,比如:quikc~ brwn~ foks~可以在 ~ 后面添加编辑距离参数,比如:quikc~2注意,模糊查询是针对 term 查询时词项的模糊匹配。

5、相似查询(proximity search):与模糊查询的方式操作符号一样也是~ ,但是是对 match_phrase 查询的两个词项间的距离编辑,比如:"fox quick"~5

6、范围查询:中阔号是两边范围包含,比如count:[1 TO 5]是 count 大于等于 1 小于等于 5 ;花括号是两边范围不包含,比如count:{1 TO 5}是 count 大于 1 小于 5 ;如果是单纯的大于或者小于则用 * 号代表无范围限制,比如count:[1 TO *] 代表 count 大于等于 1,

count:{* TO 5}代表小于5;当然两个符号也可以组合,比如count:{1 TO 5]代表大于 1 小于等于 5

7、加权:加权主要使用的符号是^,比如quick^2 fox代表命中 quick 的文档算分是 fox 的 2 倍。

8、布尔运算:默认空格是或查询+号是 must ,-号是 must not。比如quick brown +fox -news是查询必须有 fox ,不包含 news ,包含 quick brown 其中一项的文档。同时布尔运算符包含 AND OR NOT&& || ! 两种形式的表达式。

9、分组:括号用于表示分组,比如 (quick OR brown) AND fox 或者 status:(active OR pending) title:(full text search)^2

10、多字段查询:多字段查询的字段间关系默认是 OR 的关系.比如下面的查询:

GET /_search
{
  "query": {
    "query_string": {
      "fields": [ "content", "name" ],
      "query": "this AND that"
    }
  }
}

等同于:

GET /_search
{
  "query": {
    "query_string": {
      "query": "(content:this OR name:this) AND (content:that OR name:that)"
    }
  }
}

同时,multi_match 中的各种查询类型也可以通过 type 参数实现。

 

注意:


1、在 query_string 中避免查询 nested 的文档。

2、query_string 查询可以在内部转换为 prefix 查询,如果 ES 禁用 prefix 查询,query_string 将不会执行查询并抛出异常。

3、关于转义符,在 json 中转义符是 "\",比如 "query" : "kimchy\\!"

4、在多字段查询中,由于字段和词项之间的布尔运算规则的交叉,会导致运算逻辑相对晦涩不明。因此如果有多字段查询最佳的方式是通过分组将其查询逻辑清晰化,避免查询失败。

 

4.7 simple_query_string

 

simple_query_string 是一种相对简化的查询语法,虽然比起 query_string 的完善功能 simple_query_string 的使用有诸多限制,但是 simple_query_string 查询不会因无效语法返回错误。相反,它会忽略查询字符串中任何无效的部分

 

使用方法:


GET /_search
{
  "query": {
    "simple_query_string" : {
        "query": "\"fried eggs\" +(eggplant | potato) -frittata",
        "fields": ["title^5", "body"],
        "default_operator": "and"
    }
  }
}

simple_query_string 的主要参数都在之前的篇幅中都解释过,因此不在这里赘述了。

 

使用语法

 

语法操作符主要作用于查询词项,有以下这些:



1、+ 代表 and 关系, | 代表 or -代表 not。

2、"" 英文双引号使用 match_phrase。

3、* 是通配符。

4、() 是分组。

5、~N 是模糊查询或者相似查询的字符或者词项编辑距离。

 

limit operators在 simple_query_string 查询中可以使用 flags 参数进行对查询语法的限制,对各种操作方法使用 | 隔开。比如:

 

limit operators

 

limit operators 在 simple_query_string 查询中可以使用 flags 参数进行对查询语法的限制,对各种操作方法使用 | 隔开。

 

比如:


GET /_search
{
  "query": {
    "simple_query_string": {
      "query": "foo | bar + baz*",
      "flags": "OR|AND|PREFIX"
    }
  }
}

这个查询中,限定了 OR AND PREFIX 三种语法,其余的语法运算符都会被限制掉。

 

flag 的参数值:ALL(默认))/AND/ESCAPE/FUZZY/NEAR/NONE/NOT/OR/PHRASE/PRECEDENCE/PREFIX/SLOP/WHITESPACE


字段通配符和加权

 

在查询字段上,也可以使用通配符*,比如:

GET /_search
{
  "query": {
    "simple_query_string" : {
      "query":    "Will Smith",
      "fields": [ "title", "*_name" ] 
    }
  }
}

同时也可以对字段进行加权,使用符号^

GET /_search
{
  "query": {
    "simple_query_string" : {
      "query" : "this is a test",
      "fields" : [ "subject^3", "message" ] 
    }
  }
}


《Elastic Stack 实战手册》——三、产品能力——3.4.入门篇——3.4.2.Elasticsearch基础应用——3.4.2.17.Text analysis, settings 及 mappings——3.4.2.17.3.全文搜索/精确搜索(16) https://developer.aliyun.com/article/1229923

相关实践学习
使用阿里云Elasticsearch体验信息检索加速
通过创建登录阿里云Elasticsearch集群,使用DataWorks将MySQL数据同步至Elasticsearch,体验多条件检索效果,简单展示数据同步和信息检索加速的过程和操作。
ElasticSearch 入门精讲
ElasticSearch是一个开源的、基于Lucene的、分布式、高扩展、高实时的搜索与数据分析引擎。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。 ElasticSearch的实现原理主要分为以下几个步骤: 用户将数据提交到Elastic Search 数据库中 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据 当用户搜索数据时候,再根据权重将结果排名、打分 将返回结果呈现给用户 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
相关文章
|
12月前
|
自然语言处理 索引
带你读《Elastic Stack 实战手册》之34:——3.4.2.17.3.全文搜索/精确搜索(9)
带你读《Elastic Stack 实战手册》之34:——3.4.2.17.3.全文搜索/精确搜索(9)
|
12月前
带你读《Elastic Stack 实战手册》之34:——3.4.2.17.3.全文搜索/精确搜索(12)
带你读《Elastic Stack 实战手册》之34:——3.4.2.17.3.全文搜索/精确搜索(12)
|
12月前
|
自然语言处理 API 索引
带你读《Elastic Stack 实战手册》之34:——3.4.2.17.3.全文搜索/精确搜索(16)
带你读《Elastic Stack 实战手册》之34:——3.4.2.17.3.全文搜索/精确搜索(16)
|
12月前
|
存储 自然语言处理 索引
带你读《Elastic Stack 实战手册》之34:——3.4.2.17.3.全文搜索/精确搜索(1)
带你读《Elastic Stack 实战手册》之34:——3.4.2.17.3.全文搜索/精确搜索(1)
|
12月前
|
缓存 索引
带你读《Elastic Stack 实战手册》之34:——3.4.2.17.3.全文搜索/精确搜索(4)
带你读《Elastic Stack 实战手册》之34:——3.4.2.17.3.全文搜索/精确搜索(4)
|
12月前
带你读《Elastic Stack 实战手册》之34:——3.4.2.17.3.全文搜索/精确搜索(7)
带你读《Elastic Stack 实战手册》之34:——3.4.2.17.3.全文搜索/精确搜索(7)
|
12月前
|
API
带你读《Elastic Stack 实战手册》之34:——3.4.2.17.3.全文搜索/精确搜索(11)
带你读《Elastic Stack 实战手册》之34:——3.4.2.17.3.全文搜索/精确搜索(11)
|
12月前
|
JSON Apache 数据格式
带你读《Elastic Stack 实战手册》之34:——3.4.2.17.3.全文搜索/精确搜索(8)
带你读《Elastic Stack 实战手册》之34:——3.4.2.17.3.全文搜索/精确搜索(8)
|
12月前
|
自然语言处理 API 索引
带你读《Elastic Stack 实战手册》之34:——3.4.2.17.3.全文搜索/精确搜索(3)
带你读《Elastic Stack 实战手册》之34:——3.4.2.17.3.全文搜索/精确搜索(3)
|
12月前
|
索引
带你读《Elastic Stack 实战手册》之34:——3.4.2.17.3.全文搜索/精确搜索(5)
带你读《Elastic Stack 实战手册》之34:——3.4.2.17.3.全文搜索/精确搜索(5)