代码之家  ›  专栏  ›  技术社区  ›  CodeMonkey

弹性搜索-属性和字段之间的区别是什么?

  •  0
  • CodeMonkey  · 技术社区  · 6 年前

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

    如果我用“properties”来切换“fields”这个词,它的工作原理会不会完全相同?

    2 回复  |  直到 6 年前
        1
  •  7
  •   Nikolay Vasiliev    6 年前

    如果你只是替换 fields 具有 properties 在你的例子中,作为 Biplab said

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

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

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

    它与 领域 ?

    使用示例 领域 ,发布时,我们可以发送如下所示的文档:

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

    您可以看到,没有显式的重复数据。但事实上,在Elasticsearch的下面是为你做的复制。

    city 全文搜索字段:

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

    不过,这对于精确的搜索是行不通的。以下查询将不返回任何内容,因为 城市 是标记化和小写的,并且 学期

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

    相反,这个精确的搜索查询将起作用:

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

    领域 城市 另一次,作为 keyword ,要使用此字段,必须键入 city.keyword .

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

    希望能有帮助!

        2
  •  0
  •   Piotr Pradzynski    6 年前

    根据“字段”的Elasticsearch文档:

    以不同的方式为同一字段编制索引对于 不同的目的。这就是多领域的目的。例如, 字符串字段可以映射为全文搜索的文本字段, 作为排序或聚合的关键字字段:

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