Algunas implementaciones de API de ElasticSearch en Java

consulta todo

Consultar los documentos del tipo especificado en la biblioteca de índice especificada. (usando este método)

{
    
    
	"query": {
    
    
		"match_all": {
    
    }
	},
	"_source" : ["name","studymodel"]
}

_source: configuración del filtro de origen, especifique qué campos se incluyen en el resultado.

Descripción del resultado:

tomó: el tiempo empleado en esta operación, en milisegundos.

timed_out: si se agotó el tiempo de espera de la solicitud

_shards: indica qué fragmentos se buscaron en esta operación

aciertos: registros alcanzados por la búsqueda

hits.total : el número total de documentos que coinciden con los criterios

hits.hits : N principales documentos con alta coincidencia

hits.max_score: puntaje de coincidencia del documento, aquí está el puntaje más alto

_score: cada documento tiene una puntuación de coincidencia, ordenada en orden descendente.

_source: Muestra el contenido original del documento.

Cliente Java

@SpringBootTest
@RunWith(SpringRunner.class)
public class TestDSL {
    
    

    @Autowired
    RestHighLevelClient restHighLevelClient;

    @Autowired
    RestClient restClient;

    //全部搜索
    @Test
    public void testSearchAll() throws IOException {
    
    
        //创建搜索对象
        SearchRequest searchRequest = new SearchRequest("xc_course");
        //指定类型
        searchRequest.types("doc");
        //创建搜索源对象
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        //搜索方式 搜索全部
        searchSourceBuilder.query(QueryBuilders.matchAllQuery());
        //设置源字段过滤 第一个参数是包括哪些字段,第二个参数是不包括哪些字段
        searchSourceBuilder.fetchSource(new String[]{
    
    "name","studymodel"},new String[]{
    
    });
        //向搜索对象中设置搜索源
        searchRequest.source(searchSourceBuilder);
        //执行搜索
        SearchResponse response = restHighLevelClient.search(searchRequest);
        //搜索结果
        SearchHits hits = response.getHits();
        //匹配的总记录数
        long totalHits = hits.totalHits;
        //得到匹配度最高的文档
        SearchHit[] hitsHits = hits.getHits();
        for (SearchHit hit : hitsHits){
    
    
            Map<String, Object> sourceAsMap = hit.getSourceAsMap();
            System.out.println(sourceAsMap);
        }
    }
}

Consulta de paginación

ES admite consultas de paginación, pasando dos parámetros: desde y tamaño.

formulario: Indica el subíndice del documento de partida, a partir de 0.

tamaño: El número de documentos a consultar.

{
    
     "
	from" : 0, "size" : 1,
	"query": {
    
    
		"match_all": {
    
    }
	},
	"_source" : ["name","studymodel"]
}

Cliente Java

SearchRequest searchRequest = new SearchRequest("xc_course");
searchRequest.types("xc_course");
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(QueryBuilders.matchAllQuery());
//分页查询,设置起始下标,从0开始
searchSourceBuilder.from(0);
//每页显示个数
searchSourceBuilder.size(10);
//source源字段过虑
searchSourceBuilder.fetchSource(new String[]{
    
    "name","studymodel"}, new String[]{
    
    });
searchRequest.source(searchSourceBuilder);
SearchResponse searchResponse = client.search(searchRequest);

Consulta de término

La consulta de términos es una consulta exacta, que coincidirá con la palabra clave en su totalidad durante la búsqueda y ya no dividirá la palabra clave en palabras.

{
    
    
	"query": {
    
    
		"term" : {
    
    
			"name": "spring"
		}
	},
	"_source" : ["name","studymodel"]
}

La búsqueda anterior buscará documentos cuyo nombre contenga la palabra "primavera".

Java Clien

SearchRequest searchRequest = new SearchRequest("xc_course");
searchRequest.types("xc_course");
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(QueryBuilders.termQuery("name","spring"));
//source源字段过虑
searchSourceBuilder.fetchSource(new String[]{
    
    "name","studymodel"}, new String[]{
    
    });
searchRequest.source(searchSourceBuilder);
SearchResponse searchResponse = client.search(searchRequest);

