elasticsearch 학습 노트 (29) - 문자열 정렬 문제를 해결하기 위해field 인덱스를 두 번

4543 단어 elasticsearch

다음은 장면을 묘사한다


만약 어떤 필드의 형식이 텍스트라면, 색인을 만들 때, 모든 문서에 대응하는 이 텍스트 필드는 내용을 구분합니다.ES가 이미 존재하는field의 형식을 수정할 수 없기 때문에 이 필드는 항상 단어로 나뉘어져 있기 때문에 나중에 이 필드를 정렬할 필요가 있으면 안 됩니다.구체적으로 아래의 예시를 보아라.
PUT /test_index
{
  "mappings": {
    "properties": {
      "field1": {
        "type": "text"
      }
    }
  }
}
GET /test_index/_search
{
  "query": {
    "match_all": {}
  },
  "sort": [
    {
      "field1": {
        "order": "desc"
      }
    }
  ]
}
{
  "error": {
    "root_cause": [
      {
        "type": "illegal_argument_exception",
        "reason": "Fielddata is disabled on text fields by default. Set fielddata=true on [field1] in order to load fielddata in memory by uninverting the inverted index. Note that this can however use significant memory. Alternatively use a keyword field instead."
      }
    ],
    "type": "search_phase_execution_exception",
    "reason": "all shards failed",
    "phase": "query",
    "grouped": true,
    "failed_shards": [
      {
        "shard": 0,
        "index": "test_index",
        "node": "P-b-TEvyQOylMyEcMEhApQ",
        "reason": {
          "type": "illegal_argument_exception",
          "reason": "Fielddata is disabled on text fields by default. Set fielddata=true on [field1] in order to load fielddata in memory by uninverting the inverted index. Note that this can however use significant memory. Alternatively use a keyword field instead."
        }
      }
    ],
    "caused_by": {
      "type": "illegal_argument_exception",
      "reason": "Fielddata is disabled on text fields by default. Set fielddata=true on [field1] in order to load fielddata in memory by uninverting the inverted index. Note that this can however use significant memory. Alternatively use a keyword field instead.",
      "caused_by": {
        "type": "illegal_argument_exception",
        "reason": "Fielddata is disabled on text fields by default. Set fielddata=true on [field1] in order to load fielddata in memory by uninverting the inverted index. Note that this can however use significant memory. Alternatively use a keyword field instead."
      }
    }
  },
  "status": 400
}

이때 이 문제를 해결하려면stringfield를 두 번 인덱스로 만들 수 있습니다. 한 단어는 검색에 사용되고, 한 단어는 정렬에 사용되지 않습니다.Alternatively use a keyword field instead.오류의 알림에 따라 색인을 다시 만듭니다
PUT /test_index
{
  "mappings": {
    "properties": {
      "field1": {
        "type": "text",
        "fields": {
          "keyword": {
            "type": "keyword"
          }
        }
      }
    }
  }
}

GET /test_index/_search
{
  "query": {
    "match_all": {}
  },
  "sort": [
    {
      "field1.keyword": {
        "order": "desc"
      }
    }
  ]
}

{
  "took" : 6,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 3,
      "relation" : "eq"
    },
    "max_score" : null,
    "hits" : [
      {
        "_index" : "test_index",
        "_type" : "_doc",
        "_id" : "3",
        "_score" : null,
        "_source" : {
          "field1" : "third"
        },
        "sort" : [
          "third"
        ]
      },
      {
        "_index" : "test_index",
        "_type" : "_doc",
        "_id" : "2",
        "_score" : null,
        "_source" : {
          "field1" : "second"
        },
        "sort" : [
          "second"
        ]
      },
      {
        "_index" : "test_index",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : null,
        "_source" : {
          "field1" : "one"
        },
        "sort" : [
          "one"
        ]
      }
    ]
  }
}

좋은 웹페이지 즐겨찾기