匹配词组查询
{
"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
}
}
}
答案 0 :(得分:1)
match_phrase
和match_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"
}
}
}