弹性搜索copy_to字段未填写

时间:2019-01-10 10:36:32

标签: elasticsearch copy mapping

我正在尝试将Elastic Search 5.6中的主标题字段复制到另一个具有以下内容的字段:index:false,因此我可以使用该字段来匹配确切的值。

但是。重新索引后,并使用_source:[“ exact_hoofdtitel”]执行搜索,字段“ exact_hoofdtitel”未填充“ hoofdtitel”的值。

PUT producten_prd_5_test
{
 "aliases": {},
 "mappings": {
   "boek": {
     "properties": {
       "hoofdtitel": {
         "type": "text",
         "copy_to": [
           "suggest-hoofdtitel", "exact_hoofdtitel"
         ]
       },
       "suggest-hoofdtitel": {
         "type": "completion",
         "analyzer": "simple",
         "preserve_separators": false,
         "preserve_position_increments": true,
         "max_input_length": 50
       },
       "exact_hoofdtitel":{
         "type":"text",
         "fields":{
           "keyword":{
             "type":"keyword",
             "index":false
           }
         }
       },
     }
   }
 },
 "settings": {
   "number_of_shards": "1",
   "number_of_replicas": "0"
 }
}


GET producten_prd_5_test/_search
{
  "_source":["hoofdtitel","exact_hoofdtitel"]
}


hits": [
      {
        "_index": "producten_prd_5_test",
        "_type": "boek",
        "_id": "9781138340671",
        "_score": 1,
        "_source": {
          "hoofdtitel": "The Nature of the Firm in the Oil Industry"
        }
      },

1 个答案:

答案 0 :(得分:1)

我相信,您无需copy_to就可以实现自己想要的目标。让我向您展示如何以及为什么在这里不需要它。

如何在同一字段上进行全文查询和完全匹配查询?

这可以通过fields映射属性来完成。基本上,具有以下映射:

PUT producten_prd_5_test_new
{
  "aliases": {},
  "mappings": {
    "boek": {
      "properties": {
        "hoofdtitel": {
          "type": "text", <== analysing for full text search
          "fields": {
            "keyword": {
              "type": "keyword" <== analysing for exact match
            },
            "suggest": {  
              "type": "completion",  <== analysing for suggest
              "analyzer": "simple",
              "preserve_separators": false,
              "preserve_position_increments": true,
              "max_input_length": 50
            }
          }
        }
      }
    }
  }
}

您将告诉Elasticsearch对同一字段建立索引三遍:一遍是全文搜索,一遍是完全匹配,另一遍是建议。

通过这样的term查询可以进行精确的搜索:

GET producten_prd_5_test_new/_search
{
  "query": {
    "term": {
      "hoofdtitel.keyword": "The Nature of the Firm in the Oil Industry"
    }
  }
}

为什么字段exact_hoofdtitel没有出现在返回的文档中?

因为copy_to不会更改源:

  

原始_source字段将不会被修改以显示复制的   值。

它的工作原理类似于_all字段,可让您在一个假想字段中合并多个字段的值并以一种特殊的方式对其进行分析。

copy_to字段进行index: false有意义吗?

使用index: false时,该字段将不会被分析并且将无法搜索(例如在您的示例中,字段exact_hoofdtitel.keyword)。

如果您想在该字段上进行关键字汇总,这样做仍然有意义:

GET producten_prd_5_test/_search
{
  "aggs": {
    "by copy to": {
      "terms": {
        "field": "exact_hoofdtitel.keyword"
      }
    }
  }
}

这将返回类似:

{
  "aggregations": {
    "by copy to": {
      "doc_count_error_upper_bound": 0,
      "sum_other_doc_count": 0,
      "buckets": [
        {
          "key": "The Nature of the Firm in the Oil Industry",
          "doc_count": 1
        }
      ]
    }
  }
}

希望有帮助!