美文网首页
ES Search API

ES Search API

作者: 鸿雁长飞光不度 | 来源:发表于2020-02-01 01:12 被阅读0次

    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

          本文链接:https://www.haomeiwen.com/subject/xpbgthtx.html