• ES的常用查询


    1 数据准备

    1.1 创建索引和新增数据

    先新增一条数据,新增数据时会自动创建索引 test_standard_analyzer。

    1. PUT /test_standard_analyzer/_doc/1
    2. {
    3. "remark": "This is a test doc"
    4. }

    然后查询一下。

    1. GET test_standard_analyzer/_search
    2. {
    3. "query": {
    4. "match_all": {}
    5. }
    6. }

    查询结果如下所示。

    1. {
    2. "took" : 2,
    3. "timed_out" : false,
    4. "_shards" : {
    5. "total" : 1,
    6. "successful" : 1,
    7. "skipped" : 0,
    8. "failed" : 0
    9. },
    10. "hits" : {
    11. "total" : {
    12. "value" : 1,
    13. "relation" : "eq"
    14. },
    15. "max_score" : 1.0,
    16. "hits" : [
    17. {
    18. "_index" : "test_standard_analyzer",
    19. "_type" : "_doc",
    20. "_id" : "1",
    21. "_score" : 1.0,
    22. "_source" : {
    23. "remark" : "This is a test doc"
    24. }
    25. }
    26. ]
    27. }
    28. }

    1.2 测试分词

    没指定es分词器时,es会使用默认分词器-standard。测试下分词效果。

    1. POST test_standard_analyzer/_analyze
    2. {
    3. "field": "remark",
    4. "text": "This is a test doc"
    5. }
    6. # 或
    7. POST test_standard_analyzer/_analyze
    8. {
    9. "analyzer": "standard",
    10. "text": "This is a test doc"
    11. }

    分词结果如下所示。

    1. {
    2. "tokens" : [
    3. {
    4. "token" : "this",
    5. "start_offset" : 0,
    6. "end_offset" : 4,
    7. "type" : "",
    8. "position" : 0
    9. },
    10. {
    11. "token" : "is",
    12. "start_offset" : 5,
    13. "end_offset" : 7,
    14. "type" : "",
    15. "position" : 1
    16. },
    17. {
    18. "token" : "a",
    19. "start_offset" : 8,
    20. "end_offset" : 9,
    21. "type" : "",
    22. "position" : 2
    23. },
    24. {
    25. "token" : "test",
    26. "start_offset" : 10,
    27. "end_offset" : 14,
    28. "type" : "",
    29. "position" : 3
    30. },
    31. {
    32. "token" : "doc",
    33. "start_offset" : 15,
    34. "end_offset" : 18,
    35. "type" : "",
    36. "position" : 4
    37. }
    38. ]
    39. }

    2 ES查询

    2.1 match

    match查询会将查询条件进行分词。命中数据的条件:匹配到查询条件的其中一个分词即可。

    以下查询将命中数据,查询条件被分词为“b”和“doc”。

    1. GET test_standard_analyzer/_search
    2. {
    3. "query": {
    4. "match": {
    5. "remark":"b doc"
    6. }
    7. }
    8. }

    2.2 match_phrase

    match查询也会将查询条件进行分词。

    命中数据的条件:(1)查询条件的所有分词都需要匹配到,(2)相对顺序还要一致,(3)默认(slop=0或者未设置该值)查询条件的分词在es数据中是连续的。

    2.2.1 查询条件的分词在es数据中需要是连续的

    (1)命中数据

    1. GET test_standard_analyzer/_search
    2. {
    3.   "query": {
    4.     "match_phrase": {
    5.       "remark":"a test doc"
    6.     }
    7.   }
    8. }

    (2)未命中数据

    以下查询未命中数据,因为查询条件的分词在es数据中不连续,中间还间隔一个“test”。

    1. GET test_standard_analyzer/_search
    2. {
    3.   "query": {
    4.     "match_phrase": {
    5.       "remark":"a doc"
    6.     }
    7.   }
    8. }

    2.2.2 查询条件的分词在es数据中不需要是连续的

    slop 参数用于指定中间可省略几个词语。slop > 0时,查询条件的分词在es数据中可以不连续。

    因此以下查询将命中数据。

    1. GET test_standard_analyzer/_search
    2. {
    3.   "query": {
    4.     "match_phrase": {
    5.       "remark":{
    6.         "query": "a doc",
    7.         "slop": 1
    8.       }
    9.     }
    10.   }
    11. }

    3 参考文献

    (1)【ES知识】ES基础查询语法一览

  • 相关阅读:
    【性能优化下】组织结构同步优化二,全量同步/增量同步,断点续传实现方式
    裴蜀定理(详解)
    Java8 parallerStream导致Spring项目启动线程阻塞(死锁)
    一文读懂,硬核 Apache DolphinScheduler3.0 源码解析
    php对接微信支付-详细教学
    Supershell防溯源反制配置
    接口自动化测试实战之接口框架修改与动态参数化与数据伪造
    ios应用内支付
    事务提交之后再执行某些操作 → 你有哪些实现方式?
    Python:实现recursive bubble sor递归冒泡排序算法(附完整源码)
  • 原文地址:https://blog.csdn.net/J_bean/article/details/134480521