ES花式查询

简单搜索

PUT /test3/_doc/2
{
  "name": "JonathanLee",
  "age": 23
}
GET /test3/_doc/2

简单的条件查询,可以根据默认的映射规则,产生基本的查询

GET /test3/_doc/_search?q=name:JonathanLee

复杂搜索

GET /test3/_doc/_search
{
  "query": {
    "match": {
      "name": "JonathanLee"
    }
  }
}

多添加几条数据方便观察

PUT /test3/_doc/3
{
  "name": "小灰灰",
  "age": 18
}
PUT /test3/_doc/4
{
  "name": "灰灰",
  "age": 3
}
GET /test3/_doc/_search
{
  "query": {
    "match": {
      "name": "灰灰"
    }
  }
}

hits

  • 索引和文档的信息
  • 查询的结果总数
  • 然后就是查询出来的具体的文档
  • 数据中的东西都可以遍历出来
  • 分数score,我们可以通过来判断谁更加符合结果

输出结果,不想要那么多,结果的过滤

GET /test3/_doc/_search
{
  "query": {
    "match": {
      "name": "灰灰"
    }
  },
  "_source": ["name"]
}

之后使用Java操作elasticsearch,所有的方法和对象就是这里面的key

排序

GET /test3/_doc/_search
{
  "query": {
    "match": {
      "name": "灰灰"
    }
  },
  "sort": [
    {
      "age": {
        "order": "desc"
      }
    }
  ]
}

分页

GET /test3/_doc/_search
{
  "query": {
    "match": {
      "name": "灰灰"
    }
  },
  "sort": [
    {
      "age": {
        "order": "desc"
      }
    }
  ],
  "from": 0,
  "size": 1
}

数据下标还是从0开始的,和MySQL差不多,数据结构都是一样的

布尔值查询

must(and)所有的条件都要符合,多条件查询

GET /test3/_doc/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "name": "灰灰"
          }
        },
        {
          "match": {
            "age": 18
          }
        }
      ]
    }
  }
}

should(or)其中的条件满足一个就可以了

GET /test3/_doc/_search
{
  "query": {
    "bool": {
      "should": [
        {
          "match": {
            "name": "灰灰"
          }
        },
        {
          "match": {
            "age": 18
          }
        }
      ]
    }
  }
}

must_not(not),查询年龄不是3岁的人

GET /test3/_doc/_search
{
  "query": {
    "bool": {
      "must_not": [
        {
          "match": {
            "age": 3
          }
        }
      ]
    }
  }
}

过滤器Filter

可以使用filter,进行数据过滤,可以使用多个条件进行过滤

GET /test3/_doc/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "name": "灰灰"
          }
        }
      ],
      "filter": {
        "range": {
          "age": {
            "lt": 23
          }
        }
      }
    }
  }
}
  • gt:大于
  • lt:小于
  • gte:大于等于
  • lte:小于等于

🐤匹配多个条件

PUT /test3/_doc/5
{
  "name": "BNTang",
  "age": 45,
  "tags": ["男", "宅男"]
}
GET /test3/_doc/_search
{
  "query": {
    "match": {
      "tags": "男 技术"
    }
  }
}

  • 多个条件使用空格隔开
  • 只要满足其中一个,即可被查出
  • 这个时候可以通过分值基本的判断

🐸精确查询

  • term查询是直接通过倒排索引指定的词条进行精确查询

关于分词

  • term:直接查询精确的
  • match:会使用分词器解析(先分析文档,然后在通过分析的文档进行查询)

两个类型

  • text
  • keyword
PUT /testdb
{
  "mappings": {
    "properties": {
      "name": {
        "type": "text"
      },
      "desc": {
        "type": "keyword"
      }
    }
  }
}
PUT /testdb/_doc/1
{
  "name": "灰灰说Java name",
  "desc": "灰灰说Java desc"
}
PUT /testdb/_doc/2
{
  "name": "灰灰说Java name2",
  "desc": "灰灰说Java desc2"
}

以上是创建一个索引,并且添加好测试数据

GET _analyze
{
  "analyzer": "keyword",
  "text": "灰灰说Java name"
}

没有被分析

GET _analyze
{
  "analyzer": "standard",
  "text": "灰灰说Java name"
}

可以看到被拆分了

GET /testdb/_search
{
  "query": {
    "term": {
      "name": "灰"
    }
  }
}
GET /testdb/_search
{
  "query": {
    "term": {
      "desc": "灰灰说Java desc"
    }
  }
}
  • keyword字段类型不会被分词器解析

多个值匹配精确查询

PUT /testdb/_doc/3
{
  "t1": "22",
  "t2": "2020-8-17"
}
PUT /testdb/_doc/4
{
  "t1": "33",
  "t2": "2020-8-18"
}
GET /testdb/_search
{
  "query": {
    "bool": {
      "should": [
        {
          "term": {
            "t1": "22"
          }
        },
        {
          "term": {
            "t1": "33"
          }
        }
      ]
    }
  }
}

高亮查询

GET /test3/_doc/_search
{
  "query": {
    "match": {
      "name": "灰"
    }
  },
  "highlight": {
    "fields": {
      "name": {}
    }
  }
}
  • 搜索相关的结果可以高亮显示

🐸自定义搜索高亮条件

GET /test3/_doc/_search
{
  "query": {
    "match": {
      "name": "灰"
    }
  },
  "highlight": {
    "pre_tags": "<p class='key' style='color:red'>",
    "post_tags": "</p>",
    "fields": {
      "name": {}
    }
  }
}
posted @   BNTang  阅读(208)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具
点击右上角即可分享
微信分享提示