Elasticsearch 是否支持 MultiMatch 中的嵌套或对象字段?
Does Elasticsearch support nested or object fields in MultiMatch?
我有一些名为“FullTitleFts”的对象字段。它里面有字段“文本”。此查询工作正常(和 returns 一些条目):
GET index/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"fullTitleFts.text": "Ivan"
}
}
]
}
}
}
但是这个查询returns什么都没有:
GET index/_search
{
"query": {
"bool": {
"should": [
{
"multi_match": {
"query": "Ivan",
"fields": [
"fullTitleFts.text"
]
}
}
]
}
}
}
字段映射:
"fullTitleFts": {
"copy_to": [
"text"
],
"type": "keyword",
"fields": {
"text": {
"analyzer": "analyzer",
"term_vector": "with_positions_offsets_payloads",
"type": "text"
}
}
}
"analyzer": {
"filter": [
"lowercase",
"hypocorisms",
"protect_kw"
],
"char_filter": [
"replace_char_filter",
"e_char_filter"
],
"expand": "true",
"type": "custom",
"tokenizer": "standard"
}
e_char_filter 用于将西里尔字符“ё”替换为“е”,replace_char_filter 是用于从文本中删除“�”。 protect_kw 对于某些俄罗斯工会来说是 keyword_marker。 hypocorisms 是 synonym_graph 用于制作另一种形式的名称。
分析器输出示例:
GET index/_analyze
{
"analyzer": "analyzer",
"text": "Алёна�"
}
{
"tokens" : [
{
"token" : "аленка",
"start_offset" : 0,
"end_offset" : 5,
"type" : "SYNONYM",
"position" : 0
},
{
"token" : "аленушка",
"start_offset" : 0,
"end_offset" : 5,
"type" : "SYNONYM",
"position" : 0
},
{
"token" : "алена",
"start_offset" : 0,
"end_offset" : 5,
"type" : "<ALPHANUM>",
"position" : 0
}
]
}
我也找到了 this question。似乎答案并没有真正奏效——作者不得不在映射中添加“include_in_root”选项。所以我想知道多重匹配是否完全支持嵌套或对象字段。我在文档中也找不到任何相关信息。
由于您提供了索引映射,因此您的字段被定义为 multi-field 而不是嵌套字段或对象字段。所以 match
和 multi_match
都应该在不提供 path
的情况下工作。您可以在需要搜索文本类型时使用字段名称 fullTitleFts.text
,在需要搜索关键字类型时使用 fullTitleFts
。
我有一些名为“FullTitleFts”的对象字段。它里面有字段“文本”。此查询工作正常(和 returns 一些条目):
GET index/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"fullTitleFts.text": "Ivan"
}
}
]
}
}
}
但是这个查询returns什么都没有:
GET index/_search
{
"query": {
"bool": {
"should": [
{
"multi_match": {
"query": "Ivan",
"fields": [
"fullTitleFts.text"
]
}
}
]
}
}
}
字段映射:
"fullTitleFts": {
"copy_to": [
"text"
],
"type": "keyword",
"fields": {
"text": {
"analyzer": "analyzer",
"term_vector": "with_positions_offsets_payloads",
"type": "text"
}
}
}
"analyzer": {
"filter": [
"lowercase",
"hypocorisms",
"protect_kw"
],
"char_filter": [
"replace_char_filter",
"e_char_filter"
],
"expand": "true",
"type": "custom",
"tokenizer": "standard"
}
e_char_filter 用于将西里尔字符“ё”替换为“е”,replace_char_filter 是用于从文本中删除“�”。 protect_kw 对于某些俄罗斯工会来说是 keyword_marker。 hypocorisms 是 synonym_graph 用于制作另一种形式的名称。
分析器输出示例:
GET index/_analyze
{
"analyzer": "analyzer",
"text": "Алёна�"
}
{
"tokens" : [
{
"token" : "аленка",
"start_offset" : 0,
"end_offset" : 5,
"type" : "SYNONYM",
"position" : 0
},
{
"token" : "аленушка",
"start_offset" : 0,
"end_offset" : 5,
"type" : "SYNONYM",
"position" : 0
},
{
"token" : "алена",
"start_offset" : 0,
"end_offset" : 5,
"type" : "<ALPHANUM>",
"position" : 0
}
]
}
我也找到了 this question。似乎答案并没有真正奏效——作者不得不在映射中添加“include_in_root”选项。所以我想知道多重匹配是否完全支持嵌套或对象字段。我在文档中也找不到任何相关信息。
由于您提供了索引映射,因此您的字段被定义为 multi-field 而不是嵌套字段或对象字段。所以 match
和 multi_match
都应该在不提供 path
的情况下工作。您可以在需要搜索文本类型时使用字段名称 fullTitleFts.text
,在需要搜索关键字类型时使用 fullTitleFts
。