在Elasticsearch中,可以对共享最相似文本的文档进行分组,而无需提供初始查询以进行比较?
我知道可以查询和获取MLT(“更像此文档”),但是可以根据字段值将文档聚集在索引中吗?
例如:
document 1: The quick brown fox jumps over the lazy dog
document 2: Barcelona is a great city
document 3: The fast orange fox jumps over the lazy dog
document 4: Lotus loft Room - Bear Mountains Neighbourhood
document 5: I do not like to eat fish
document 6: "Lotus Loft" Condo From $160.00 CAD/night, sleeps up to 4
document 7: Lotus Loft
现在,执行某种聚合,无需提供搜索查询即可将其分组:
Group 1: document 1 and document 3
Group 2: document 2
Group 3: document 4 and document 6 and document 7
Group 4: document 5
OR
请让我知道其他方法来查找不同的文档聚类,例如使用Apache Spark,KNN,无监督学习方法或任何其他算法来查找几乎重复的文档或聚类相似的文档?
我只想根据我的Elasticsearch文档的国家/地区,城市,地区,属性名称或描述等字段对文档进行聚类。
基本上我想知道-
如何使用python文本分析/使用KNN /带有MLIB的pyspark或其他任何文档聚类算法的python文本分析/无监督学习,对相似文档(例如json / csv)进行聚类或查找重复的文档?给我一些提示/开源项目或任何其他资源链接。我只需要一些具体的示例或教程即可完成此任务
答案 0 :(得分:1)
是的,有可能。有一个名为Carrot2的ElasticSearch插件。集群插件自动将相似的“文档”分组在一起,并为这些组分配易于阅读的标签,并且该集群插件具有4种内置的集群算法(3种免费算法,需要1种许可证)。如果要将所有文档都聚集在ES索引中,可以进行match_all查询。
这是我的ES 6.6.2客户端代码示例,用于在Python 3中进行集群:
import json
import requests
REQUEST_URL = 'http://localhost:9200/b2c_index/_search_with_clusters'
HEADER = {'Content-Type':'application/json; charset=utf-8'}
requestDict = {
"search_request": {
"_source": [ "title", "content", "lang" ],
"query": {"match_all":{}},
"size": 100
},
"query_hint": "",
"field_mapping": {
"title": ["_source.title"],
"content": ["_source.content"],
"language": ["_source.lang"],
}
}
resp = requests.post(REQUEST_URL, data=json.dumps(requestDict), headers=HEADER)
print(resp.json())
顺便说一句,Solr还使用Carrot2对文档进行聚类。