Elasticsearch-Abfragen an Milvus
Elasticsearch, das auf Apache Lucene basiert, ist eine führende Open-Source-Suchmaschine. In modernen KI-Anwendungen ist sie jedoch mit Herausforderungen konfrontiert, darunter hohe Aktualisierungskosten, schlechte Echtzeit-Performance, ineffizientes Shard-Management, ein nicht cloud-natives Design und übermäßiger Ressourcenbedarf. Als Cloud-native Vektordatenbank überwindet Milvus diese Probleme mit entkoppelter Speicherung und Berechnung, effizienter Indexierung für hochdimensionale Daten und nahtloser Integration in moderne Infrastrukturen. Sie bietet eine überragende Leistung und Skalierbarkeit für KI-Workloads.
Dieser Artikel zielt darauf ab, die Migration Ihrer Codebasis von Elasticsearch zu Milvus zu erleichtern und bietet verschiedene Beispiele für die Konvertierung von Abfragen.
Überblick
In Elasticsearch erzeugen Operationen im Abfragekontext Relevanzwerte, während Operationen im Filterkontext dies nicht tun. In ähnlicher Weise erzeugen Milvus-Suchen Ähnlichkeitsbewertungen, während die filterähnlichen Abfragen dies nicht tun. Bei der Migration Ihrer Codebasis von Elasticsearch zu Milvus ist das Schlüsselprinzip die Konvertierung von Feldern, die im Abfragekontext von Elasticsearch verwendet werden, in Vektorfelder, um die Generierung von Ähnlichkeitsbewertungen zu ermöglichen.
In der folgenden Tabelle sind einige Elasticsearch-Abfragemuster und ihre entsprechenden Entsprechungen in Milvus aufgeführt.
Elasticsearch-Abfragen |
Milvus-Entsprechungen |
Bemerkungen |
|---|---|---|
Volltext-Abfragen |
||
Volltext-Suche |
Beide bieten ähnliche Möglichkeiten. |
|
Abfragen auf Termebene |
||
|
Beide bieten die gleichen oder ähnliche Möglichkeiten, wenn diese Elasticsearch-Abfragen im Filterkontext verwendet werden. |
|
|
||
Vergleichsoperatoren wie |
||
Vergleichsoperatoren wie |
||
|
||
|
||
Logische Operatoren wie |
Beide bieten ähnliche Möglichkeiten, wenn sie im Filterkontext verwendet werden. |
|
Vektorielle Abfragen |
||
Suche |
Milvus bietet erweiterte Vektorsuchfunktionen. |
|
Hybride Suche |
Milvus unterstützt mehrere Rangfusionsstrategien. |
|
Volltext-Abfragen
In Elasticsearch ermöglichen die Volltextabfragen die Suche in analysierten Textfeldern, z. B. im Textkörper einer E-Mail. Die Abfragezeichenfolge wird mit demselben Analysator verarbeitet, der bei der Indizierung auf das Feld angewendet wurde.
Abgleichsabfrage
In Elasticsearch gibt eine Match-Abfrage Dokumente zurück, die mit einem angegebenen Text, einer Zahl, einem Datum oder einem booleschen Wert übereinstimmen. Der angegebene Text wird vor dem Abgleich analysiert.
Es folgt ein Beispiel für eine Elasticsearch-Suchanfrage mit einer Match-Abfrage.
resp = client.search(
query={
"match": {
"message": {
"query": "this is a test"
}
}
},
)
Milvus bietet die gleiche Möglichkeit durch die Volltextsuche. Sie können die obige Elasticsearch-Abfrage wie folgt in Milvus konvertieren:
res = client.search(
collection_name="my_collection",
data=['How is the weather in Jamaica?'],
anns_field="message_sparse",
output_fields=["id", "message"]
)
Im obigen Beispiel ist message_sparse ein spärliches Vektorfeld, das von einem VarChar-Feld namens message abgeleitet ist. Milvus verwendet das BM25-Einbettungsmodell, um die Werte im Feld message in Sparse-Vektor-Einbettungen umzuwandeln und speichert sie im Feld message_sparse. Beim Empfang der Suchanfrage bettet Milvus die Nutzdaten der Klartextabfrage mit demselben BM25-Modell ein, führt eine Sparse-Vector-Suche durch und gibt die im Parameter output_fields angegebenen Felder id und message zusammen mit den entsprechenden Ähnlichkeitsbewertungen zurück.
Um diese Funktionalität zu nutzen, müssen Sie den Analyzer für das Feld message aktivieren und eine Funktion definieren, um das Feld message_sparse daraus abzuleiten. Detaillierte Anweisungen zur Aktivierung des Analyzers und zur Erstellung der Ableitungsfunktion in Milvus finden Sie unter Volltextsuche.
Abfragen auf Begriffsebene
In Elasticsearch werden Abfragen auf Termebene verwendet, um Dokumente zu finden, die auf exakten Werten in strukturierten Daten basieren, wie z.B. Datumsbereiche, IP-Adressen, Preise oder Produkt-IDs. Dieser Abschnitt skizziert die möglichen Äquivalente einiger Elasticsearch-Abfragen auf Termebene in Milvus. Alle Beispiele in diesem Abschnitt sind so angepasst, dass sie im Filterkontext funktionieren, um den Fähigkeiten von Milvus gerecht zu werden.
IDs
In Elasticsearch können Sie Dokumente anhand ihrer IDs im Filterkontext wie folgt finden:
resp = client.search(
query={
"bool": {
"filter": {
"ids": {
"values": [
"1",
"4",
"100"
]
}
}
}
},
)
In Milvus können Sie auch Entitäten auf der Basis ihrer IDs wie folgt finden:
# Use the filter parameter
res = client.query(
collection_name="my_collection",
filter="id in [1, 4, 100]",
output_fields=["id", "title"]
)
# Use the ids parameter
res = client.query(
collection_name="my_collection",
ids=[1, 4, 100],
output_fields=["id", "title"]
)
Das Elasticsearch-Beispiel finden Sie auf dieser Seite. Details zu Query- und Get-Anfragen sowie zu den Filterausdrücken in Milvus finden Sie unter Query und Filtering.
Präfix-Abfrage
In Elasticsearch können Sie Dokumente, die ein bestimmtes Präfix in einem angegebenen Feld enthalten, wie folgt im Filterkontext finden:
resp = client.search(
query={
"bool": {
"filter": {
"prefix": {
"user": {
"value": "ki"
}
}
}
}
},
)
In Milvus können Sie die Entitäten, deren Werte mit dem angegebenen Präfix beginnen, wie folgt finden:
res = client.query(
collection_name="my_collection",
filter='user like "ki%"',
output_fields=["id", "user"]
)
Das Elasticsearch-Beispiel finden Sie auf dieser Seite. Details zum like Operator in Milvus finden Sie unter Verwendung von LIKE für Pattern Matching.
Bereichsabfrage
In Elasticsearch können Sie wie folgt Dokumente finden, die Begriffe innerhalb eines angegebenen Bereichs enthalten:
resp = client.search(
query={
"bool": {
"filter": {
"range": {
"age": {
"gte": 10,
"lte": 20
}
}
}
}
},
)
In Milvus können Sie wie folgt die Entitäten finden, deren Werte in einem bestimmten Feld innerhalb eines angegebenen Bereichs liegen:
res = client.query(
collection_name="my_collection",
filter='10 <= age <= 20',
output_fields=["id", "user", "age"]
)
Das Elasticsearch-Beispiel finden Sie auf dieser Seite. Für Details zu Vergleichsoperatoren in Milvus siehe Vergleichsoperatoren.
Begriffsabfrage
In Elasticsearch können Sie wie folgt Dokumente finden, die einen exakten Begriff in einem angegebenen Feld enthalten:
resp = client.search(
query={
"bool": {
"filter": {
"term": {
"status": {
"value": "retired"
}
}
}
}
},
)
In Milvus können Sie wie folgt die Entitäten finden, deren Werte in dem angegebenen Feld genau dem angegebenen Begriff entsprechen:
# use ==
res = client.query(
collection_name="my_collection",
filter='status=="retired"',
output_fields=["id", "user", "status"]
)
# use TEXT_MATCH
res = client.query(
collection_name="my_collection",
filter='TEXT_MATCH(status, "retired")',
output_fields=["id", "user", "status"]
)
Das Elasticsearch-Beispiel finden Sie auf dieser Seite. Für Details zu Vergleichsoperatoren in Milvus siehe Vergleichsoperatoren.
Begriffe abfragen
In Elasticsearch können Sie wie folgt Dokumente finden, die einen oder mehrere exakte Begriffe in einem angegebenen Feld enthalten:
resp = client.search(
query={
"bool": {
"filter": {
"terms": {
"degree": [
"graduate",
"post-graduate"
]
}
}
}
}
)
Milvus verfügt nicht über eine vollständige Äquivalenz dieses Begriffs. Sie können jedoch die Entitäten, deren Werte im angegebenen Feld einen der angegebenen Begriffe enthalten, wie folgt finden:
# use in
res = client.query(
collection_name="my_collection",
filter='degree in ["graduate", "post-graduate"]',
output_fields=["id", "user", "degree"]
)
# use TEXT_MATCH
res = client.query(
collection_name="my_collection",
filter='TEXT_MATCH(degree, "graduate post-graduate")',
output_fields=["id", "user", "degree"]
)
Das Elasticsearch-Beispiel finden Sie auf dieser Seite. Für Details zu Bereichsoperatoren in Milvus siehe Bereichsoperatoren.
Wildcard-Abfrage
In Elasticsearch können Sie Dokumente finden, die Begriffe enthalten, die einem Wildcard-Muster entsprechen, wie folgt:
resp = client.search(
query={
"bool": {
"filter": {
"wildcard": {
"user": {
"value": "ki*y"
}
}
}
}
},
)
Milvus unterstützt keine Platzhalter in seinen Filterbedingungen. Sie können jedoch den like -Operator verwenden, um einen ähnlichen Effekt zu erzielen (siehe unten):
res = client.query(
collection_name="my_collection",
filter='user like "ki%" AND user like "%y"',
output_fields=["id", "user"]
)
Das Elasticsearch-Beispiel finden Sie auf dieser Seite. Details zu den Bereichsoperatoren in Milvus finden Sie unter Bereichsoperatoren.
Boolesche Abfrage
In Elasticsearch ist eine boolesche Abfrage eine Abfrage, die Dokumente findet, die booleschen Kombinationen anderer Abfragen entsprechen.
Das folgende Beispiel ist einem Beispiel aus der Elasticsearch-Dokumentation auf dieser Seite entnommen. Die Abfrage gibt Benutzer mit kimchy in ihrem Namen mit einem production Tag zurück.
resp = client.search(
query={
"bool": {
"filter": {
"term": {
"user": "kimchy"
}
},
"filter": {
"term": {
"tags": "production"
}
}
}
},
)
In Milvus können Sie das Gleiche wie folgt tun:
filter =
res = client.query(
collection_name="my_collection",
filter='user like "%kimchy%" AND ARRAY_CONTAINS(tags, "production")',
output_fields=["id", "user", "age", "tags"]
)
Das obige Beispiel geht davon aus, dass Sie ein user Feld vom Typ VarChar und ein tags Feld vom Typ Array in der Zielsammlung haben. Die Abfrage gibt Benutzer mit kimchy in ihrem Namen mit einem production Tag zurück.
Vektor-Abfragen
In Elasticsearch sind Vektorabfragen spezialisierte Abfragen, die auf Vektorfeldern arbeiten, um eine effiziente semantische Suche durchzuführen.
Knn-Abfrage
Elasticsearch unterstützt sowohl approximative kNN-Abfragen als auch exakte, brutale kNN-Abfragen. Sie können die k nächstgelegenen Vektoren zu einem Abfragevektor auf die eine oder andere Weise finden, gemessen durch eine Ähnlichkeitsmetrik, wie folgt:
resp = client.search(
index="my-image-index",
size=3,
query={
"knn": {
"field": "image-vector",
"query_vector": [
-5,
9,
-12
],
"k": 10
}
},
)
Als spezialisierte Vektordatenbank verwendet Milvus Index-Typen, um die Vektorsuche zu optimieren. Typischerweise wird bei hochdimensionalen Vektordaten die ANN-Suche (approximate nearest neighbor) bevorzugt. Während die Brute-Force-KNN-Suche mit dem FLAT-Indextyp präzise Ergebnisse liefert, ist sie sowohl zeit- als auch ressourcenaufwändig. Im Gegensatz dazu bietet die ANN-Suche mit AUTOINDEX oder anderen Indextypen ein ausgewogenes Verhältnis zwischen Geschwindigkeit und Genauigkeit und damit eine deutlich schnellere und ressourcenschonendere Leistung als kNN.
Eine ähnliche Äquivalenz zur obigen Vektorabfrage in Mlivus sieht folgendermaßen aus:
res = client.search(
collection_name="my_collection",
anns_field="image-vector"
data=[[-5, 9, -12]],
limit=10
)
Das Elasticsearch-Beispiel finden Sie auf dieser Seite. Für Details zur ANN-Suche in Milvus lesen Sie bitte Basic ANN Search.
Reciprocal Rank Fusion
Elasticsearch bietet Reciprocal Rank Fusion (RRF), um mehrere Ergebnismengen mit unterschiedlichen Relevanzindikatoren zu einer einzigen gerankten Ergebnismenge zu kombinieren.
Das folgende Beispiel demonstriert die Kombination einer traditionellen begriffsbasierten Suche mit einer k-nearest neighbors (kNN) Vektorsuche zur Verbesserung der Suchrelevanz:
client.search(
index="my_index",
size=10,
query={
"retriever": {
"rrf": {
"retrievers": [
{
"standard": {
"query": {
"term": {
"text": "shoes"
}
}
}
},
{
"knn": {
"field": "vector",
"query_vector": [1.25, 2, 3.5], # Example vector; replace with your actual query vector
"k": 50,
"num_candidates": 100
}
}
],
"rank_window_size": 50,
"rank_constant": 20
}
}
}
)
In diesem Beispiel kombiniert die RRF die Ergebnisse von zwei Retrievern:
Eine standardmäßige begriffsbasierte Suche nach Dokumenten, die den Begriff
"shoes"im Feldtextenthalten.Eine kNN-Suche nach dem Feld
vectorunter Verwendung des bereitgestellten Abfragevektors.
Jeder Retriever trägt bis zu 50 Top-Treffer bei, die von RRF neu eingestuft werden, und die 10 besten Ergebnisse werden zurückgegeben.
In Milvus können Sie eine ähnliche hybride Suche durchführen, indem Sie Suchen über mehrere Vektorfelder kombinieren, eine Reranking-Strategie anwenden und die Top-K-Ergebnisse aus der kombinierten Liste abrufen. Milvus unterstützt sowohl RRF- als auch gewichtete Reranker-Strategien. Weitere Einzelheiten finden Sie unter Reranking.
Das folgende Beispiel ist eine nicht-strikte Äquivalenz des obigen Elasticsearch-Beispiels in Milvus.
search_params_dense = {
"data": [[1.25, 2, 3.5]],
"anns_field": "vector",
"param": {
"metric_type": "IP",
"params": {"nprobe": 10},
},
"limit": 100
}
req_dense = ANNSearchRequest(**search_params_dense)
search_params_sparse = {
"data": ["shoes"],
"anns_field": "text_sparse",
"param": {
"metric_type": "BM25",
}
}
req_sparse = ANNSearchRequest(**search_params_sparse)
res = client.hybrid_search(
collection_name="my_collection",
reqs=[req_dense, req_sparse],
reranker=RRFRanker(),
limit=10
)
Dieses Beispiel demonstriert eine hybride Suche in Milvus, die kombiniert:
Dichte Vektorsuche: Verwendung der Metrik des inneren Produkts (IP) mit
nprobeauf 10 für die ungefähre Suche nach dem nächsten Nachbarn (ANN) auf demvectorFeld.Suche mit spärlichen Vektoren: Unter Verwendung der Ähnlichkeitsmetrik BM25 auf dem Feld
text_sparse.
Die Ergebnisse dieser Suchvorgänge werden getrennt ausgeführt, kombiniert und mit Hilfe des Reciprocal Rank Fusion (RRF)-Rankers neu eingestuft. Die hybride Suche liefert die 10 besten Entitäten aus der neu bewerteten Liste.
Im Gegensatz zum RRF-Ranking von Elasticsearch, das die Ergebnisse von standardmäßigen textbasierten Abfragen und kNN-Suchen zusammenführt, kombiniert Milvus die Ergebnisse von Sparse- und Dense-Vector-Suchen und bietet damit eine einzigartige hybride Suchfunktion, die für multimodale Daten optimiert ist.
Rekapitulation
In diesem Artikel haben wir die Konvertierung typischer Elasticsearch-Abfragen in ihre Milvus-Äquivalente behandelt, einschließlich Abfragen auf Termebene, boolesche Abfragen, Volltextabfragen und Vektorabfragen. Wenn Sie weitere Fragen zur Konvertierung anderer Elasticsearch-Abfragen haben, können Sie sich gerne an uns wenden.