k-Nearest Neighbor (k-NN) -Suche in Amazon Service OpenSearch - OpenSearch Amazon-Dienst

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

k-Nearest Neighbor (k-NN) -Suche in Amazon Service OpenSearch

k-NN für Amazon OpenSearch Service ist die Abkürzung für den zugehörigen k-Nearest Neighbors-Algorithmus und ermöglicht es Ihnen, nach Punkten in einem Vektorraum zu suchen und die „nächsten Nachbarn“ für diese Punkte anhand der euklidischen Entfernung oder der Kosinusähnlichkeit zu finden. Anwendungsfälle umfassen Empfehlungen (z. B. eine Funktion „andere Songs, die Ihnen vielleicht gefallen“ in einer Musikanwendung), Bilderkennung und Betrugserkennung.

Anmerkung

Diese Dokumentation beschreibt die Versionskompatibilität zwischen OpenSearch Service und verschiedenen Versionen des k-NN-Plug-ins sowie Einschränkungen bei der Verwendung des Plug-ins mit Managed Service. OpenSearch Eine umfassende Dokumentation des k-NN-Plug-ins, einschließlich einfacher und komplexer Beispiele, Parameterreferenzen und der vollständigen API-Referenz für das Plugin, finden Sie in der OpenSearch Open-Source-Dokumentation. Die Open-Source-Dokumentation behandelt auch die Leistungsoptimierung und k-NN-spezifische Clustereinstellungen.

Verwenden Sie die folgenden Tabellen, um die Version des k-NN-Plug-ins zu finden, das auf Ihrer Amazon OpenSearch Service-Domain läuft. Jede k-NN-Plug-in-Version entspricht einer OpenSearchoder Elasticsearch-Version.

OpenSearch
OpenSearch Version k-NN-Plug-In-Version Nennenswerte Funktionen
2.13 2.13.0.0

2.11 2.11.0.0

Unterstützung für ignore_unmapped In-k-NN-Abfragen hinzugefügt

2.9 2.9.0.0 Implementierung von k-NN-Byte-Vektoren und effizientem Filtern mit der Faiss-Engine
2.7 2.7.0.0
2.5 2.5.0.0 Erweitert SystemIndexPlugin für den k-NN-Modellsystemindex, Lucene-spezifische Dateierweiterungen zum Kern von HybridFS hinzugefügt
2.3 2.3.0.0
1.3 1.3.0.0
1.2 1.2.0.0 Unterstützung für Faiss-Bibliothek hinzugefügt
1.1 1.1.0.0
1,0

1.0.0.0

Umbenannte REST-APIs bei gleichzeitiger Unterstützung der Abwärtskompatibilität, umbenannter Namespace von opendistro in opensearch
Elasticsearch
Elasticsearch-Version k-NN-Plug-In-Version Nennenswerte Funktionen
7.1

1.3.0.0

Euklidische Entfernung
7.4

1.4.0.0

7.7

1.8.0.0

Kosinusähnlichkeit
7.8

1.9.0.0

7.9

1.11.0.0

Aufwärm-API, benutzerdefinierte Bewertung

7.10

1.13.0.0

Hamming-Distanz, L1-Norm-Distanz und Painless-Scripting

Erste Schritte mit k-NN

Um k-NN zu verwenden, müssen Sie einen Index mit der index.knn-Einstellung erstellen und mindestens ein Feld des knn_vector-Datentyps hinzufügen.

PUT my-index { "settings": { "index.knn": true }, "mappings": { "properties": { "my_vector1": { "type": "knn_vector", "dimension": 2 }, "my_vector2": { "type": "knn_vector", "dimension": 4 } } } }

Der knn_vector-Datentyp unterstützt eine einzelne Liste von bis zu 10.000 Gleitkommazahlen, wobei die Anzahl der Gleitkommazahlen durch den erforderlichen dimension-Parameter definiert wird. Nachdem Sie den Index erstellt haben, fügen Sie ihm einige Daten hinzu.