Coincidencia exacta por ID

ES proporciona un método de coincidencia basado en múltiples valores de identificación:

{
    
    
	"query": {
    
    
		"ids" : {
    
    
			"type" : "doc",
			"values" : ["3", "4", "100"]
		}
	}
}

Cliente Java

String[] split = new String[]{
    
    "1","2"};
List<String> idList = Arrays.asList(split);
searchSourceBuilder.query(QueryBuilders.termsQuery("_id", idList));

consulta de coincidencia

1. Uso básico

Match Query es una búsqueda de texto completo. Su método de búsqueda es primero segmentar la cadena de búsqueda en palabras y luego usar cada entrada para buscar en el índice.

La diferencia entre la consulta de coincidencia y la consulta de términos es que la consulta de coincidencia primero divide la palabra clave de búsqueda en palabras antes de buscar y luego usa cada palabra para buscar en el índice.

{
    
    
	"query": {
    
    
		"match" : {
    
    
			"description" : {
    
    
				"query" : "spring开发",
				"operator" : "or"
			}
		}
	}
}

consulta: Las palabras clave a buscar. Si hay varias palabras en las palabras clave en inglés, deben estar separadas por comas. Para las palabras clave en chino, pueden estar separadas por comas o no.

operador: or significa que la condición se cumple siempre que aparezca una palabra en el documento, y significa que la condición se cumple solo si todas las palabras aparecen en el documento.

El proceso de ejecución de la búsqueda anterior es:

1. Dividir "desarrollo primaveral" en dos palabras, primavera y desarrollo

2. Luego use las dos palabras primavera y desarrollo para buscar en el índice correspondiente.

3. Dado que el operador está configurado en o, siempre que una palabra coincida correctamente, se devolverá el documento.

Cliente Java

//根据关键字搜索
@Test
public void testMatchQuery() throws IOException {
    
    
	SearchRequest searchRequest = new SearchRequest("xc_course");
	searchRequest.types("xc_course");
	SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
	//source源字段过虑
	searchSourceBuilder.fetchSource(new String[]{
    
    "name","studymodel"}, new String[]{
    
    });
	//匹配关键字
	searchSourceBuilder.query(QueryBuilders.matchQuery("description", "spring开发").operator(Operator.OR));
	searchRequest.source(searchSourceBuilder);
	SearchResponse searchResponse = client.search(searchRequest);
	SearchHits hits = searchResponse.getHits();
	SearchHit[] searchHits = hits.getHits();
	for (SearchHit hit : searchHits) {
    
    
		String index = hit.getIndex();
		String type = hit.getType();
		String id = hit.getId();
		float score = hit.getScore();
		String sourceAsString = hit.getSourceAsString();
		Map<String, Object> sourceAsMap = hit.getSourceAsMap();
		String name = (String) sourceAsMap.get("name");
		String studymodel = (String) sourceAsMap.get("studymodel");
        String description = (String) sourceAsMap.get("description");
        System.out.println(name);
        System.out.println(studymodel);
        System.out.println(description);
	}
}

2, mínimo_debería_coincidir

El operador = o utilizado anteriormente significa que siempre que una palabra coincida, se obtendrá la puntuación. Si al menos dos palabras coinciden con tres palabras, ¿cómo lograrlo?

Utilice minimal_should_match para especificar la proporción de palabras coincidentes del documento:

Por ejemplo, la sentencia de búsqueda es la siguiente:

{
    
    
	"query": {
    
    
		"match" : {
    
    
        "description" : {
    
    
        	"query" : "spring开发框架",
        	"minimum_should_match": "80%"
       		}
        }
    }
}

"marco de desarrollo de primavera" se dividirá en tres palabras: primavera, desarrollo, marco

Establecer "minimum_should_match": "80%" significa que la proporción de coincidencia de tres palabras en el documento es del 80%, es decir, 3*0.8=2.4, que se redondea a 2, lo que indica que al menos dos palabras deben coincidir con éxito. en el documento

Cliente Java

//匹配关键字
MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("description", "前台页面开发框架 架构").minimumShouldMatch("80%");//设置匹配占比
searchSourceBuilder.query(matchQueryBuilder);

