Density_vector становится полем типа «float»

Я пытаюсь реализовать поисковую систему с помощью elasticsearch. Для этого я создал индекс с отображением, содержащим поля Densent_vector. PUT {{эластичный uri}}/{{индекс}}

{
    "mappings": {
        "properties": {
            ...
            "title_embeddings": {
                "type": "dense_vector",
                "index": true,
                "similarity": "cosine",
                "dims": 1024,
                "index_options": {
                    "type": "hnsw",
                    "ef_construction": 100,
                    "m": 16
                }
            },
            "title": {
                "type": "text"
            },
            ...
        }
    }
}

Проблема в том, что когда я получаю его с помощью API, поле имеет тип «float», а не «density_vector».

ПОЛУЧИТЬ {{elastic-uri}}/{{index}}/_search

{
    "{{index}}": {
        "mappings": {
            "properties": {
                ...
                "title": {
                    "type": "text",
                    "fields": {
                        "keyword": {
                            "type": "keyword",
                            "ignore_above": 256
                        }
                    }
                },
                "title_embeddings": {
                    "type": "float"
                }
                ...
            }
        }
    }
}

Также я не могу использовать поиск KNN, поскольку это неправильный тип:

ПОЛУЧИТЬ {{elastic-uri}}/{{index}}/_search

{
  "knn": {
    "field": "title_embeddings",
    "query_vector": [0.1, 3.2, 2.1],
    "k": 2,
    "num_candidates": 100
  }
}

Ошибка: не удалось создать запрос: запросы [knn] поддерживаются только для полей [dense_vector].

Вам необходимо объяснить, как вы индексируете свои данные. Скорее всего, вы не индексируете правильный индекс (поэтому сопоставление создается автоматически) или шаблон индекса вашего шаблона индекса не соответствует индексу, который вы создаете.

Val 05.04.2024 06:18

Вы были правы, данные были неправильно вставлены. Я использую библиотеку Python для их вставки и вместо использования obj.__dict__ создаю документ, и он работает.

tycyly 08.04.2024 00:39

Круто, рад, что ты это понял!

Val 08.04.2024 05:46
0
3
153
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я индексировал свои данные с помощью следующего кода:

es.index(
            index='{{index}}',
            document=json.dumps(page.__dict__),
            error_trace=True
        )

И с этим новым кодом это работает:

 es.index(
            index='{{index}}',
            document = {
                "id": page.id,
                "title": page.title,
                "title_embeddings": page.title_embeddings,
                ...
            },
            error_trace=True
        )

Другие вопросы по теме