Elasticsearch-模糊查询

模糊查询

  • 前缀搜索:prefix

    概念:以xx开头的搜索,不计算相关度评分。
    注意:
    • 前缀搜索匹配的是term,而不是field。

    • 前缀搜索的性能很差

    • 前缀搜索没有缓存

    • 前缀搜索尽可能把前缀长度设置的更长

      语法:
      GET <index>/_search
      {
             
             
      "query": {
             
             
        "prefix": {
             
             
          "<field>": {
             
             
            "value": "<word_prefix>"
          }
        }
      }
      }
      index_prefixes: 默认   "min_chars" : 2,   "max_chars" : 5 
      
PUT my_index
{
   
   
  "mappings": {
   
   
    "properties": {
   
   
      "text": {
   
   
        "analyzer": "ik_max_word",
        "type": "text",
        "index_prefixes":{
   
   
          "min_chars":2,
          "max_chars":4
        },
        "fields": {
   
   
          "keyword": {
   
   
            "type": "keyword",
            "ignore_above": 256
          }
        }
      }
    }
  }
}

PUT my_index的含义是向Elasticsearch发送一个PUT请求来创建一个名为“my_index”的索引。
在Elasticsearch中,索引是用于存储和检索数据的容器。每个索引都有一个或多个映射(mapping),这些映射定义了索引中字段的类型、分析器、字段属性等。在提供的JSON中,“mappings"字段的作用是指定索引的映射定义。它定义了索引中包含的字段及其属性。
在"properties"字段下,定义了一个名为"text"的字段。该字段的配置如下:
“analyzer”: “ik_max_word”:指定使用"ik_max_word"分析器,这是一个用于中文分词的分析器。
“type”: “text”:字段类型设置为"text”,表示这是一个文本字段,可以用于全文搜索。
“index_prefixes”:定义了前缀搜索的参数,其中"min_chars"和"max_chars"分别表示最小和最大前缀长度。
“fields”:定义了多重字段(multi-fields),即一个字段可以有多个不同的表示。在这里,定义了一个名为"keyword"的子字段,其类型为"keyword",表示这是一个不分析的字段,通常用于精确匹配和排序。
"ik_max_word"是IK分词器的一个变种,用于中文分词。它试图将文本尽可能细粒度地分割成单词,以提供更好的全文搜索效果。
"index_prefixes"和"fields"的用途是提供对文本字段的额外索引方式。例如,"index_prefixes"使得可以使用前缀搜索,而"fields"中的"keyword"子字段使得可以进行精确匹配和排序,而不是基于分析器的全文搜索。
综合上述配置,这个映射定义了一个名为"text"的文本字段,该字段使用"ik_max_word"分析器进行中文分词,并提供了前缀搜索和精确匹配的不同索引方式。

GET my_index/_mapping
POST /my_index/_bulk?filter_path=items.*.error
{
   
   "index":{
   
   "_id":"1"}}
{
   
   "text":"城管打电话喊商贩去摆摊摊"}
{
   
   "index":{
   
   "_id":"2"}}
{
   
   "text":"笑果文化回应商贩老农去摆摊"}
{
   
   "index":{
   
   "_id":"3"}}
{
   
   "text":"老农耗时17年种出椅子树"}
{
   
   "index":{
   
   "_id":"4"}}
{
   
   "text":"夫妻结婚30多年AA制,被城管抓"}
{
   
   "index":{
   
   "_id":"5"}}
{
   
   "text":"黑人见义勇为阻止抢劫反被铐住"}
GET my_index/_search
GET my_index/_mapping
GET _analyze
{
   
   
  "analyzer": "ik_max_word",
  "text": ["城管打电话喊商贩去摆摊摊"]
}
GET my_index/_search
{
   
   
  "query": {
   
   
    "prefix": {
   
   
      "text": {
   
   
        "value": "摊摊"
      }
    }
  }
}
  • 通配符:wildcard

    概念:通配符运算符是匹配一个或多个字符的占位符。例如,*通配符运算符匹配零个或多个字符。您可以将通配符运算符与其他字符结合使用以创建通配符模式。
    注意:
    • 通配符匹配的也是term,而不是field

      语法:
      GET <index>/_search
      {
             
             
      "query": {
             
             
        "wildcard": {
             
             
          "<field>": {
             
             
            "value": "<word_with_wildcard>"
          }
        }
      }
      }
      
# 通配符
DELETE my_index
POST /my_index/_bulk
{
   
    "index": {
   
    "_id": "1"}
spring-boot-starter-data-elasticsearch8是一个用于在Spring Boot应用中集成Elasticsearch的starter包。它提供了一组简化的API和配置,使得在应用中使用Elasticsearch进行数据存储和检索变得更加方便。 在该starter包中,模糊查询可以通过使用Elasticsearch的QueryBuilders来实现。QueryBuilders是Elasticsearch提供的一个构建查询的工具类,可以用于构建各种类型的查询条件。 要实现模糊查询,可以使用QueryBuilders提供的模糊查询方法之一,比如fuzzyQuery()。该方法可以根据指定的字段和模糊度来进行模糊查询。以下是一个示例代码: ```java import org.elasticsearch.index.query.QueryBuilders; import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate; import org.springframework.data.elasticsearch.core.query.NativeSearchQuery; import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder; // 创建NativeSearchQueryBuilder对象 NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder(); // 添加模糊查询条件 queryBuilder.withQuery(QueryBuilders.fuzzyQuery("fieldName", "keyword")); // 创建NativeSearchQuery对象 NativeSearchQuery searchQuery = queryBuilder.build(); // 执行查询 List<YourEntity> results = elasticsearchRestTemplate.queryForList(searchQuery, YourEntity.class); ``` 在上述代码中,我们使用了NativeSearchQueryBuilder来构建查询条件,然后使用ElasticsearchRestTemplate执行查询。其中,"fieldName"是要进行模糊查询的字段名,"keyword"是要查询的关键词。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值