consulta múltiple

TermQuery y matchQuery aprendidos anteriormente solo pueden hacer coincidir un campo a la vez. En esta sección, aprenderemos multiQuery, que puede hacer coincidir varios campos a la vez.

1. El uso básico de la coincidencia de un solo elemento es la coincidencia en un campo, y la coincidencia de varios elementos es usar palabras clave para coincidir en varios campos.

Tome la palabra clave "spring css" para que coincida con los campos de nombre y descripción

{
    
    
    "query": {
    
    
        "multi_match" : {
    
    
            "query" : "spring css",
            "minimum_should_match": "50%",
            "fields": [ "name", "description" ]
    	}
    }
}

2. impulso impulso

Al hacer coincidir varios campos, el impulso (peso) del campo se puede aumentar para mejorar la puntuación

Boost boost, generalmente el peso de la palabra clave que coincide con el nombre es mayor que el peso de la coincidencia con la descripción, aquí puede aumentar el peso del nombre.

{
    
    
	"query": {
    
    
		"multi_match" : {
    
    
            "query" : "spring框架",
            "minimum_should_match": "50%",
            "fields": [ "name^10", "description" ]
		}
	}
}

"name^10" significa que el peso aumenta 10 veces, se ejecuta la consulta anterior y se encuentra que los documentos que contienen la palabra clave spring en el nombre se clasifican en primer lugar.

Cliente Java

MultiMatchQueryBuilder multiMatchQueryBuilder = QueryBuilders.multiMatchQuery("spring框架",
"name", "description").minimumShouldMatch("50%");
multiMatchQueryBuilder.field("name",10);//提升boost

consulta booleana

La consulta booleana corresponde a la consulta BooleanQuery de Lucene, que realiza la combinación de múltiples consultas.

Tres parámetros:

  • must: El documento debe coincidir con las condiciones de consulta incluidas en must, que es equivalente a "AND"
  • debería: el documento debe coincidir con una o más de las condiciones de consulta incluidas en debería, que es equivalente a "O"
  • must_not: El documento no puede coincidir con la condición de consulta incluida en must_not, que es equivalente a "NOT"

Use must, should, must_not para probar la siguiente consulta:

{
    
    
    "_source" : [ "name", "studymodel", "description"],
    "from" : 0, "size" : 1,
        "query": {
    
    
            "bool" : {
    
    
            "must":[
                {
    
    
                    "multi_match" : {
    
    
                        "query" : "spring框架",
                        "minimum_should_match": "50%",
                        "fields": [ "name^10", "description" ]
                    }
                },
                {
    
    
                    "term":{
    
    
                    	"studymodel" : "201001"
                    }
                }
            ]
        }
    }
}

debe: significa que debe cumplir varias condiciones de consulta. (usualmente se usa mosto)

debería: indica o, siempre que se cumpla una de las múltiples condiciones de consulta.

must_not: significa no.

Cliente Java

//BoolQuery,将搜索关键字分词,拿分词去索引库搜索
@Test
public void testBoolQuery() throws IOException {
    
    
	//创建搜索请求对象
	SearchRequest searchRequest= new SearchRequest("xc_course");
	searchRequest.types("doc");
	//创建搜索源配置对象
	SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
	searchSourceBuilder.fetchSource(new String[]{
    
    "name","pic","studymodel"},new String[]{
    
    });
	//multiQuery
	String keyword = "spring开发框架";
	MultiMatchQueryBuilder multiMatchQueryBuilder = QueryBuilders.multiMatchQuery("spring框架",
	"name", "description").minimumShouldMatch("50%");
	multiMatchQueryBuilder.field("name",10);
	//TermQuery
	TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("studymodel", "201001");
	//布尔查询
	BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
	boolQueryBuilder.must(multiMatchQueryBuilder);
	boolQueryBuilder.must(termQueryBuilder);
	//设置布尔查询对象
	searchSourceBuilder.query(boolQueryBuilder);
	searchRequest.source(searchSourceBuilder);//设置搜索源配置
	SearchResponse searchResponse = client.search(searchRequest);
	SearchHits hits = searchResponse.getHits();
	SearchHit[] searchHits = hits.getHits();
	for(SearchHit hit:searchHits){
    
    
		Map<String, Object> sourceAsMap = hit.getSourceAsMap();
		System.out.println(sourceAsMap);
	}
}

