match_phrase_prefix不返回match_phrase获得的结果

时间:2019-03-01 05:04:38

标签: elasticsearch

匹配词组查询

{ 
  "query": {
    "match_phrase": {
      "approved_labelled_products.companies": "SOMETHING INC"
    }
  }

返回特定结果,但 match_phrase_prefix查询

{
  "query": {
    "match_phrase_prefix": {
      "approved_labelled_products.companies": "SOME.*"
    }
  }
}

返回空结果集

"hits": 
{
    "total": 0,
    "max_score": null,
    "hits": []
 }

match_phrase_prefix必须至少返回由match_phrase查询获得的数据,但不是。

数据映射如下

    "approved_labelled_products": {
            "properties": {
              "companies": {
                "type": "keyword",
                "null_value": "NULL",
                "ignore_above": 9500
              }
             }
            }

2 个答案:

答案 0 :(得分:1)

match_phrasematch_phrase_prefix查询是全文搜索查询,要求数据字段为text类型。它与您使用的keyword类型有很大不同,现在让我解释一下您现在可以做什么以及有什么区别。

我可以使match_phrase_prefix工作吗?

是的,如果您将字段的类型更改为text,则可以使用match_phrase_prefix

如何使用keyword字段搜索前缀?

keyword按原样存储和查询,没有任何analysis。将其视为单个字符串;要查找所有具有给定前缀的此类字段的文档,只需使用prefix查询即可。

让我们定义映射并插入几个文档:

PUT myindex
{
  "mappings": {
    "_doc": {
      "properties": {
        "approved_labelled_products": {
          "properties": {
            "companies": {
              "type": "keyword",
              "null_value": "NULL",
              "ignore_above": 9500
            }
          }
        }
      }
    }
  }
}

POST myindex/_doc
{
  "approved_labelled_products": {
    "companies": "SOMETHING INC"
  }
}

现在我们可以发出这样的查询:

POST myindex/_doc/_search
{
  "query": {
    "prefix": {
      "approved_labelled_products.companies": "SOME"
    }
  }
}

请注意,由于实际上没有执行任何分析,因此请求区分大小写,并且通过字符串"some"进行查询将不会返回结果。

text字段有何不同?

text字段在建立索引期间为analyzed,这意味着将输入字符串拆分为令牌,将其小写,保存一些元信息并构造一个inverted index

这允许有效地获取包含某些令牌或令牌组合的文档。

为了说明这一点,我们可以使用_analyze API。让我们尝试先看看Elasticsearch如何分析keyword字段的数据:

POST _analyze
{
  "analyzer" : "keyword",
  "text": "SOMETHING INC"
}

这将返回:

{
  "tokens": [
    {
      "token": "SOMETHING INC",
      "start_offset": 0,
      "end_offset": 13,
      "type": "word",
      "position": 0
    }
  ]
}

如您所见,它是一个带有所有大写字母的令牌。

现在让我们来看一下standard分析器的功能(text字段默认使用的分析器):

POST _analyze
{
  "analyzer" : "standard",
  "text": "SOMETHING INC"
}

它将返回:

{
  "tokens": [
    {
      "token": "something",
      "start_offset": 0,
      "end_offset": 9,
      "type": "<ALPHANUM>",
      "position": 0
    },
    {
      "token": "inc",
      "start_offset": 10,
      "end_offset": 13,
      "type": "<ALPHANUM>",
      "position": 1
    }
  ]
}

如您所见,它产生了两个令牌,都用小写字母表示。


希望有帮助!

答案 1 :(得分:0)

您不必在match_phrase_prefix查询中使用通配符表达式。

改为使用此:

{
  "query": {
    "match_phrase_prefix": {
      "approved_labelled_products.companies": "SOME"
    }
  }
}