市北建筑建网站哪家好,深圳市企业网站建设,营销导向的网站建设的主要流程,厦门集团网站设计公司Elasticsearch 提供了多种查询类型#xff0c;每种查询类型适用于不同的搜索场景。以下是八种常见的 Elasticsearch 查询类型及其详细说明和示例。
1. Match Query
用途#xff1a;用于全文搜索#xff0c;会对输入的文本进行分词#xff0c;并在索引中的字段中查找这些分…Elasticsearch 提供了多种查询类型每种查询类型适用于不同的搜索场景。以下是八种常见的 Elasticsearch 查询类型及其详细说明和示例。
1. Match Query
用途用于全文搜索会对输入的文本进行分词并在索引中的字段中查找这些分词。 特点支持模糊匹配、短语匹配等。
示例
json
GET /my_index/_search
{query: {match: {content: quick brown fox}}
}
2. Term Query
用途用于精确匹配不会对输入的文本进行分词。 特点适用于关键词、ID 等不需要分词的情况。
示例
json
GET /my_index/_search
{query: {term: {status: active}}
}
3. Terms Query
用途用于在一个字段上匹配多个值。 特点类似于 SQL 中的 IN 操作符。
示例
json
GET /my_index/_search
{query: {terms: {tags: [news, sports]}}
}
4. Range Query
用途用于范围查询可以指定数值或日期范围。 特点适用于数值型字段和日期字段。
示例
json
GET /my_index/_search
{query: {range: {age: {gte: 18,lte: 30}}}
}
5. Bool Query
用途组合多个查询条件支持 must必须满足、should应该满足、must_not必须不满足和 filter过滤子句。 特点灵活性高可以构建复杂的查询逻辑。
示例
json
GET /my_index/_search
{query: {bool: {must: [{ match: { title: Elasticsearch } },{ range: { date: { gte: now-1y/d }}}],filter: [{ term: { status: published }}]}}
}
6. Wildcard Query
用途使用通配符进行匹配。 特点支持 * 和 ? 通配符但性能较差应谨慎使用。
示例
json
GET /my_index/_search
{query: {wildcard: {name: joh*}}
}
7. Fuzzy Query
用途用于近似匹配允许一定数量的拼写错误。 特点适用于拼写错误较多的搜索场景。
示例
GET /my_index/_search
{query: {fuzzy: {username: {value: kenneth,fuzziness: AUTO}}}
}
8. Match Phrase Query
用途用于精确匹配整个短语。 特点不会对短语进行分词要求短语完全一致。
示例
json
GET /my_index/_search
{query: {match_phrase: {description: Elasticsearch search engine}}
}
总结
每种查询类型都有其特定的应用场景和优缺点
Match Query适合全文搜索。Term Query适合精确匹配。Terms Query适合多值匹配。Range Query适合范围查询。Bool Query适合复杂查询逻辑。Wildcard Query适合通配符匹配性能较低。Fuzzy Query适合拼写错误匹配。Match Phrase Query适合精确短语匹配。
通过合理选择和组合这些查询类型可以实现高效且灵活的搜索功能。
参考资料
Elasticsearch 官方文档Elasticsearch 查询 DSL 指南
这些资源提供了更多关于 Elasticsearch 查询类型的详细信息和示例帮助你更好地理解和使用这些查询
为了实现八种 Elasticsearch 查询类型并在 Web 前端展示结果我们可以使用 Spring Boot 构建后端服务并使用 Thymeleaf 作为模板引擎来构建前端页面。以下是一个完整的示例展示如何实现这八种查询类型并将结果显示在 Web 前端。
项目结构
spring-boot-elasticsearch-demo/
├── src/
│ ├── main/
│ │ ├── java/
│ │ │ └── com/
│ │ │ └── example/
│ │ │ ├── controller/
│ │ │ │ └── SearchController.java
│ │ │ ├── model/
│ │ │ │ └── Document.java
│ │ │ ├── repository/
│ │ │ │ └── DocumentRepository.java
│ │ │ ├── service/
│ │ │ │ └── SearchService.java
│ │ │ └── SpringBootElasticsearchDemoApplication.java
│ │ └── resources/
│ │ ├── application.yml
│ │ ├── static/
│ │ └── templates/
│ │ └── search.html
├── pom.xml
1. 添加依赖
在 pom.xml 中添加必要的依赖
xml
dependenciesdependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-data-elasticsearch/artifactId/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-thymeleaf/artifactId/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependencydependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactIdoptionaltrue/optional/dependencydependencygroupIdorg.elasticsearch.client/groupIdartifactIdelasticsearch-rest-high-level-client/artifactIdversion7.6.2/version/dependency
/dependencies
2. 配置文件
在 src/main/resources/application.yml 中配置 Elasticsearch 连接信息
yaml
spring:elasticsearch:rest:uris: http://localhost:9200server:port: 8080
3. 实体类
创建一个实体类 Document.java 表示索引中的文档
java
package com.example.model;import lombok.Data;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;Data
Document(indexName documents)
public class Document {Idprivate String id;Field(type FieldType.Text)private String title;Field(type FieldType.Text)private String content;Field(type FieldType.Integer)private Integer age;Field(type FieldType.Date)private String date;Field(type FieldType.Keyword)private String status;Field(type FieldType.Keyword)private String[] tags;Field(type FieldType.Keyword)private String username;
}
4. Repository 接口
创建一个 Repository 接口 DocumentRepository.java
java
package com.example.repository;import com.example.model.Document;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;public interface DocumentRepository extends ElasticsearchRepositoryDocument, String {
}
5. Service 层
创建一个 Service 类 SearchService.java 来处理各种查询逻辑
java
package com.example.service;import com.example.model.Document;
import com.example.repository.DocumentRepository;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.index.query.*;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.search.sort.SortOrder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;Service
public class SearchService {Autowiredprivate RestHighLevelClient client;public ListDocument matchQuery(String field, String query) throws IOException {SearchRequest searchRequest new SearchRequest(documents);SearchSourceBuilder sourceBuilder new SearchSourceBuilder();MatchQueryBuilder matchQueryBuilder QueryBuilders.matchQuery(field, query);sourceBuilder.query(matchQueryBuilder);searchRequest.source(sourceBuilder);SearchResponse searchResponse client.search(searchRequest, RequestOptions.DEFAULT);return getDocumentsFromResponse(searchResponse);}public ListDocument termQuery(String field, String value) throws IOException {SearchRequest searchRequest new SearchRequest(documents);SearchSourceBuilder sourceBuilder new SearchSourceBuilder();TermQueryBuilder termQueryBuilder QueryBuilders.termQuery(field, value);sourceBuilder.query(termQueryBuilder);searchRequest.source(sourceBuilder);SearchResponse searchResponse client.search(searchRequest, RequestOptions.DEFAULT);return getDocumentsFromResponse(searchResponse);}public ListDocument termsQuery(String field, ListString values) throws IOException {SearchRequest searchRequest new SearchRequest(documents);SearchSourceBuilder sourceBuilder new SearchSourceBuilder();TermsQueryBuilder termsQueryBuilder QueryBuilders.termsQuery(field, values);sourceBuilder.query(termsQueryBuilder);searchRequest.source(sourceBuilder);SearchResponse searchResponse client.search(searchRequest, RequestOptions.DEFAULT);return getDocumentsFromResponse(searchResponse);}public ListDocument rangeQuery(String field, Object gte, Object lte) throws IOException {SearchRequest searchRequest new SearchRequest(documents);SearchSourceBuilder sourceBuilder new SearchSourceBuilder();RangeQueryBuilder rangeQueryBuilder QueryBuilders.rangeQuery(field).gte(gte).lte(lte);sourceBuilder.query(rangeQueryBuilder);searchRequest.source(sourceBuilder);SearchResponse searchResponse client.search(searchRequest, RequestOptions.DEFAULT);return getDocumentsFromResponse(searchResponse);}public ListDocument boolQuery(MapString, Object mustQueries, MapString, Object shouldQueries, MapString, Object mustNotQueries) throws IOException {SearchRequest searchRequest new SearchRequest(documents);SearchSourceBuilder sourceBuilder new SearchSourceBuilder();BoolQueryBuilder boolQueryBuilder QueryBuilders.boolQuery();if (mustQueries ! null) {for (Map.EntryString, Object entry : mustQueries.entrySet()) {boolQueryBuilder.must(QueryBuilders.matchQuery(entry.getKey(), entry.getValue()));}}if (shouldQueries ! null) {for (Map.EntryString, Object entry : shouldQueries.entrySet()) {boolQueryBuilder.should(QueryBuilders.matchQuery(entry.getKey(), entry.getValue()));}}if (mustNotQueries ! null) {for (Map.EntryString, Object entry : mustNotQueries.entrySet()) {boolQueryBuilder.mustNot(QueryBuilders.matchQuery(entry.getKey(), entry.getValue()));}}sourceBuilder.query(boolQueryBuilder);searchRequest.source(sourceBuilder);SearchResponse searchResponse client.search(searchRequest, RequestOptions.DEFAULT);return getDocumentsFromResponse(searchResponse);}public ListDocument wildcardQuery(String field, String value) throws IOException {SearchRequest searchRequest new SearchRequest(documents);SearchSourceBuilder sourceBuilder new SearchSourceBuilder();WildcardQueryBuilder wildcardQueryBuilder QueryBuilders.wildcardQuery(field, value);sourceBuilder.query(wildcardQueryBuilder);searchRequest.source(sourceBuilder);SearchResponse searchResponse client.search(searchRequest, RequestOptions.DEFAULT);return getDocumentsFromResponse(searchResponse);}public ListDocument fuzzyQuery(String field, String value) throws IOException {SearchRequest searchRequest new SearchRequest(documents);SearchSourceBuilder sourceBuilder new SearchSourceBuilder();FuzzyQueryBuilder fuzzyQueryBuilder QueryBuilders.fuzzyQuery(field, value);sourceBuilder.query(fuzzyQueryBuilder);searchRequest.source(sourceBuilder);SearchResponse searchResponse client.search(searchRequest, RequestOptions.DEFAULT);return getDocumentsFromResponse(searchResponse);}public ListDocument matchPhraseQuery(String field, String phrase) throws IOException {SearchRequest searchRequest new SearchRequest(documents);SearchSourceBuilder sourceBuilder new SearchSourceBuilder();MatchPhraseQueryBuilder matchPhraseQueryBuilder QueryBuilders.matchPhraseQuery(field, phrase);sourceBuilder.query(matchPhraseQueryBuilder);searchRequest.source(sourceBuilder);SearchResponse searchResponse client.search(searchRequest, RequestOptions.DEFAULT);return getDocumentsFromResponse(searchResponse);}private ListDocument getDocumentsFromResponse(SearchResponse searchResponse) {ListDocument documents new ArrayList();searchResponse.getHits().forEach(hit - {Document document new Document();document.setId(hit.getId());document.setTitle((String) hit.getSourceAsMap().get(title));document.setContent((String) hit.getSourceAsMap().get(content));document.setAge((Integer) hit.getSourceAsMap().get(age));document.setDate((String) hit.getSourceAsMap().get(date));document.setStatus((String) hit.getSourceAsMap().get(status));document.setTags((String[]) hit.getSourceAsMap().get(tags));document.setUsername((String) hit.getSourceAsMap().get(username));documents.add(document);});return documents;}
}
6. Controller 层
创建一个 Controller 类 SearchController.java 来处理 HTTP 请求并返回结果
java
package com.example.controller;import com.example.model.Document;
import com.example.service.SearchService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;Controller
public class SearchController {Autowiredprivate SearchService searchService;GetMapping(/search)public String search(RequestParam(required false) String queryType,RequestParam(required false) String field,RequestParam(required false) String query,RequestParam(required false) String value,RequestParam(required false) String gte,RequestParam(required false) String lte,RequestParam(required false) String[] values,Model model) throws IOException {ListDocument results null;switch (queryType) {case match:results searchService.matchQuery(field, query);break;case term:results searchService.termQuery(field, value);break;case terms:results searchService.termsQuery(field, List.of(values));break;case range:results searchService.rangeQuery(field, gte, lte);break;case bool:MapString, Object mustQueries new HashMap();MapString, Object shouldQueries new HashMap();MapString, Object mustNotQueries new HashMap();if (field ! null query ! null) {mustQueries.put(field, query);}results searchService.boolQuery(mustQueries, shouldQueries, mustNotQueries);break;case wildcard:results searchService.wildcardQuery(field, value);break;case fuzzy:results searchService.fuzzyQuery(field, value);break;case match_phrase:results searchService.matchPhraseQuery(field, query);break;default:// Handle default case or throw an exceptionbreak;}model.addAttribute(results, results);return search;}
}
7. 前端页面
创建一个 Thymeleaf 模板 search.html 来展示搜索结果
html
!DOCTYPE html
html xmlns:thhttp://www.thymeleaf.org
headmeta charsetUTF-8titleElasticsearch Queries/titlelink relstylesheet hrefhttps://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css
/head
body
div classcontainer mt-5h1Elasticsearch Queries/h1form methodget action/searchdiv classform-grouplabel forqueryTypeQuery Type:/labelselect classform-control idqueryType namequeryTypeoption valuematchMatch/optionoption valuetermTerm/optionoption valuetermsTerms/optionoption valuerangeRange/optionoption valueboolBool/optionoption valuewildcardWildcard/optionoption valuefuzzyFuzzy/optionoption valuematch_phraseMatch Phrase/option/select/divdiv classform-grouplabel forfieldField:/labelinput typetext classform-control idfield namefield/divdiv classform-grouplabel forqueryQuery:/labelinput typetext classform-control idquery namequery/divdiv classform-grouplabel forvalueValue:/labelinput typetext classform-control idvalue namevalue/divdiv classform-grouplabel forgteGTE:/labelinput typetext classform-control idgte namegte/divdiv classform-grouplabel forlteLTE:/labelinput typetext classform-control idlte namelte/divdiv classform-grouplabel forvaluesValues (comma separated):/labelinput typetext classform-control idvalues namevalues/divbutton typesubmit classbtn btn-primarySearch/button/formhrh2Results:/h2table classtable table-stripedtheadtrthID/ththTitle/ththContent/ththAge/ththDate/ththStatus/ththTags/ththUsername/th/tr/theadtbodytr th:eachdocument : ${results}td th:text${document.id}/tdtd th:text${document.title}/tdtd th:text${document.content}/tdtd th:text${document.age}/tdtd th:text${document.date}/tdtd th:text${document.status}/tdtd th:text${#strings.arrayJoin(document.tags, , )}/tdtd th:text${document.username}/td/tr/tbody/table
/div
/body
/html
8. 启动类
创建启动类 SpringBootElasticsearchDemoApplication.java
java
package com.example;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;SpringBootApplication
public class SpringBootElasticsearchDemoApplication {public static void main(String[] args) {SpringApplication.run(SpringBootElasticsearchDemoApplication.class, args);}
}
9. 测试数据
确保 Elasticsearch 中有一些测试数据以便进行查询。你可以使用 Kibana 或 curl 命令插入一些文档到 documents 索引中。
示例文档
json
POST /documents/_doc/1
{title: Introduction to Elasticsearch,content: Elasticsearch is a distributed, RESTful search and analytics engine.,age: 5,date: 2023-01-01,status: published,tags: [elasticsearch, search],username: john_doe
}POST /documents/_doc/2
{title: Advanced Elasticsearch Techniques,content: Learn advanced techniques in Elasticsearch for better performance.,age: 3,date: 2023-06-15,status: draft,tags: [elasticsearch, advanced],username: jane_smith
}
10. 运行项目
启动 Elasticsearch确保 Elasticsearch 服务器正在运行。插入测试数据使用上述示例文档插入测试数据。启动 Spring Boot 应用
bash
./mvnw spring-boot:run
4.访问应用打开浏览器访问 http://localhost:8080/search。
使用说明
在前端页面中可以选择不同的查询类型并输入相应的参数点击“Search”按钮即可查看查询结果。以下是每种查询类型的示例参数 Match Query Query Type: matchField: contentQuery: introduction Term Query Query Type: termField: statusValue: published Terms Query Query Type: termsField: tagsValues: elasticsearch,search Range Query Query Type: rangeField: ageGTE: 1LTE: 5 Bool Query Query Type: boolField: statusQuery: published Wildcard Query Query Type: wildcardField: usernameValue: john* Fuzzy Query Query Type: fuzzyField: usernameValue: jon_doe Match Phrase Query Query Type: match_phraseField: titleQuery: Introduction to Elasticsearch
通过这种方式你可以在 Web 前端展示和测试八种常见的 Elasticsearch 查询类型。