我有一个服务,它推荐与用户当前上下文相关的文档(文件)。它结合使用ElasticSearch more_like_this和过滤器(请参阅查询下面)。这些文档由用户上传,如果是公开的,则可以推荐给其他用户。它可以正常工作,但是当两个或多个用户上传相同的文件时,问题就会发生。elasticsearch中有两个或多个相同文档的实例,很可能会推荐这两个(甚至更多)文件。
有没有人知道我如何强制ElasticSearch忽略这些副本,只返回同一个文件的一个实例?
POST _search
{
"query": {
"filtered": {
"query": {
"mlt": {
"fields": [
"file"
],
"like_text": "Some sample text here",
"min_term_freq": 1,
"max_query_terms": 1,
"min_doc_freq": 1
}
},
"filter" : {
"or" : {
"filters" : [ {
"term" : {
"visibility" : "public"
}
}, {
"and" : {
"filters" : [ {
"term" : {
"visibility" : "private"
}
}, {
"term" : {
"ownerId" : 2
}
} ]
}
} ]
}
}
}
},
"fields": [
"id","title","visibility", "ownerId","contentType", "dateCreated", "url"]
}编辑:
我解决了这个问题的第一部分。我使用Tika从网页或文本文档中提取内容。然后,我在这个查询中使用它作为Like文本来查找大多数类似的文档,那些值高于0.9的文档被标记为重复文档。为此,我使用了一个具有UUID值的新字段“唯一性”。如果要索引的新文档是重复的,我将复制它的“唯一性”值,如果没有副本,我将为该文档创建新的值“唯一性”。
但是,我仍然没有解决的问题的第二部分是如何进行一个将消除这些重复的查询。因此,基本上在上面提到的查询中,我必须集成只选择一个文档实例的部分,其值与字段“唯一性”的值相同。
有谁知道怎么解决这个问题吗?
发布于 2014-01-13 10:51:18
您可以定义一个“重复”字段,在该字段中,可以在索引期间将值设置为"true“或重复文档的id。然后你可以过滤掉这些文档。
https://stackoverflow.com/questions/21082063
复制相似问题