【问题标题】:Disable searching on some fields in Elastic Search禁用 Elastic Search 中某些字段的搜索
【发布时间】:2021-01-14 17:12:50
【问题描述】:

我只想在一个字段“XYZ”中启用搜索。我正在使用以下代码,但它给了我错误。你能帮我解决一下吗?

{
  "dynamic": "false",
  "properties": {
    "ABC": {
      "type": "text",
      "index": false,
      "store": true
      
    },
    "PQR": {
      "type": "text",
       "index": false,
      "store": true
    },
    "XYZ": {
      "type": "text"
    }
  }
}

附:我希望将字段“ABC”和“PQR”存储在弹性搜索中,但我也想禁用对这些字段的搜索。

【问题讨论】:

    标签: python amazon-web-services elasticsearch


    【解决方案1】:

    您可以使用enabled mapping parameter

    启用的设置,只能应用于顶层 映射定义和对象字段,导致 Elasticsearch 跳过 完全解析字段的内容。 JSON仍然可以 从 _source 字段中检索,但不可搜索或存储 以任何其他方式:

    索引映射:

    {
      "mappings": {
        "properties": {
          "ABC": {
            "enabled":false
          },
          "PQR": {
            "enabled":false
          },
          "XYZ": {
            "type": "text"
          }
        }
      }
    }
    

    索引数据:

    {
        "ABC": "b",
        "PQR": "c",
        "XYZ": "a"
    }
    

    搜索查询:PQR 字段上搜索时,没有搜索结果。

    {
      "query": {
        "match": {
          "PQR": {
            "query": "c"
          }
        }
      }
    }
    

    搜索结果:

    "hits": {
        "total": {
          "value": 0,
          "relation": "eq"
        },
        "max_score": null,
        "hits": []
      }
    

    搜索查询:

    {
      "query": {
        "match": {
          "XYZ": {
            "query": "a"
          }
        }
      }
    }
    

    搜索结果:

    "hits": [
          {
            "_index": "stof_64113718",
            "_type": "_doc",
            "_id": "1",
            "_score": 0.13353139,
            "_source": {
              "ABC": "b",
              "PQR": "c",
              "XYZ": "a"
            }
          }
        ]
    

    【讨论】:

    • 我希望将字段“ABC”和“PQR”存储在弹性搜索中,但我也想禁用这些字段的搜索。
    【解决方案2】:

    看起来您遇到了以下异常:

    “原因”:“创建查询失败:无法在字段 [PQR] 上搜索,因为 它没有被索引。",

    为了搜索它是正确的需要被索引,这由您设置为false的索引参数控制

    您当前的设置是正确的,您需要从搜索查询中排除未编入索引的字段,这是许多应用程序遵循的非常常见的模式,否则,您可以遵循 Bhavya 的答案,但这些字段将被存储作为_source 的一部分,并确保它没有被禁用(默认启用)。

    【讨论】:

      【解决方案3】:

      我相信你没有正确使用语法:

      PUT indexName
      {
        "mappings": { // <=============== This is missing
          "dynamic": false,
          "properties": {
            "ABC": {
              "type": "text", //<============= If type is object, use 'enabled' instead of 'index' 
              "index": false, 
              "store": true
            },
            "PQR": {
              "type": "text",
              "index": false,
              "store": true
            },
            "XYZ": {
              "type": "text"
            }
          }
        }
      }
      

      注意:

      1. enabled = false 通常用于对象类型的字段

      2. index = false 与文本等预定义类型一起使用

      3. index=false 和 enabled=false 都会使该字段不可索引,但该字段仍将存在于 _source 中。

      4. 对于 index=false 的字段,对这些字段的任何搜索请求都会导致以下错误:

         Cannot search on-field [xyz] since it is not indexed
        
      5. 对于启用 = false 的任何字段 (type=object),对这些字段的任何搜索请求都不会导致任何错误。

      【讨论】:

        猜你喜欢
        • 2017-09-15
        • 2021-09-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-03-22
        • 1970-01-01
        • 1970-01-01
        • 2010-12-15
        相关资源
        最近更新 更多