阅读 113

大数据利器Elasticsearch之全文本查询之match_phrase_prefix查询

这是我参与8月更文挑战的第12天,活动详情查看:8月更文挑战
本Elasticsearch相关文章的版本为:7.4.2

Elasticsearch的match_phrase_prefix查询是基于match_phrase查询的基础上再添加一个prefix查询组合而成的。 返回包含提供的文本的单词且以相同顺序出现的文档。提供的文本的最后一个分词被视为前缀,匹配以该分词开头的任何单词。

假设有以下文档:

POST /match_phrase_prefix_test/_doc/1
{
  "message": "my name is ridingroad"
}


POST /match_phrase_prefix_test/_doc/2
{
  "message": "my last name is ridingroad"
}
复制代码

以下查询会返回message字段包含短语my name且紧跟着是以i开头的文档:

POST /match_phrase_prefix_test/_search
{
  "query": {
    "match_phrase_prefix": {
      "message": "my name i"
    }
  }
}
复制代码

返回的数据:

{
  "took" : 3,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 1,
      "relation" : "eq"
    },
    "max_score" : 0.5730107,
    "hits" : [
      {
        "_index" : "match_phrase_prefix_test",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 0.5730107,
        "_source" : {
          "message" : "my name is ridingroad"
        }
      }
    ]
  }
}
复制代码

同理,以下查询会返回message字段包含短语my last且紧跟着是以n开头的文档:

POST /match_phrase_prefix_test/_search
{
  "query": {
    "match_phrase_prefix": {
      "message": "my last n"
    }
  }
}
复制代码

返回的数据:

{
  "took" : 0,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 1,
      "relation" : "eq"
    },
    "max_score" : 1.0117995,
    "hits" : [
      {
        "_index" : "match_phrase_prefix_test",
        "_type" : "_doc",
        "_id" : "2",
        "_score" : 1.0117995,
        "_source" : {
          "message" : "my last name is ridingroad"
        }
      }
    ]
  }
}
复制代码

和match_pharse一样,可以通过slop参数控制允许调换分词位置的数量,具体可见match_phrase查询。

通过添加slop参数,下面的查询将可以匹配包含my last短语且紧跟着以n开头的doc2:

POST /match_phrase_prefix_test/_search
{
  "query": {
    "match_phrase_prefix": {
      "message": {
        "query": "my name last",
        "slop": 2
      }
    }
  }
}
复制代码

返回的数据:

{
  "took" : 0,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 1,
      "relation" : "eq"
    },
    "max_score" : 0.47492626,
    "hits" : [
      {
        "_index" : "match_phrase_prefix_test",
        "_type" : "_doc",
        "_id" : "2",
        "_score" : 0.47492626,
        "_source" : {
          "message" : "my last name is ridingroad"
        }
      }
    ]
  }
}

复制代码

同样,也可以为查询的字段在进行查询前指定analyzer进行分词。默认为使用创建mapping时的查询字段的analyzer,如果创建mapping没有显示指定analyzer,则将使用索引级别的默认analyzer。

注意: 假设你查询my last n,最后的一个分词n,将会进行查询已n开头的分词,但是有可能你想要的那个以n开头的单词并不在你的查询结果里面。因为Elasticsearch会去以n开头的已排序的分词里面取前50个放到查询中,加入你想查的是my last nzz, 那么很有可能nzz不在前50个分词里面。

文章分类
后端
文章标签