[SpringCloud] Erste Schritte mit Microservice Technology Stack 7 – DSL-Nutzung

DSL


Volltextabfrage

Fragen Sie alle Inhalte unter dem Indexhotel ab

match_allAlle Inhalte abfragen

GET /hotel/_search
{
    
    
  "query": {
    
    
    "match_all": {
    
    }
  }
}

multi_matchAbfragemethode: 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:

  1. Abfrage: Hier wird eine Standard-Matching-Abfrage verwendet, um Elemente abzufragen, deren Inhalt „The Bund“ unter dem Abfragefeldnamen ist.
  2. 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
        }
      ]
    }
  }
}

BooleanQueryBoolesche 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:

  1. 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.
  2. 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

SearchRequestFühren Sie eine Suchabgleichsanforderung aus und verwenden Sie dabei die Quelle, um die Suchmethode anzugeben

SearchHitsAlle 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());
}

Guess you like

Origin blog.csdn.net/delete_you/article/details/133611854