首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >弹性搜索中按匹配文本分组match_phrase搜索结果

弹性搜索中按匹配文本分组match_phrase搜索结果
EN

Stack Overflow用户
提问于 2015-10-23 14:08:25
回答 4查看 1.8K关注 0票数 9

给定这样的短语匹配查询:

代码语言:javascript
复制
{
    'match_phrase': {
        'text.english': {
            'query': "The fox jumped over the wall",
            'phrase_slop': 4,
        }
    }
}

有什么方法可以根据准确的匹配来分组结果吗?

因此,如果我有一个包含“快速狐狸跳过小墙”的text.english文档和3个包含“懒狐狸跳过大墙”的文档,我就得到了这两组结果。

我可以运行多个查询并在ES之外执行一些处理,但我需要一个在大量文档上合理执行的解决方案。理想情况下,我希望有一种方法可以使用我错过的聚合来实现这一点。

我想出的最佳解决方案是使用高亮显示运行上述查询,解析所有结果中的所有突出显示,并根据突出显示内容对其进行分组。对于非常小的结果集来说,这是很好的,但是在1000+文档结果集上,它是非常慢的。

编辑:,也许我可以把它弄得更清楚一些。如果我有具有下列值的示例文档:

  1. “那只飞快的狐狸跳过了那堵小墙。胡扯了好多页无关的文字。”
  2. “懒惰的狐狸跳过了那堵大墙,胡说了好多页无关的文字。”
  3. “懒惰的狐狸跳过了那堵大墙,胡说了好多页无关的文字。”
  4. “懒惰的狐狸跳过了那堵大墙,胡说了好多页无关的文字。”

我希望能够将我的结果与查询文本“狐狸跳过墙”分组如下:

  • “飞快的狐狸跳过小墙”-文件1
  • “懒狐狸跳过大墙”--文件2,3,4
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-10-29 15:20:55

在我看来,highlighting是唯一的选择,因为它是Elasticsearch显示哪些文本“部分”匹配的唯一方法。在您的示例中,您希望根据“匹配”对文档进行分组。

如果文本更短(比如几个单词),也许一个更复杂的解决方案是以一种shingle-kind of的方式拆分文本,并对这些短语进行分组.也许吧。

但是对于文本页,我认为唯一的选择是使用高亮显示,然后执行其他步骤对突出显示的部分进行分组。

票数 2
EN

Stack Overflow用户

发布于 2015-10-23 18:37:23

如果text.english中的语句“完全相同”,那么它们的分数应该是相同的。您可以根据弹性搜索_score聚合结果。

请参考以下问题:得分场?

由于ES已经禁用了动态脚本,这可能会有所帮助。得分字段w/ Groovy禁用

票数 2
EN

Stack Overflow用户

发布于 2015-10-31 22:26:52

在产品搜索应用程序中,我也遇到了类似的问题/挑战。我想把产品按品牌分类。

代码语言:javascript
复制
Nikon
Nikos

为了解决这个问题,我正在用暗示者做实验。背后的想法是,建议者将为我的搜索提供建议。这些建议将进行分组,不会对所有文件重复(即使可能有其他文本)。您可以使用术语暗示者短语暗示

但是,这种方法可能要求您更改结果的处理。您必须将建议显示为组,并单独处理搜索结果。这种方法的优点是您不必自己进行分组。

另一种解决方案是使用术语聚合。此聚合将对word组(shingles)进行分组。但是,要获得结果,必须获取所有聚合,并将它们与查询输入相匹配。参见示例映射、数据和查询:

代码语言:javascript
复制
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号文件:

代码语言:javascript
复制
POST /so/d/1
{
    "text": {
        "english": "The quick fox jumps over the big wall. JJKJKJKJ"
    }
}

文件2:

代码语言:javascript
复制
POST /so/d/2
{
    "text": {
        "english": "The quick fox jumps over the small wall. JJKJKJKJ"
    }
}

文件3:

代码语言:javascript
复制
POST /so/d/3
{
    "text": {
        "english": "The quick fox jumps over the gugus wall. LLLLLLL"
    }
}

查询:

代码语言:javascript
复制
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
            }
        }
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33304401

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档