如果您只是在示例中将fields 替换为properties,那么作为Biplab said,Elasticsearch 会给您一个例外:
"reason": "Failed to parse mapping [doc]: Mapping definition for [city] \
has unsupported parameters: [properties : {raw={type=keyword}}]",
那么properties 是什么?
properties 基本上声明你将在这里发送一个复杂的 JSON 对象。
在您的示例中使用 properties 而不是 fields 的最接近映射如下所示:
PUT my_index_with_properties
{
"mappings": {
"doc": {
"properties": {
"city": {
"properties": {
"name": {
"type": "text"
},
"name_keyword": {
"type": "keyword"
}
}
}
}
}
}
}
您必须插入的文档将如下所示:
POST my_index_with_properties/doc
{
"city": {
"name": "New York",
"name_keyword": "New York"
}
}
注意"New York" 重复了两次。
在这里您可以使用match 发出全文查询:
POST my_index_with_properties/doc/_search
{
"query": {
"match": {
"city.name": "york"
}
}
}
或使用term query 进行精确搜索:
POST my_index_with_properties/doc/_search
{
"query": {
"term": {
"city.name_keyword": "New York"
}
}
}
请注意,我们正在查询不同的字段。
它和fields有什么不同?
使用fields 的示例,正如您发布的那样,我们可以发送如下所示的文档:
POST my_index/doc
{
"city": "New York"
}
如您所见,没有明确的数据重复。但实际上,在 Elasticsearch 的底层为你做了这种复制。
现在我们可以使用city 字段进行全文搜索:
POST my_index/doc/_search
{
"query": {
"match": {
"city": "york"
}
}
}
但它不适用于精确搜索。以下查询将不返回任何内容,因为字段 city 已标记化并小写,而 term 查询的参数不是:
POST my_index/doc/_search
{
"query": {
"term": {
"city": "New York"
}
}
}
这个确切的搜索查询将起作用:
POST my_index/doc/_search
{
"query": {
"term": {
"city.keyword": "New York"
}
}
}
由于映射中的fields,我们刚刚要求Elasticsearch 再次索引该city 字段,作为keyword,并且要使用该字段,我们必须输入city.keyword。
因此,作为结论,fields 只是告诉 Elasticsearch 您希望它以多种不同方式处理相同数据字段的一种方式。例如,在索引不同语言的文本时,它可能会派上用场。