filtrar

Filtrar es filtrar los resultados de la búsqueda. El filtro juzga principalmente si el documento coincide, y no calcula ni juzga la puntuación de coincidencia del documento. Por lo tanto, el rendimiento del filtro es más alto que el de la consulta, y es conveniente para almacenamiento en caché. Se recomienda utilizar el filtro tanto como sea posible. Consultar o filtrar y consultar juntos.

Los filtros se utilizan en consultas booleanas y el siguiente filtro se basa en los resultados de la búsqueda:

{
    
    
	"_source": ["name", "studymodel", "description", "price"],
	"query": {
    
    
		"bool": {
    
    
			"must": [{
    
    
				"multi_match": {
    
    
					"query": "spring框架",
					"minimum_should_match": "50%",
					"fields": ["name^10", "description"]
				}
			}],
			"filter": [{
    
    
					"term": {
    
    
						"studymodel": "201001"
					}
				},
				{
    
    
					"range": {
    
    
						"price": {
    
    
							"gte": 60,
							"lte": 100
						}
					}
				}
			]
		}
	}
}

rango: Filtrado por rango, mantener registros mayores o iguales a 60 y menores o iguales a 100.

término: Filtrado de coincidencia de elementos, mantenga los registros con el modelo de estudio igual a "201001".

Nota: el rango y el término solo pueden filtrar un campo a la vez.

Cliente Java

