Я пытаюсь запросить индекс Elasticsearch на наличие почти дубликатов, используя его MinHa sh реализацию . Я использую клиент Python, работающий в контейнерах, для индексации и выполнения поиска.
Мой корпус представляет собой файл JSONL примерно так:
{"id":1, "text":"I'd just like to interject for a moment"}
{"id":2, "text":"I come up here for perception and clarity"}
...
Я успешно создаю индекс Elasticsearch, пытаюсь использовать пользовательские настройки и анализатор, вдохновляясь официальными примерами и MinHa sh docs :
def create_index(client):
client.indices.create(
index="documents",
body={
"settings": {
"analysis": {
"filter": {
"my_shingle_filter": {
"type": "shingle",
"min_shingle_size": 5,
"max_shingle_size": 5,
"output_unigrams": False
},
"my_minhash_filter": {
"type": "min_hash",
"hash_count": 10,
"bucket_count": 512,
"hash_set_size": 1,
"with_rotation": True
}
},
"analyzer": {
"my_analyzer": {
"tokenizer": "standard",
"filter": [
"my_shingle_filter",
"my_minhash_filter"
]
}
}
}
},
"mappings": {
"properties": {
"name": {"type": "text", "analyzer": "my_analyzer"}
}
},
},
ignore=400,
)
Я проверяю, что создание индекса не большие проблемы через Kibana, а также при посещении http://localhost: 9200 / documents / _settings Я получаю то, что кажется в порядке:
![enter image description here](https://i.stack.imgur.com/u7ses.png)
However, querying the index with:
def get_duplicate_documents(body, K, es):
doc = {
'_source': ['_id', 'body'],
'size': K,
'query': {
"match": {
"body": {
"query": body,
"analyzer" : "my_analyzer"
}
}
}
}
res = es.search(index='documents', body=doc)
top_matches = [hit['_source']['_id'] for hit in res['hits']['hits']]
мой res['hits']
постоянно пуст, даже если я установил свой body
для соответствия точно тексту одной из записей в моем корпусе. Другими словами, я не получу никаких результатов, если попробую использовать значения для body
, например,
"I come up here for perception and clarity"
или подстроки, такие как
"I come up here for perception"
, в то время как в идеале мне нужна процедура для возврата почти дубликатов, при этом оценка является приближением схожести запроса по Жаккару и почти дубликатов, полученных через MinHa sh.
Что-то не так в моем запросе и / или в том, как я index Elasticsearch? Не хватает ли мне чего-то еще?
PS: вы можете посмотреть https://github.com/davidefiocco/dockerized-elasticsearch-duplicate-finder/tree/ea0974363b945bf5f85d52a781463fba76f4f987 нефункциональный, но, надеюсь, воспроизводимый пример (я также буду обновлять репо, когда найду решение!)