Elasticsearch Match query -- 匹配查询

摘要

返回满足匹配项的文档,这些匹配项可以是字符串、数字、日期、布尔。字符串,会在搜索前被解析。该match查询是用于执行全文搜索(包括模糊匹配选项)的标准查询。

参数

你想搜索的字段

匹配规则参数(忽略了一些参数,不常用或者是我不会用的参数)

  1. query,必选项。字符串、数字、日期、布尔。字符串。该match查询分析执行搜索之前的任何提供的文本。这意味着match查询可以在text字段中搜索分析的标记,而不是确切的词。
  2. analyzer,选填项。指定在执行搜索之前对query提供的文本进行分析的方式。默认为field的分析器一致。
  3. auto_generate_synonyms_phrase_query,选填项。如果"auto_generate_synonyms_phrase_query":true,则会自动为词组组成 match phrase查询。参见下文匹配词组 match phrase。
  4. operator,选填项。布尔逻辑,用于解释query中的文本。"operator": "or""query": "capital of Hungary"解释为capital OR of OR Hungary"operator": "and":解释为capital AND of AND Hungary可以用来组建一个临时的词组,某种意义上来说,就类似于match_phrase查询

匹配布尔前缀 match_bool_prefix

这类查询,会在查询之前分析query指定的文本,然后构造出一个bool复合查询。query经过分词后,除了最后一个词将被组成一个prefix 查询外,其他词组会被构造成tern查询。总的来说,这类查询,是bool的一种简写

文档中,下面两者请求示例等价

GET /_search
{
    "query": {
        "match_bool_prefix" : {
            "state" : "MD CT G"
        }
    }
}

GET /_search
{
    "query": {
        "bool" : {
            "should": [
                { "term": { "state": "MD" }},
                { "term": { "state": "Cd" }},
                { "prefix": { "state": "G"}}
            ]
        }
    }
}

说明

在实验中,下面的两种示例并不完全等价;就拿官方提供的数据而言,假如说state的类型为text则下面的两种情况,结果才会相同。

GET /bank/_search
{
    "query": {
        "match_bool_prefix" : {
            "state" : "MD CT G"
        }
    }
}

GET /bank/_search
{
    "query": {
        "bool" : {
            "should": [
                { "term": { "state.keyword": "MD" }},
                { "term": { "state.keyword": "CT" }},
                { "prefix": { "state.keyword": "G"}}
            ]
        }
    }
}

若state的类型为keyword,则下面示例的结果不同

GET /blak_new/_search
{
    "query": {
        "match_bool_prefix" : {
            "state." : "MD CT G"
        }
    }
}

GET /blak_new/_search
{
    "query": {
        "bool" : {
            "should": [
                { "term": { "state": "MD" }},
                { "term": { "state": "CT" }},
                { "prefix": { "state": "G"}}
            ]
        }
    }
}

匹配词组 match_phrase

这种查询将分析文本,并从分析的文本中创建短语查询。
例如一些俚语、专有名词、缩写等。分词器,不会将这些词组拆分成单个的字。
用户可以构建自己的词库。
请求示例,我在自己的词库中添加了一个词组671 Bristol Street
前一个搜索请求,只要文档中包含671BristolStreet就满足匹配条件;但第二个搜索请求只会匹配存在词组671 Bristol Street的文档

GET /bank/_search
{
    "query": {
        "match" : {
            "address" : {
                "query" : "671 Bristol Street",
                "auto_generate_synonyms_phrase_query":true
            }
        }
    }
}

GET /bank/_search
{
    "query": {
        "match_phrase" : {
            "address" : {
                "query" : "671 Bristol Street"
            }
        }
    }
}

匹配词组前缀 match_phrase_prefix

以包含的顺序,返回所提供文本的单词的文档。提供的最后一个词被视为前缀,匹配以该词开头的任意单词。简单的来说,query是一个整体
下面的这个示例会匹配a rule object,而不会匹配 a best rule of ,rule of you 等;

GET _search
{
  "query": {
    "match_phrase_prefix": {
      "address": {
        "query": "a rule o"
      }
    }
  }
}

多关键词匹配查询 multi_match

  1. 基于match,允许多个字段查询
  2. 字段可以使用通配符
  3. 字段可以使用^number,增强某个字段的重要性
  4. 如果为提供fields,则会默认为index.query.default_field。这回提取映射中符合词条查询条件的所有字段,并过滤元数据字段。然后将所有提取的字段组合起来构建查询。可以一次查询的字段数有限制。它由“ indices.query.bool.max_clause_count定义。

multi_match的types参数

  1. best_fields,默认值。query字段的单词(分词器分词后)出现在同一个field文档相关度要高于出现在多个field文档。

未完待续

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章