当前位置: 首页 > 知识库问答 >
问题:

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

端木承业
2023-03-14

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

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

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

我理解具体文档中描述的每个属性的用途(意味着我理解属性的用途,我理解多字段的用途),但我并不真正看到它们实际用途之间的区别。。例如,在fields文档中的代码片段中,显示了如何定义多字段:

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

如果我把“字段”这个词换成“属性”,效果会完全一样吗?

共有2个答案

慕容烨
2023-03-14

根据Elasticsearch留档的"字段":

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

考虑到上面的语句和你的JSON,如果你想使用“城市”作为文本和“关键字”,你需要在“字段”下声明另一种类型,这样你就可以像

"sort": {
  "city.raw": "asc" 
}
莘翰采
2023-03-14

如果在您的示例中仅将字段替换为属性,那么正如Biplab所说,Elasticsearch将为您提供一个例外:

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

属性基本上声明您将在这里发送一个复杂的JSON对象。

使用属性而不是示例中的字段的最接近映射如下所示:

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"
  }
}

请注意,“纽约”重复两次。

在这里,您可以使用match发出全文查询:

POST my_index_with_properties/doc/_search
{
  "query": {
    "match": {
      "city.name": "york"
    }
  }
}

或者使用术语查询进行精确搜索:

POST my_index_with_properties/doc/_search
{
  "query": {
    "term": {
      "city.name_keyword": "New York"
    }
  }
}

请注意,我们正在查询不同的字段。

使用带有字段的示例,当您发布它时,我们可以发送如下所示的文档:

POST my_index/doc
{
  "city": "New York"
}

正如您所看到的,没有明确的数据重复。但事实上,Elasticsearch的背后是为您进行复制。

现在我们可以使用city字段进行全文搜索:

POST my_index/doc/_search
{
  "query": {
    "match": {
      "city": "york"
    }
  }
}

不过,它对精确搜索不起作用。以下查询将不返回任何内容,因为字段city已标记化和小写,而术语查询的参数未标记:

POST my_index/doc/_search
{
  "query": {
    "term": {
      "city": "New York"
    }
  }
}

这个精确的搜索查询将代替工作:

POST my_index/doc/_search
{
  "query": {
    "term": {
      "city.keyword": "New York"
    }
  }
}

因为对于映射中的字段,我们刚刚要求Elasticsearch再次将该City字段索引为关键字,要使用该字段,我们必须键入city.keyword

因此,作为结论,字段只是告诉Elasticsearch您希望它以几种不同的方式处理相同的数据字段的一种方式。例如,在为不同语言的文本编制索引时,它可能很方便。

 类似资料:
  • 我目前正试图理解字段之间的差异(https://www.elastic.co/guide/en/elasticsearch/reference/current/multi-fields.html)和属性(https://www.elastic.co/guide/en/elasticsearch/reference/current/properties.html). 它们都以某种方式定义为类型/映射

  • 问题内容: 对于“属性”和“属性”之间的区别,我通常感到困惑,并且找不到很好的资源来简洁地详细说明这些区别。 问题答案: 属性是一种特殊的属性。基本上,当Python遇到以下代码时: 它查找中,然后检查,看它是否有一个,或方法- 如果这样做,这是一个性质。如果它 是 一个属性,则不仅会返回该对象(就像对其他任何属性一样),还会调用该方法(因为我们一直在进行查找),并返回该方法返回的内容。 有关Py

  • 问题内容: 谁能告诉我Javascript事件中和属性之间的确切区别以及示例,以及在哪种情况下使用哪个属性? 问题答案: 基本上,事件默认情况下会冒泡,因此两者之间的区别是: 是触发事件的元素(例如,用户单击) 是事件侦听器附加到的元素。

  • 问题内容: 可以在这里找到代码: 我发现有内标记,也有内标签。它们都是必需的吗?(在这种情况下,CSS似乎覆盖了HTML属性)关于它们之间的区别是否有任何解释? 问题答案: 我检查了文档,但是它们并不清楚如果同时设置了它们。 那藏在这里的某个地方: UA可以选择使用HTML源文档中的表示属性。如果是这样,则将这些属性转换为对应的CSS规则,其特异性等于0,并且将其视为在作者样式表的开头插入。因此,

  • 本文向大家介绍综合属性和继承属性之间的区别,包括了综合属性和继承属性之间的区别的使用技巧和注意事项,需要的朋友参考一下 合成属性和继承属性都是语言语义的一部分,该语言为其构造提供含义,例如标记和语法结构。语义有助于解释符号,符号的类型及其相互之间的关系,其分析可判断源程序中构造的语法结构是否衍生出任何含义。现在,基于属性的特征,我们可以区分综合属性和继承属性 以下是合成属性和继承属性之间的重要区别

  • 问题内容: 从一些初始教程中,我看到属性属于类,并且本质上是C ++世界中使用的“全局变量”(在几年前进行了编码)。我也将变量视为更多的“本地”实体,仅在方法中使用/存储信息。 然后我遇到了这个Quora线程:https : //www.quora.com/Apple-Swift-programming-language/What-is-the-difference- between-a-prop