Я пытаюсь реализовать поисковую систему с помощью 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].
Вы были правы, данные были неправильно вставлены. Я использую библиотеку Python для их вставки и вместо использования obj.__dict__ создаю документ, и он работает.
Круто, рад, что ты это понял!
Я индексировал свои данные с помощью следующего кода:
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
)
Вам необходимо объяснить, как вы индексируете свои данные. Скорее всего, вы не индексируете правильный индекс (поэтому сопоставление создается автоматически) или шаблон индекса вашего шаблона индекса не соответствует индексу, который вы создаете.