如何获得多个精确匹配词组

ays*_*ysh 8 dsl elasticsearch elasticsearch-dsl

以下是获取精确匹配的查询

GET courses/_search
{
  "query": {
    "term" : {
         "name.keyword": "Anthropology 230"
      }
  }
}
Run Code Online (Sandbox Code Playgroud)

我需要找到Anthropology 230Anthropology 250 also

如何获得精确匹配

Ami*_*wal 3

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

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

现在您可以使用下面的匹配查询,该查询经过分析并使用标准分析器,该分析器在空格上分割标记,因此将为您的 2 个示例文档生成 和Anthropology 250230

简单高效的查询带来了文档

{
    "query": {
        "match" : {
            "name" : "Anthropology 230"
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

以及搜索结果

 "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"
        }
      }
    ]
Run Code Online (Sandbox Code Playgroud)

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

您绝对应该阅读有关分析过程的信息,并且还可以尝试分析 API以查看为任何文本生成的标记。

分析文本的 API 输出

POST http://{{主机名}}:{{端口}}/{{索引名称}}/_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
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)