POST _bulk { "index": { "_index": "my-index", "_id": "1" } } { "my_vector1": [1.5, 2.5], "price": 12.2 } { "index": { "_index": "my-index", "_id": "2" } } { "my_vector1": [2.5, 3.5], "price": 7.1 } { "index": { "_index": "my-index", "_id": "3" } } { "my_vector1": [3.5, 4.5], "price": 12.9 } { "index": { "_index": "my-index", "_id": "4" } } { "my_vector1": [5.5, 6.5], "price": 1.2 } { "index": { "_index": "my-index", "_id": "5" } } { "my_vector1": [4.5, 5.5], "price": 3.7 } { "index": { "_index": "my-index", "_id": "6" } } { "my_vector2": [1.5, 5.5, 4.5, 6.4], "price": 10.3 } { "index": { "_index": "my-index", "_id": "7" } } { "my_vector2": [2.5, 3.5, 5.6, 6.7], "price": 5.5 } { "index": { "_index": "my-index", "_id": "8" } } { "my_vector2": [4.5, 5.5, 6.7, 3.7], "price": 4.4 } { "index": { "_index": "my-index", "_id": "9" } } { "my_vector2": [1.5, 5.5, 4.5, 6.4], "price": 8.9 }

Dann können Sie die Daten mit dem knn-Abfragetyp durchsuchen.

GET my-index/_search { "size": 2, "query": { "knn": { "my_vector2": { "vector": [2, 3, 5, 6], "k": 2 } } } }

In diesem Fall ist k die Anzahl der Nachbarn, die die Abfrage zurückgeben soll, aber Sie müssen auch die size-Option einschließen. Andernfalls erhalten Sie k-Ergebnisse für jeden Shard (und jedes Segment) anstatt k-Ergebnisse für die gesamte Abfrage. k-NN unterstützt einen maximalen k-Wert von 10 000.

Wenn Sie die knn-Abfrage mit anderen Klauseln mischen, erhalten Sie möglicherweise weniger als k-Ergebnisse. In diesem Beispiel reduziert die post_filter-Klausel die Anzahl der Ergebnisse von 2 auf 1.

GET my-index/_search { "size": 2, "query": { "knn": { "my_vector2": { "vector": [2, 3, 5, 6], "k": 2 } } }, "post_filter": { "range": { "price": { "gte": 6, "lte": 10 } } } }

Wenn Sie eine große Anzahl von Abfragen bearbeiten und gleichzeitig eine optimale Leistung beibehalten müssen, können Sie die _msearchAPI verwenden, um eine Massensuche mit JSON zu erstellen und eine einzige Anfrage zu senden, um mehrere Suchen durchzuführen:

GET _msearch { "index": "my-index"} { "query": { "knn": {"my_vector2":{"vector": [2, 3, 5, 6],"k":2 }} } } { "index": "my-index", "search_type": "dfs_query_then_fetch"} { "query": { "knn": {"my_vector1":{"vector": [2, 3],"k":2 }} } }

Das folgende Video zeigt, wie Sie Bulk-Vektorsuchen für K-NN-Abfragen einrichten.

k-NN-Unterschiede, -Optimierung und -Einschränkungen

OpenSearch ermöglicht es Ihnen, alle k-NN-Einstellungen mithilfe der _cluster/settings API zu ändern. Bei OpenSearch Service können Sie alle Einstellungen außer knn.memory.circuit_breaker.enabled und ändernknn.circuit_breaker.triggered. k-NN-Statistiken sind als CloudWatch Amazon-Metriken enthalten.

Vergleichen Sie insbesondere die KNNGraphMemoryUsage Metrik auf jedem Datenknoten mit der knn.memory.circuit_breaker.limit Statistik und dem verfügbaren RAM für den Instance-Typ. OpenSearch Der Dienst verwendet die Hälfte des RAM einer Instanz für den Java-Heap (bis zu einer Heap-Größe von 32 GiB). Standardmäßig verwendet KNN bis zu 50 % der verbleibenden Hälfte, sodass ein Instance-Typ mit 32 GiB RAM 8 GiB an Graphen (32 * 0,5 * 0,5) aufnehmen kann. Die Leistung kann beeinträchtigt werden, wenn die Nutzung des Graphen-Speichers diesen Wert überschreitet.

Sie können einen k-NN-Index nicht in einen Cold Storage migrieren, UltraWarmwenn der Index ungefähre k-NN () verwendet. "index.knn": true Wenn index.knn auf false gesetzt wird (exakt k-NN), können Sie den Index weiterhin auf andere Speicherstichen verschieben.