0

ES_ChatGPT问答

 1 year ago
source link: https://www.cnblogs.com/kakarotto-chen/p/17302851.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

Q1:springboot项目,如何使用elasticsearch的api增删改查?查询中有哪些方式,如果模糊查询、排序查询、分页查询?分别阐述下这些查询方式的用法?最后举一个完整的例子

在Spring Boot项目中使用Elasticsearch的API增删改查,需要引入spring-boot-starter-data-elasticsearch依赖。该依赖会给我们提供基本的Elasticsearch操作,例如使用ElasticsearchRestTemplate进行增删改查操作。

使用ElasticsearchRestTemplate进行查询操作,我们可以通过NativeSearchQueryBuilder组装查询的条件。查询可以使用如下几种方式:

  1. Term查询:用于匹配精确的值,不进行分词
QueryBuilder queryBuilder = QueryBuilders.termQuery("field", "value");
  1. Match查询:用于根据分词查询
QueryBuilder queryBuilder = QueryBuilders.matchQuery("field", "value");
  1. Bool查询:用于多条件查询
QueryBuilder queryBuilder = QueryBuilders.boolQuery()
        .must(QueryBuilders.matchQuery("field1", "value1"))
        .must(QueryBuilders.matchQuery("field2", "value2"));

常见的查询操作,包括模糊查询、排序查询、分页查询,我们可以通过在构建查询条件时,分别加入相应的条件来实现。

模糊查询需要使用wildcardQueryfuzzyQuery。其中,wildcardQuery是基于通配符的模糊查询,而fuzzyQuery则是基于编辑距离的模糊查询。

QueryBuilder queryBuilder = QueryBuilders.wildcardQuery("field", "value*");
QueryBuilder queryBuilder = QueryBuilders.fuzzyQuery("field", "value");

排序查询需要使用SortBuilder进行排序设置,排序字段需要在mapping设置。

NativeSearchQueryBuilder searchQueryBuilder = new NativeSearchQueryBuilder();
searchQueryBuilder.withSort(SortBuilders.fieldSort("field").order(SortOrder.ASC));

分页查询需要使用PageRequest对分页参数进行设置,然后传递给ElasticsearchRestTemplate进行查询。

PageRequest pageRequest = PageRequest.of(pageNumber, pageSize);
NativeSearchQueryBuilder searchQueryBuilder = new NativeSearchQueryBuilder();
searchQueryBuilder.withPageable(pageRequest);

我们来看一个完整的示例,以模糊查询、排序查询、分页查询为例:

@Autowired
private ElasticsearchRestTemplate restTemplate;

public Page<Book> searchBooks(String keyword, int pageNumber, int pageSize) {

    // 构建查询条件
    QueryBuilder queryBuilder = QueryBuilders.wildcardQuery("name", "*"+keyword+"*");
    
    NativeSearchQueryBuilder searchQueryBuilder = new NativeSearchQueryBuilder();
    // 使用查询条件
    searchQueryBuilder.withQuery(queryBuilder);
    // 分页
    PageRequest pageRequest = PageRequest.of(pageNumber, pageSize);
    searchQueryBuilder.withPageable(pageRequest);
    // 排序
    searchQueryBuilder.withSort(SortBuilders.fieldSort("price").order(SortOrder.ASC));

    NativeSearchQuery searchQuery = searchQueryBuilder.build();
    SearchHits<Book> searchHits = restTemplate.search(searchQuery, Book.class);
    return searchHits.map(SearchHit::getContent);
}

其中,定义了一个Book实体类,包含idnameprice三个属性。searchBooks方法使用wildcardQuery实现模糊查询,使用PageRequest实现分页查询,使用fieldSort实现排序查询。最后使用ElasticsearchRestTemplate执行查询,并返回查询结果。

Q2:elasticsearch中储存的复杂的数据机构是怎么样的,举个复杂结构的例子?

在Elasticsearch中Elasticsearch是基于Lucene的搜索引擎,支持嵌套的复杂结构。在Elasticsearch中,复杂数据结构以文档(Document)的方式储存,每个文档都由多个字段(Field)组成,每个字段可以是基本数据类型,也可以是对象类型,内部嵌套的对象类型被称为嵌套类型(Nested Type)。

下面是一个复杂结构的文档示例,它表示一个学生的信息,包括姓名、年龄、性别、所在学校、所在班级、选修的科目、成绩等信息。

{
    "name": "小明",
    "age": 18,
    "gender": "male",
    "school": {
        "name": "清华大学",
        "address": "北京市海淀区",
        "country": "中国"
    },
    "class": {
        "name": "高三(1)班",
        "teachers": ["李老师", "张老师"],
        "students": [
            {
                "name": "小明",
                "age": 18,
                "gender": "male"
            },
            {
                "name": "小红",
                "age": 17,
                "gender": "female"
            },
            {
                "name": "小刚",
                "age": 18,
                "gender": "male"
            }
        ]
    },
    "courses": [
        {
            "name": "语文",
            "teacher": "张老师",
            "score": 90
        },
        {
            "name": "数学",
            "teacher": "李老师",
            "score": 85
        },
        {
            "name": "英语",
            "teacher": "王老师",
            "score": 92
        }
    ]
}

可以看到,该文档中有嵌套的对象类型,包括schoolclassclass中又包括了一个嵌套的对象类型students,以及一个嵌套的简单数据类型teacherscourses是一个数组类型,包括多个嵌套的对象类型。

在Elasticsearch中,可以通过Mapping来指定文档中的字段类型和属性。对于嵌套类型,需要额外指定nested属性,才能支持嵌套查询。

{
  "mappings": {
    "properties": {
      "name": {
        "type": "text"
      },
      "age": {
        "type": "integer"
      },
      "gender": {
        "type": "keyword"
      },
      "school": {
        "type": "object",
        "properties": {
          "name": {
            "type": "text"
          },
          "address": {
            "type": "text"
          },
          "country": {
            "type": "keyword"
          }
        }
      },
      "class": {
        "type": "object",
        "properties": {
          "name": {
            "type": "text"
          },
          "teachers": {
            "type": "keyword"
          },
          "students": {
            "type": "nested",
            "properties": {
              "name": {
                "type": "text"
              },
              "age": {
                "type": "integer"
              },
              "gender": {
                "type": "keyword"
              }
            }
          }
        }
      },
      "courses": {
        "type": "nested",
        "properties": {
          "name": {
            "type": "text"
          },
          "teacher": {
            "type": "keyword"
          },
          "score": {
            "type": "integer"
          }
        }
      }
    }
  }
}

通过这样的Mapping,就能在Elasticsearch中储存并查询复杂的嵌套结构数据。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK