Inhaltsverzeichnis
DSL
Volltextabfrage
Fragen Sie alle Inhalte unter dem Indexhotel ab
match_all
Alle Inhalte abfragen
GET /hotel/_search
{
"query": {
"match_all": {
}
}
}
multi_match
Abfragemethode: Fragen Sie den Inhalt der Abfrage in den angegebenen Feldern ab
GET /hotel/_search
{
"query": {
"multi_match": {
"query": "酒店",
"fields": ["brand","name"]
}
}
}
Präzise Abfrage
Begriffsübereinstimmung (exakte Übereinstimmung): Finden Sie den angegebenen Inhalt anhand des Feldnamens genau. Solange der Wert überhaupt inkonsistent ist, wird er nicht abgefragt.
GET /hotel/_search
{
"query": {
"term": {
// 字段名称
"brand": {
// 字段内容
"value": "华美达"
}
}
}
}
Bereichsabfrage (Bereichs-Fuzzy-Abfrage)
GET /hotel/_search
{
"query": {
"range": {
// 字段名称
"price": {
"gte": 100, // gte大于且等于
"lte": 300 // lte小于且等于
}
}
}
}
Andere Abfragemethoden
FunctionScoreQuery
Methode bewertet gewichtete Abfrage
Kann als gewichtete Abfragemethode betrachtet werden
Die folgende Abfrage verwendet die function_score-Abfrage, die aus zwei Komponenten besteht:
- Abfrage: Hier wird eine Standard-Matching-Abfrage verwendet, um Elemente abzufragen, deren Inhalt „The Bund“ unter dem Abfragefeldnamen ist.
- Funktionen: Gewichtete Methode, unten wird ein Filterfilter hinzugefügt, was bedeutet, dass, wenn „Home Inn“ unter der Feldmarke genau übereinstimmt, dieser gleichmäßig geteilt und mit dem Gewichtswertgewicht multipliziert wird
Die gewichteten Felder werden in den Abfrageergebnissen höher eingestuft, sodass diese Methode die Abfrageergebnisse flexibel anpassen kann.
GET /hotel/_search
{
"query": {
"function_score": {
"query": {
"match": {
"name": "外滩"
}
},
"functions": [
{
"filter": {
"term": {
"brand": "如家"
}
},
"weight": 10
}
]
}
}
}
BooleanQuery
Boolesche Abfrage
Boolesche Abfragen enthalten vier Kombinationen:
- muss mit der Abfrage übereinstimmen
- Sollte eine selektive Matching-Abfrage durchführen
- must_not darf nicht übereinstimmen
- Filter muss übereinstimmen, nimmt aber nicht an der Bewertung teil
Fallbeispiel: Der Name des Abfragefelds muss ein Datensatz von Home Inn sein und der Preis darf nicht mehr als 400 Yuan betragen
GET /hotel/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"name": "如家"
}
}
],
"must_not": [
{
"range": {
"price": {
"gt": 400
}
}
}
]
}
}
}
Suchergebnisse
sortieren sortieren
GET /hotel/_search
{
"query": {
"match_all": {
}
},
"sort": [
{
"score": {
"order": "desc"
},
"price": {
"order": "asc"
}
}
]
}
Es zeigt standardmäßig höchstens die Top-Ten-Daten der Suchergebnisse an. Um weitere Daten anzuzeigen, müssen Sie die Paging-Funktion verwenden.
Es gibt zwei Möglichkeiten der Paging-Abfrage:
- from+size: Zufälliges Umblättern ist möglich, die maximale Anzahl der Suchanfragen beträgt 10.000 und es können Probleme bei der Tiefenabfrage auftreten.
- nach + Größe: Zufälliges Umblättern ist nicht zulässig, es gibt keine Obergrenze für den Abruf und Sie können nur Seite für Seite abfragen.
GET /hotel/_search
{
"query": {
"match_all": {
}
},
"from": 10, // 查询起始位,从第几个文档开始
"size": 20, // 期望获取多少个文档
"sort": [
{
"price": {
"order": "desc"
}
}
]
}
Markieren
GET /hotel/_search
{
"query": {
"match": {
"name": "如家"
}
},
"highlight": {
"fields": {
"name": {
"require_field_match": "false"
}
}
}
}
Implementierung von DSL mit RestClient
matchAll
SearchRequest
Führen Sie eine Suchabgleichsanforderung aus und verwenden Sie dabei die Quelle, um die Suchmethode anzugeben
SearchHits
Alle Trefferdokumente abrufen
SearchHit[]
Jedes Dokument in einen einzelnen Treffer umwandeln und im Array speichern
SearchHit
Schließlich foreachen Sie das Array, um einen einzelnen Treffer zu erhalten Objekt, verwenden Sie die String-Konvertierungsmethode, um JSON dem Client anzuzeigen
@Test
void testAll() throws IOException {
SearchRequest request = new SearchRequest("hotel");
request.source().query(QueryBuilders.matchAllQuery());
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
SearchHits hits = response.getHits();
long total = hits.getTotalHits().value;
SearchHit[] searchHits = hits.getHits();
for (SearchHit hit : searchHits) {
String sourceAsString = hit.getSourceAsString();
System.out.println(sourceAsString);
}
}
Volltextsuche
Um ein einzelnes oder mehrere Felder für die Abfrage anzugeben, verwenden SieQueryBuilders.matchQuery
SearchRequest request = new SearchRequest("hotel");
request.source().query(QueryBuilders.matchQuery("all","如家"));
Boolesche Abfrage
Indem Sie ein BoolQueryBuilder
erstellen, es als Abfrageparameter in die Anfrage einfügen und dann die Abfrage ausführen
@Test
void testBooleanMatch() throws IOException {
SearchRequest request = new SearchRequest("hotel");
BoolQueryBuilder builder = QueryBuilders.boolQuery();
builder.must(QueryBuilders.termQuery("city", "杭州"));
builder.filter(QueryBuilders.rangeQuery("price").lte(250));
request.source().query(builder);
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
for (SearchHit hit : response.getHits().getHits()) System.out.println(hit.getSourceAsString());
}
Paging-Abfrage
@Test
void testPage() throws IOException {
SearchRequest request = new SearchRequest("hotel");
request.source().query(QueryBuilders.matchAllQuery());
request.source().from(0).size(10); // 指定从第几个文档开始查询,以及查询文档的数量
request.source().sort("price", SortOrder.ASC); // 根据price字段的升序排列
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
for (SearchHit hit : response.getHits().getHits()) System.out.println(hit.getSourceAsString());
}
Markieren
@Test
void testHighLight() throws IOException {
SearchRequest request = new SearchRequest("hotel");
request.source().query(QueryBuilders.matchQuery("all", "如家"));
request.source().highlighter(new HighlightBuilder().field("name").requireFieldMatch(false));
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
for (SearchHit hit : response.getHits().getHits()) System.out.println(hit.getSourceAsString());
}