ES DSL搜索入门

1 数据准备

1.1 创建索引库

新建一个测试索引库 search_demo

在这里插入图片描述

1.2 设置索引的 mapping 结构

POST  /search_demo/_mapping
{
    
    
  "properties":{
    
    
    "id": {
    
    
      "type": "long"
    },
     "age": {
    
    
      "type": "integer"
    },
     "username": {
    
    
      "type": "keyword"
    },
     "nickname": {
    
    
      "type": "text",
      "analyzer": "ik_max_word",
    },
     "money": {
    
    
      "type": "float"
    },
     "desc": {
    
    
      "type": "text",
       "analyzer": "ik_max_word"
    },
     "sex": {
    
    
      "type": "byte"
    },
     "birthday": {
    
    
      "type": "date"
    },
     "face": {
    
    
      "type": "text",
      "index": false
    }
  }
}

1.3 文档数据

CSDN下载地址: https://download.csdn.net/download/qq_15769939/15577363

1.4 自定义中文分词

详细可查看文档 https://blog.csdn.net/qq_15769939/article/details/114435973

配置分词器

[root@localhost config]# vi /usr/local/elasticsearch-7.4.2/plugins/ik/config/custom.dic
好的
好
的

重启es服务

[root@localhost config]# /usr/local/elasticsearch-7.4.2/bin/elasticsearch -d

2 搜索

2.1 普通参数查询

普通查询可以称为 QueryString 查询方式,参数放在url中作为请求参数。

查询 字段 包含 内容 的文档

GET /search_demo/_doc/_search?q=desc:test

2.2 DSL查询

QueryString用的很少,一旦参数复杂就难以构建,所以大多查询都会使用DSL来进行查询。

  • Domain Specific Language
  • 特定领域语言
  • 基于JSON格式的数据查询
  • 查询更灵活,有利于复杂查询

查询统一请求路径

POST /search_demo/_doc/_search

2.2.1 查询指定字段

传递JSON数据

扫描二维码关注公众号,回复: 12758150 查看本文章
{
    
    
    "query": {
    
    
        "match": {
    
    
            "desc": "项目"
        }
    }
}

请求结果

{
    
    
    "took": 16,
    "timed_out": false,
    "_shards": {
    
    
        "total": 1,
        "successful": 1,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
    
    
        "total": {
    
    
            "value": 1,
            "relation": "eq"
        },
        "max_score": 1.4514983,
        "hits": [
            {
    
    
                "_index": "search_demo",
                "_type": "_doc",
                "_id": "1001",
                "_score": 1.4514983,
                "_source": {
    
    
                    "id": 1001,
                    "age": 18,
                    "username": "Tic",
                    "nickname": "飞翔的荷兰号",
                    "money": 88.8,
                    "desc": "我在p2pi网站解决项目中遇到的问题,学习到了很多知识",
                    "sex": 0,
                    "birthday": "1992-12-24",
                    "face": "http://www.p2pi.cn/static/img/1001_face.png"
                }
            }
        ]
    }
}

2.2.2 判断某个字段是否存在

传递JSON数据

{
    
    
    "query": {
    
    
        "exists": {
    
    
            "field": "test"
        }
    }
}

请求结果

{
    
    
    "took": 1,
    "timed_out": false,
    "_shards": {
    
    
        "total": 1,
        "successful": 1,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
    
    
        "total": {
    
    
            "value": 0,
            "relation": "eq"
        },
        "max_score": null,
        "hits": []
    }
}
  • 语法格式为一个json Object,内容都是key-value键值对,json可以循环嵌套
  • key可以是一些es的关键字,也可以是某个field字段

2.2.3 问题定位

DSL查询过程中检查会出现一些错误查询,出现这样的问题大多数都是json无法被es解析,es会报异常信息返回,可以根据异常信息去判断问题所在,比如json格式不对,关键字不存在,未注册等等。

例子:

{
    "query2": {
        "exists": {
            "field": "test"
        }
    }
}

请求结果

{
    
    
    "error": {
    
    
        "root_cause": [
            {
    
    
                "type": "parsing_exception",
                "reason": "Unknown key for a START_OBJECT in [query2].",
                "line": 2,
                "col": 15
            }
        ],
        "type": "parsing_exception",
        "reason": "Unknown key for a START_OBJECT in [query2].",
        "line": 2,
        "col": 15
    },
    "status": 400
}

3 相关信息

  • 博文不易,辛苦各位猿友点个关注和赞,感谢

猜你喜欢

转载自blog.csdn.net/qq_15769939/article/details/114479270