ES Search API

1 Search API

  • URI Search
    在URL中使用查询参数
  • Request Body Search
    使用Elasticsearch提供的,基于JSON的更完备的查询(DSL)
语法 范围
/_search 集群上所有的索引
/index1/_search index1
/index1,index2/_search index1,index2
/index*/_search 以index开头的索引

2.搜索的相关性

  • 用户关心的相关性
    • 是否可以找到所有相关的内容
    • 有多少相关的内容被返回
    • 文档的打分是否合理
    • 结合业务需求,平衡结果排名
  • Web搜索 (Page Rank算法)
    • 不仅仅是内容
    • 更重要的的是可信度
  • 相关性的衡量
    • Precision(查准率),尽可能返回较少的无关文档
    • Recision(相关内容),尽可能返回多的相关的文档
    • Ranking - 是否能够按照相关度进行排序

3.URI Search详解

3.1URI Query实现搜索

格式:GET /index_name/_search?
查询字符串:q=china&df=title&sort=year:desc&from=0&size=1&timeout=1s

{
  "profile":true
}
  • q:指定查询语句,使用Query String Syntax
  • df:默认字段,不指定会对所有的字段查询
  • sort: 排序
  • from和size:用于分页
  • profile:true,可以查看是如何执行的。

3.2 Query String Syntax Part1

  • 指定字段的查询和泛查询
    • q=title:2012/q=2012&df=title
    • q=title
  • Term和Phrase
    • Beautiful Mind,等效 Beautiful OR Mind
    • "Beautiful Mind",等效于Beautiful And Mind,Phrase查询,还要求前后顺序保持一致。
  • 分组和引号
    • title:(Beautiful OR Mind)
    • title="Beautiful Mind"

3.3 Query String Syntax Part2

  • 布尔操作
    • AND /OR/NOT 或者 && / || /!
      • 必须大写
      • title:(A NOT B)
  • 分组
    • + 表示must
    • -表示must not
    • title:(+matrix -reload)
GET /movies/_search?q=title:(Beautiful NOT Mind)
GET /movies/_search?q=title:(Beautiful %2B Mind) #加号需要转义

3.4 Query String Syntax Part3

  • 范围查询
    • 区间表示:[]闭区间,{}开区间
    • year:{2015 TO 2018} ,year:[* TO 2018]
  • 算数符号
    • year:>2010
    • year:(>2010 && <=2018)
    • year:(+>2010 +<2018)

3.5 Query String Syntax Part4

  • 通配符查询(效率低)
    ?代表一个字符,*代表0或者多个字符。title:mi?d
  • 正则表达式
    title:[bt]oy
  • 模糊匹配与近似查询
    • title:beautiful~1(用户输入单词有一个字母输错可以兼容)
    • title:"lord rings"~2(要求lord和rings之间可以间隔两个单词),比如可以搜索出(Lord of the Rings)

4. Request Body

将请求的参数放在body里面,一些高阶的方法只支持Request body。

  • _source filtering
    • 如果source没有存储,只返回匹配的文档的元数据。
    • _source支持使用通配符, _source:["name","desc"]
  • sort 排序。 (sort:{"id":"desc"})
  • 脚本字段
  • 例如,结合汇率对订单进行排序
  • 字段拼接
GET /movies/_search
{
  "from":10,
  "size":20,
  "script_fields": {
    "new_field":{
      "script":{
        "lang":"painless",
        "source": "doc['year'].value+'_hello'"
      }
    }
  }, 
  "query":{
    "match_all": {}
  }
}
POST /movies/_search
{
  "from":10,
  "size":20,
  "_source": ["title","year"],
  "query":{
    "match_all": {}
  }
}

{
  "took" : 0,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 9754,
      "relation" : "eq"
    },
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "movies",
        "_type" : "_doc",
        "_id" : "LHHdfG4BIAugzu8i1C-n",
        "_score" : 1.0,
        "fields" : {
          "new_field" : [
            "1993_hello"
          ]
        }
      }
    ]
  }
}

4.1 Match 查询表达式

实现效果,参看前面的查询语法逻辑运算.

案例

GET /movies/_search
{
  "query":{
    "match":{
      "title":"Beautiful Mind"
    }
  }
}

查询title字段包含 Beautiful 或者 Mind

GET /movies/_search
{
  "query":{
    "match":{
      "title":{
        "query": "Beautiful Mind",
        "operator": "AND"
      }
    }
  }
}

查询title字段包含 Beautiful和Mind,且要求顺序。

4.2 match_phrase,短语查询

GET /movies/_search
{
  "query":{
    "match_phrase":{
      "title":{
        "query": "lord rings",
        "slop": 2
      }
    }
  }
}

短语查询,中间允许隔开两个单词

4.3 query string

类似与URI Query
格式案例

POST users/_search
{
  "query": {
    "query_string": {
      "default_field": "user_name",
      "query": "张三"
    }
  }
}

查询user_name字段包含张三的。

POST users/_search
{
  "query": {
    "query_string": {
      "fields": ["user_name","account"],
      "query": "张 AND 三"
    }
  }
}

user_name或者account包含张三的

4.4 simple query string

  • 类似Query String,但是会忽视错误的语法,只支持部分查询语法。
  • 不支持 AND OR NOT,会当字符串处理
  • Term之间默认是OR,可以通过default_operator字段指定。
  • 支持部分逻辑
    • + 替代 AND
    • | 替代OR
    • - 替代NOT

POST users/_search
{
  "query": {
    "simple_query_string": {
      "fields": ["user_name","account"],
      "query": "wang wei",
      "default_operator": "OR"
    }
  }
}

你可能感兴趣的:(ES Search API)