如何获取多个精确匹配短语?

8
以下是获取精确匹配的查询语句。
GET courses/_search
{
  "query": {
    "term" : {
         "name.keyword": "Anthropology 230"
      }
  }
}

我需要找到 Anthropology 230Anthropology 250,如何获取精确匹配


但是Anthropology 230如何与Anthropology 230 also完全匹配呢? - A l w a y s S u n n y
@aysh,你能分享一下你的样本索引数据吗?并且你能告诉我基于那个索引数据你期望得到什么结果吗? - ESCoder
1
@AlwaysSunny,它是250,因此基本上它必须匹配2个值230和250。 - aysh
3个回答

4
您可以使用 matchmatch_phrasematch_phrase_prefix 进行验证和尝试。在使用match时,
GET courses/_search
{
    "query": {
        "match" : {
            "name" : "Anthropology 230"
        }
    },
    "_source": "name"
}

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

或者使用正则表达式

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

match_phrasematch_phrase_prefix在这里是过度的,如果OP不需要短语匹配并且正则表达式查询很耗费资源,可能会引起其他问题,很高兴你添加了match查询选项 :) - Amit
2
@Always Sunny 如果你使用match_phrase查询,那么它将不会匹配两个文档,它只会匹配包含Anthropology 230的一个文档 - ESCoder
2
@Bhavya,我同意并且知道这点:),我打错字了,我只是想说人类学,同时我也同意在这种情况下匹配更好,正如@Ninja所提到的。 - A l w a y s S u n n y
给投反对票的人:您投反对票的原因是什么? - A l w a y s S u n n y

3
你犯的错误是在关键字字段上使用了查询术语,而这两者都没有经过分析,这意味着它们尝试在反向索引中找到完全相同的搜索字符串。
你应该做的是:定义一个文本字段,如果您没有定义映射,则无论如何都会有。我还假设您在查询中提到了.keyword,如果您没有定义映射,则会自动创建该字段。
现在,您可以使用下面的匹配查询,它是经过分析的,并使用标准分析器来将令牌拆分成空格,因此您的2个示例文档将生成人类学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
您应该阅读有关分析过程的内容,并可以尝试使用分析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
        }
    ]
}

2
假设您可能有更多的“人类学 nnn”项目,那么这应该是您所需的操作:
"query":{
    "bool":{
        "must":[
            {"term": {"name.keyword":"Anthropology 230"}},
            {"term": {"name.keyword":"Anthropology 250"}},
        ]  
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接