//布尔查询使用过虑器
@Test
public void testFilter() throws IOException {
    
    
    SearchRequest searchRequest = new SearchRequest("xc_course");
    searchRequest.types("doc");
    SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
    //source源字段过虑
    searchSourceBuilder.fetchSource(new String[]{
    
    "name","studymodel","price","description"},
    new String[]{
    
    });
    searchRequest.source(searchSourceBuilder);
    //匹配关键字
    MultiMatchQueryBuilder multiMatchQueryBuilder = QueryBuilders.multiMatchQuery("spring框
    架", "name", "description");
    //设置匹配占比
    multiMatchQueryBuilder.minimumShouldMatch("50%");
    //提升另个字段的Boost值
    multiMatchQueryBuilder.field("name",10);
    searchSourceBuilder.query(multiMatchQueryBuilder);
    //布尔查询
    BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
    boolQueryBuilder.must(searchSourceBuilder.query());
    //过虑
    boolQueryBuilder.filter(QueryBuilders.termQuery("studymodel", "201001"));
    boolQueryBuilder.filter(QueryBuilders.rangeQuery("price").gte(60).lte(100));
    SearchResponse searchResponse = client.search(searchRequest);
    SearchHits hits = searchResponse.getHits();
    SearchHit[] searchHits = hits.getHits();
    for (SearchHit hit : searchHits) {
    
    
        String index = hit.getIndex();
        String type = hit.getType();
        String id = hit.getId();
        float score = hit.getScore();
        String sourceAsString = hit.getSourceAsString();
        Map<String, Object> sourceAsMap = hit.getSourceAsMap();
        String name = (String) sourceAsMap.get("name");
        String studymodel = (String) sourceAsMap.get("studymodel");
        String description = (String) sourceAsMap.get("description");
        System.out.println(name);
        System.out.println(studymodel);
        System.out.println(description);
    }
}

para ordenar

Se pueden agregar una o más clasificaciones al campo, y se admite agregar palabras clave, fecha, flotante y otros tipos, y no se permite agregar clasificaciones a campos de tipo de texto.

Enviar POST a http://localhost:9200/xc_course/doc/_search

Filtre los documentos en el rango de precios de 0-100 yuanes y ordene los resultados, primero en orden descendente de modelo de estudio, luego en orden ascendente de precio

{
    
    
	"_source": ["name", "studymodel", "description", "price"],
	"query": {
    
    
		"bool": {
    
    
			"filter": [{
    
    
				"range": {
    
    
					"price": {
    
    
						"gte": 0,
						"lte": 100
					}
				}
			}]
		}
	},
	"sort": [{
    
    
			"studymodel": "desc"
		},
		{
    
    
			"price": "asc"
		}
	]
}

Cliente Java



Destacar

Resaltar puede resaltar una o más palabras en los resultados de búsqueda, para mostrar al usuario la ubicación de las palabras clave coincidentes.

Esto se puede lograr agregando resaltado a la declaración de búsqueda, de la siguiente manera:

{
    
    
	"_source": ["name", "studymodel", "description", "price"],
	"query": {
    
    
		"bool": {
    
    
			"must": [{
    
    
				"multi_match": {
    
    
					"query": "开发框架",
					"minimum_should_match": "50%",
					"fields": ["name^10", "description"],
					"type": "best_fields"
				}
			}],
			"filter": [{
    
    
				"range": {
    
    
					"price": {
    
    
						"gte": 0,
						"lte": 100
					}
				}
			}]
		}
	},
	"sort": [{
    
    
		"price": "asc"
	}],
	"highlight": {
    
    
		"pre_tags": ["<tag>"],
		"post_tags": ["</tag>"],
		"fields": {
    
    
			"name": {
    
    },
			"description": {
    
    }
		}
	}
}

Cliente Java

@Test
public void testHighlight() throws IOException {
    
    
    SearchRequest searchRequest = new SearchRequest("xc_course");
    searchRequest.types("doc");
    SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
    //source源字段过虑
    searchSourceBuilder.fetchSource(new String[]{
    
    "name","studymodel","price","description"},
    new String[]{
    
    });
    searchRequest.source(searchSourceBuilder);
    //匹配关键字
    MultiMatchQueryBuilder multiMatchQueryBuilder = QueryBuilders.multiMatchQuery("开发",
    "name", "description");
    searchSourceBuilder.query(multiMatchQueryBuilder);
    //布尔查询
    BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
    boolQueryBuilder.must(searchSourceBuilder.query());
    //过虑
    boolQueryBuilder.filter(QueryBuilders.rangeQuery("price").gte(0).lte(100));
    //排序
    searchSourceBuilder.sort(new FieldSortBuilder("studymodel").order(SortOrder.DESC));
    searchSourceBuilder.sort(new FieldSortBuilder("price").order(SortOrder.ASC));
    //高亮设置
    HighlightBuilder highlightBuilder = new HighlightBuilder();
    highlightBuilder.preTags("<tag>");//设置前缀
    highlightBuilder.postTags("</tag>");//设置后缀
    // 设置高亮字段
    highlightBuilder.fields().add(new HighlightBuilder.Field("name"));
    // highlightBuilder.fields().add(new HighlightBuilder.Field("description"));
    searchSourceBuilder.highlighter(highlightBuilder);
    SearchResponse searchResponse = client.search(searchRequest);
    SearchHits hits = searchResponse.getHits();
    SearchHit[] searchHits = hits.getHits();
    for (SearchHit hit : searchHits) {
    
    
        Map<String, Object> sourceAsMap = hit.getSourceAsMap();
        //名称
        String name = (String) sourceAsMap.get("name");
        //取出高亮字段内容
        Map<String, HighlightField> highlightFields = hit.getHighlightFields();
        if(highlightFields!=null){
    
    
            HighlightField nameField = highlightFields.get("name");
            if(nameField!=null){
    
    
                Text[] fragments = nameField.getFragments();
                StringBuffer stringBuffer = new StringBuffer();
                for (Text str : fragments) {
    
    
                    stringBuffer.append(str.string());
                } 
                name = stringBuffer.toString();
            }
        } 
        String index = hit.getIndex();
        String type = hit.getType();
        String id = hit.getId();
        float score = hit.getScore();
        String sourceAsString = hit.getSourceAsString();
        String studymodel = (String) sourceAsMap.get("studymodel");
        String description = (String) sourceAsMap.get("description");
        System.out.println(name);
        System.out.println(studymodel);
        System.out.println(description);
    }
}

Supongo que te gusta

Origin blog.csdn.net/weixin_43650254/article/details/100902304
Recomendado
Clasificación