Elasticsearch-属性和字段之间有什么区别?

时间:2018-08-20 07:03:34

标签: elasticsearch

我一直在阅读有关属性和字段的这两个文档:

https://www.elastic.co/guide/en/elasticsearch/reference/current/multi-fields.html

https://www.elastic.co/guide/en/elasticsearch/reference/current/properties.html

我了解特定文档中所述的目的(意味着我了解属性的用途,并且了解多字段的目的),但我并没有真正看到它们实际用途之间的区别。例如,在来自字段doc的代码段中,显示了如何定义多字段:

PUT my_index
{
  "mappings": {
    "_doc": {
      "properties": {
        "city": {
          "type": "text",
          "fields": {
            "raw": { 
              "type":  "keyword"
            }
          }
        }
      }
    }
  }
}

如果我将“ fields”改为“ properties”,它的工作原理是否完全一样?

2 个答案:

答案 0 :(得分:4)

如果您在示例中将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,并且要使用此字段,我们必须键入{ {1}}。

因此,结论是,city.keyword只是一种告诉Elasticsearch您希望它以几种不同的方式处理同一数据字段的方法。例如,当用不同语言为文本编制索引时,它可能会派上用场。

希望有帮助!

答案 1 :(得分:0)

根据Elasticsearch文档中的“字段”:

  

通常以不同的方式为相同的字段建立索引对于   不同的目的。这是多字段的目的。例如,   字符串字段可以映射为文本字段以进行全文搜索,   并作为用于排序或聚合的关键字字段:

考虑到上面的语句和JSON,如果要同时使用“ city”和“ keyword”作为文本,则需要在“ fields”下声明其他类型,以便像

一样进行查询。
"sort": {
  "city.raw": "asc" 
}