雁过留声 发表于 2023-4-11 08:57:01

ES_ChatGPT问答

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

答:
在Spring Boot项目中使用Elasticsearch的API增删改查,需要引入spring-boot-starter-data-elasticsearch依赖。该依赖会给我们提供基本的Elasticsearch操作,例如使用ElasticsearchRestTemplate进行增删改查操作。
使用ElasticsearchRestTemplate进行查询操作,我们可以通过NativeSearchQueryBuilder组装查询的条件。查询可以使用如下几种方式:

[*]Term查询:用于匹配精确的值,不进行分词
QueryBuilder queryBuilder = QueryBuilders.termQuery("field", "value");
[*]Match查询:用于根据分词查询
QueryBuilder queryBuilder = QueryBuilders.matchQuery("field", "value");
[*]Bool查询:用于多条件查询
QueryBuilder queryBuilder = QueryBuilders.boolQuery()
      .must(QueryBuilders.matchQuery("field1", "value1"))
      .must(QueryBuilders.matchQuery("field2", "value2"));常见的查询操作,包括模糊查询、排序查询、分页查询,我们可以通过在构建查询条件时,分别加入相应的条件来实现。

[*]模糊查询
模糊查询需要使用wildcardQuery或fuzzyQuery。其中,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实体类,包含id、name、price三个属性。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
      }
    ]
}可以看到,该文档中有嵌套的对象类型,包括school和class,class中又包括了一个嵌套的对象类型students,以及一个嵌套的简单数据类型teachers。courses是一个数组类型,包括多个嵌套的对象类型。
在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中储存并查询复杂的嵌套结构数据。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: ES_ChatGPT问答