首页 文章

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

提问于
浏览
0

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

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”,它不会完全相同吗?

2 回答

  • 0

    如果您只是在示例中将 fields 替换为 properties ,那么,作为Biplab said,Elasticsearch会给您一个例外:

    "reason": "Failed to parse mapping [doc]: Mapping definition for [city] \
          has unsupported parameters:  [properties : {raw={type=keyword}}]",
    

    那么属性是什么?

    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 的示例,当您发布它时,我们可以发送如下所示的文档:

    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您希望它以几种不同方式处理相同数据字段的方法 . 例如,在为不同语言的文本编制索引时,它可能会派上用场 .

    希望有所帮助!

  • 3

    根据Elasticsearch“字段”文档:

    为不同目的以不同方式索引相同字段通常很有用 . 这是多领域的目的 . 例如,字符串字段可以映射为全文搜索的文本字段,也可以映射为排序或聚合的关键字字段:

    考虑到上述语句和您的JSON,如果您想使用“city”作为文本以及“keyword”,则需要在“fields”下声明其他类型,以便您可以查询

    "sort": {
      "city.raw": "asc" 
    }
    

相关问题