给定这样的短语匹配查询:
{
'match_phrase': {
'text.english': {
'query': "The fox jumped over the wall",
'phrase_slop': 4,
}
}
}有什么方法可以根据准确的匹配来分组结果吗?
因此,如果我有一个包含“快速狐狸跳过小墙”的text.english文档和3个包含“懒狐狸跳过大墙”的文档,我就得到了这两组结果。
我可以运行多个查询并在ES之外执行一些处理,但我需要一个在大量文档上合理执行的解决方案。理想情况下,我希望有一种方法可以使用我错过的聚合来实现这一点。
我想出的最佳解决方案是使用高亮显示运行上述查询,解析所有结果中的所有突出显示,并根据突出显示内容对其进行分组。对于非常小的结果集来说,这是很好的,但是在1000+文档结果集上,它是非常慢的。
编辑:,也许我可以把它弄得更清楚一些。如果我有具有下列值的示例文档:
我希望能够将我的结果与查询文本“狐狸跳过墙”分组如下:
发布于 2015-10-29 15:20:55
在我看来,highlighting是唯一的选择,因为它是Elasticsearch显示哪些文本“部分”匹配的唯一方法。在您的示例中,您希望根据“匹配”对文档进行分组。
如果文本更短(比如几个单词),也许一个更复杂的解决方案是以一种shingle-kind of的方式拆分文本,并对这些短语进行分组.也许吧。
但是对于文本页,我认为唯一的选择是使用高亮显示,然后执行其他步骤对突出显示的部分进行分组。
发布于 2015-10-23 18:37:23
如果text.english中的语句“完全相同”,那么它们的分数应该是相同的。您可以根据弹性搜索_score聚合结果。
请参考以下问题:得分场?
由于ES已经禁用了动态脚本,这可能会有所帮助。得分字段w/ Groovy禁用
发布于 2015-10-31 22:26:52
在产品搜索应用程序中,我也遇到了类似的问题/挑战。我想把产品按品牌分类。
Nikon
Nikos为了解决这个问题,我正在用暗示者做实验。背后的想法是,建议者将为我的搜索提供建议。这些建议将进行分组,不会对所有文件重复(即使可能有其他文本)。您可以使用术语暗示者或短语暗示
但是,这种方法可能要求您更改结果的处理。您必须将建议显示为组,并单独处理搜索结果。这种方法的优点是您不必自己进行分组。
另一种解决方案是使用术语聚合。此聚合将对word组(shingles)进行分组。但是,要获得结果,必须获取所有聚合,并将它们与查询输入相匹配。参见示例映射、数据和查询:
PUT /so
{
"settings": {
"analysis": {
"analyzer": {
"suggestion_analyzer": {
"tokenizer": "standard",
"filter": [
"lowercase"
]
},
"analyzer_shingle": {
"type": "custom",
"tokenizer": "standard",
"filter": [
"filter_shingle"
]
}
},
"filter": {
"filter_shingle": {
"type": "shingle",
"min_shingle_size": 4,
"max_shingle_size": 16,
"output_unigrams": "false"
}
}
}
},
"mappings": {
"d": {
"properties": {
"text": {
"properties": {
"english": {
"type": "string",
"fields": {
"shingles": {
"type": "string",
"analyzer": "analyzer_shingle"
},
"suggest": {
"type": "completion",
"index_analyzer": "analyzer_shingle",
"search_analyzer": "analyzer_shingle",
"payloads": true
}
}
}
}
}
}
}
}
}第1号文件:
POST /so/d/1
{
"text": {
"english": "The quick fox jumps over the big wall. JJKJKJKJ"
}
}文件2:
POST /so/d/2
{
"text": {
"english": "The quick fox jumps over the small wall. JJKJKJKJ"
}
}文件3:
POST /so/d/3
{
"text": {
"english": "The quick fox jumps over the gugus wall. LLLLLLL"
}
}查询:
POST /so/_search
{
"size": 0,
"query": {
"match": {
"text.english": "The quick fox jumps over the wall"
}
},
"aggs" : {
"states" : {
"terms" : {
"field" : "text.english.shingles",
"size": 40
}
}
}
}https://stackoverflow.com/questions/33304401
复制相似问题