【问题标题】:How to get exact match phrase more than one如何获得多个完全匹配的短语
【发布时间】:2020-11-02 16:09:50
【问题描述】:

下面是得到完全匹配的查询

GET courses/_search
{
  "query": {
    "term" : {
         "name.keyword": "Anthropology 230"
      }
  }
}

我需要找到Anthropology 230Anthropology 250 also

如何获得精确匹配

【问题讨论】:

  • 但是 Anthropology 230 如何与 exact 匹配 Anthropology 230
  • @aysh 你也可以分享你的样本索引数据吗?您能否根据该索引数据说出您的预期结果是什么?
  • @AlwaysSunny 它的 250,所以基本上它必须匹配 230 和 250 两个值
  • @aysh 感谢您接受答案,很高兴它对您有所帮助,希望您也投了赞成票,如果您也奖励赏金,那就太好了:D

标签: elasticsearch dsl elasticsearch-dsl


【解决方案1】:

您可以通过matchmatch_phrasematch_phrase_prefix 进行检查和尝试

使用匹配

GET courses/_search
{
    "query": {
        "match" : {
            "name" : "Anthropology 230"
        }
    },
    "_source": "name"
}

使用 ma​​tch_phrase

GET courses/_search
{
    "query": {
        "match_phrase" : {
            "name" : "Anthropology"
        }
    },
    "_source": "name"
}

使用regexp

GET courses/_search
{
    "query": {
        "regexp" : {
            "name" : "Anthropology [0-9]{3}"
        }
    },
    "_source": "name"
}

【讨论】:

  • match_phrasematch_phrase_prefix 在这里是多余的,如果 OP 不寻找短语匹配并且正则表达式查询很昂贵,可能会导致其他问题,很高兴您添加了 match 查询选项:)
  • @Always Sunny 如果你使用match_phrase查询,那么它不会匹配两个文档,它只会匹配一个包含Anthropology 230的文档
  • @Bhavya,同意,我知道 :),我有一个错字,我的意思是 Anthropology,我也同意在这种情况下匹配更好@Ninja提到
  • 投反对票:投反对票的原因是什么?
【解决方案2】:

您的错误是您在关键字字段上使用了术语查询并且它们都没有被分析,这意味着它们试图在倒排索引中找到完全相同的搜索字符串。

您应该做的是:定义一个text 字段,如果您还没有定义映射,您无论如何都会拥有该字段。我还假设与您在查询中提到的 .keyword 相同,如果您不定义映射,它将自动创建。

现在您可以在下面使用 match query 进行分析,并使用 standard analyzer 在空格上拆分令牌,因此将为您的 2 个示例文档生成 Anthropology 250230

简单高效的查询,同时提供文档

{
    "query": {
        "match" : {
            "name" : "Anthropology 230"
        }
    }
}

以及搜索结果

 "hits": [
      {
        "_index": "matchterm",
        "_type": "_doc",
        "_id": "1",
        "_score": 0.8754687,
        "_source": {
          "name": "Anthropology 230"
        }
      },
      {
        "_index": "matchterm",
        "_type": "_doc",
        "_id": "2",
        "_score": 0.18232156,
        "_source": {
          "name": "Anthropology 250"
        }
      }
    ]

上述查询匹配两个文档的原因是它创建了两个标记 anthropology230 并在两个文档中匹配 anthropology

您绝对应该阅读analysis process,也可以尝试analyze API 查看为任何文本生成的令牌。

为您的文本分析 API 输出

POST http://{{hostname}}:{{port}}/{{index-name}}/_analyze

{
  "analyzer": "standard",
  "text": "Anthropology 250"
}


{
    "tokens": [
        {
            "token": "anthropology",
            "start_offset": 0,
            "end_offset": 12,
            "type": "<ALPHANUM>",
            "position": 0
        },
        {
            "token": "250",
            "start_offset": 13,
            "end_offset": 16,
            "type": "<NUM>",
            "position": 1
        }
    ]
}

【讨论】:

    【解决方案3】:

    假设您可能有更多“人类学 nnn”项目,这应该可以满足您的需要:

    "query":{
        "bool":{
            "must":[
                {"term": {"name.keyword":"Anthropology 230"}},
                {"term": {"name.keyword":"Anthropology 250"}},
            ]  
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-07
      • 2015-11-25
      • 1970-01-01
      相关资源
      最近更新 更多