Запрос условий (ElasticSearch) не работает для некоторых значений полей - PullRequest
0 голосов
/ 10 июля 2019

Это мое сопоставление, где я уже объявил обязательное поле в качестве ключевого слова, но мой запрос условий не работает для category_name и storeName, но он работает нормально по цене.

 "mappings": {
            "properties" : {
            "firebaseId":{
            "type":"text"
            },
                "name" : {
                   "type" : "text",
                   "analyzer" : "synonym"

                },
                "name_auto" : {
                "type": "text",

    "fields": {
      "edgengram": {
        "type": "text",
        "analyzer": "edge_ngram_analyzer",
        "search_analyzer": "edge_ngram_search_analyzer"
      },
      "completion": {
        "type": "completion"
      }

    }
                },

                "category_name" : {
                            "type": "text",
                                "fields": {
                                  "keyword": { 
                                    "type": "keyword"
                            }
                }
                },
                "storeName" : {
                      "type": "text",
                                "fields": {
                                  "keyword": { 
                                    "type": "keyword"
                }
                }
                },
                "sku" : {
                    "type" : "text"
                },
                "price" : {
                    "type": "text",
                        "fields": {
                            "keyword": { 
                                "type": "keyword"
                            }
                }
                },
                "magento_id" : {
                    "type" : "text"
                },
                "seller_id" : {
                    "type" : "text"
                },
                "square_item_id" : {
                    "type" : "text"
                },
                "square_variation_id" : {
                    "type" : "text"
                },
                "typeId" : {
                    "type" : "text"
                }
            }
    }
}
}

Это мой запрос ниже:

{
  "size": 0, 
  "aggs": {
    "Category Filter": {
      "terms": {
        "field": "category_name",
        "size": 10
      }
    },
    "Store Filter": {
      "terms": {
        "field": "storeName",
        "size": 10
      }
    },
    "Price Filter": {
      "range": {
        "field": "price",
        "ranges": [
          {
            "from": 0,
            "to": 50
          },
          {
            "from": 50,
            "to": 100
          },
          {
            "from": 100,
            "to": 200
          }
        ]
      }
    }
  }
}

, который возвращает следующее:

"reason": {"type": "invalid_argument_exception", "reason": "Fielddata отключен в текстовых полях по умолчанию. Установить fielddata= true для [category_name] для загрузки данных поля в память путем инвертирования инвертированного индекса. Обратите внимание, что это может, однако, использовать значительную память. Вместо этого используйте вместо этого ключевое слово field. "

1 Ответ

1 голос
/ 10 июля 2019

Вам необходимо использовать подполе .keyword, например:

{
  "size": 0, 
  "aggs": {
    "Category Filter": {
      "terms": {
        "field": "category_name.keyword",    <-- change this
        "size": 10
      }
    },
    "Store Filter": {
      "terms": {
        "field": "storeName.keyword",        <-- change this
        "size": 10
      }
    },
    "Price Filter": {
      "range": {
        "field": "price",
        "ranges": [
          {
            "from": 0,
            "to": 50
          },
          {
            "from": 50,
            "to": 100
          },
          {
            "from": 100,
            "to": 200
          }
        ]
      }
    }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...