Closed5

ElasticSearch version8のANN searchを試す

nasanasa

https://www.elastic.co/jp/blog/introducing-approximate-nearest-neighbor-search-in-elasticsearch-8-0 これを試していくゼイ!

installしなきゃ始まらん!ということで入れる。(M1でも何も考えずに動かすことが出来た)

wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.1.0-darwin-x86_64.tar.gz
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.1.0-darwin-x86_64.tar.gz.sha512
shasum -a 512 -c elasticsearch-8.1.0-darwin-x86_64.tar.gz.sha512
tar -xzf elasticsearch-8.1.0-darwin-x86_64.tar.gz

# 立ち上げる
./elasticsearch-8.1.0/bin/elasticsearch
nasanasa

セキュリティ機能が邪魔だったので外す

curlでぱっと試したいだけなのでセキュリティ機能がじゃまになった。

elasticsearch-8.1.0/config/elasticsearch.ymlを編集してセキュリティ機能のオフにした。

xpack.security.enabled: false

セキュリティ機能がデフォルトでオンになっているので少しハマった。

elasticsearchの起動時にpasswordを教えてくれるのでそれをcurl時に指定すれば普通に叩くことが出来ます。
あとSSL証明書のpathを指定して上げる必要もあります。

curl --cacert $(pwd)/elasticsearch-8.1.0/config/certs/http_ca.crt -u elastic:<password> https://localhost:9200

v7だとhttpで普通に叩けたと思うのでちょっとハマりました。

nasanasa

マッピング作成

テストデータを入れるのがめんどいので次元数は2にしている。。
dense_vectorというtypeを使っておけば良いみたい。

curl -H 'Content-Type: application/json' -XPUT http://localhost:9200/ann_playground -d '{
  "mappings": {
    "properties": {
      "vector": {
        "type": "dense_vector",
        "dims": 2,
        "index": true,
        "similarity": "l2_norm"
      }
    }
  }
}'

作られていることをcurlで確認

curl -H 'Content-Type: application/json' -XGET http://localhost:9200/ann_playground | jq
nasanasa

適当にデータを入れとく

curl -H 'Content-Type: application/json' -XGET http://localhost:9200/_cat/count/ann_playground
1646790711 01:51:51 0
curl -H 'Content-Type: application/json' -XPOST http://localhost:9200/ann_playground/_doc -d '{"vector": [0, 1]}'
curl -H 'Content-Type: application/json' -XPOST http://localhost:9200/ann_playground/_doc -d '{"vector": [0.2, 0.5]}'
curl -H 'Content-Type: application/json' -XPOST http://localhost:9200/ann_playground/_doc -d '{"vector": [1, 4]}'
nasanasa

検索してみる。

vectorフィールドを指定してベクトルを投げてあげればいい感じに検索出来ます。

curl -H 'Content-Type: application/json' -XGET http://localhost:9200/ann_playground/_knn_search -d '
{
    "knn": {
        "field": "vector",
        "query_vector": [0.2, 0.5],
        "k": 10,
        "num_candidates": 100
    },
    "_source": true
}
'  | jq
{
  "took": 8,
  "timed_out": false,
  "_shards": {
    "total": 1,
    "successful": 1,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": {
      "value": 3,
      "relation": "eq"
    },
    "max_score": 0.5,
    "hits": [
      {
        "_index": "ann_playground",
        "_id": "RHfobX8BbIcdEdA3Qyhx",
        "_score": 0.5,
        "_source": {
          "vector": [
            1,
            4
          ]
        }
      },
      {
        "_index": "ann_playground",
        "_id": "QnfobX8BbIcdEdA3Qiji",
        "_score": 0.055555556,
        "_source": {
          "vector": [
            0,
            1
          ]
        }
      },
      {
        "_index": "ann_playground",
        "_id": "Q3fobX8BbIcdEdA3Qygt",
        "_score": 0.045682963,
        "_source": {
          "vector": [
            0.2,
            0.5
          ]
        }
      }
    ]
  }
}
このスクラップは2023/01/28にクローズされました