Как написать elasti c поисковый запрос, который соответствует, а затем фильтрует записи? - PullRequest
0 голосов
/ 08 января 2020

В Elasti c Поиск Я написал запрос, который соответствует условиям поиска и получает результаты. Вот запрос, который я использовал.

  {
    "size": 40,
    "query": {
      "bool": {
        "must": [
          {
            "match": {
              "name": {
                "query": "Salem Chennai",
                "fuzziness": 1,
                "prefix_length": 2,
                "operator": "or"
              }
            }
          }
        ]
      }
    }
  }

Это ответ, который я получил:

    "timed_out": false,
    "_shards": {
      "total": 5,
      "successful": 5,
      "skipped": 0,
      "failed": 0
    },
    "hits": {
      "total": 2,
      "max_score": 11.182817,
      "hits": [
        {
          "_index": "locations",
          "_type": "city",
          "_id": "1610",
          "_score": 11.182817,
          "_source": {
            "name": "Chennai",
            "code": "IN-TN-CENAI",
            "province_name": "Tamil Nadu",
            "province_code": "IN-TN",
            "country_name": "India",
            "country_code": "IN"
          }
        },
        {
          "_index": "locations",
          "_type": "city",
          "_id": "24216",
          "_score": 9.688159,
          "_source": {
            "name": "Salem",
            "code": "US-IN-SALEM",
            "province_name": "Indiana",
            "province_code": "US-IN",
            "country_name": "United States",
            "country_code": "US"
          }
        }
    ]
  }

Теперь я хотел бы отфильтровать ответ, записанный в коде страны.

Итак, я попробовал этот запрос

{
    "size": 40,
    "query": {
      "bool": {
        "must": [
          {
            "match": {
              "name": {
                "query": "Salem Chennai",
                "fuzziness": 1,
                "prefix_length": 2,
                "operator": "or"
              }
            }
          }
        ],
        "filter": [
          {
            "term": {
              "country_name": "India"
            }
          }
        ]
      }
    }
  }

Вот отображение индекса:

{
  "locations" : {
    "mappings" : {
      "city" : {
        "properties" : {
          "code" : {
            "type" : "text",
            "fields" : {
              "keyword" : {
                "type" : "keyword",
                "ignore_above" : 256
              }
            }
          },
          "country_code" : {
            "type" : "text",
            "fields" : {
              "keyword" : {
                "type" : "keyword",
                "ignore_above" : 256
              }
            }
          },
          "country_id" : {
            "type" : "text",
            "fields" : {
              "keyword" : {
                "type" : "keyword",
                "ignore_above" : 256
              }
            }
          },
          "country_name" : {
            "type" : "text",
            "fields" : {
              "keyword" : {
                "type" : "keyword",
                "ignore_above" : 256
              }
            }
          },
          "id" : {
            "type" : "text",
            "fields" : {
              "keyword" : {
                "type" : "keyword",
                "ignore_above" : 256
              }
            }
          },
          "name" : {
            "type" : "text",
            "fields" : {
              "keyword" : {
                "type" : "keyword",
                "ignore_above" : 256
              }
            }
          },
          "province_code" : {
            "type" : "text",
            "fields" : {
              "keyword" : {
                "type" : "keyword",
                "ignore_above" : 256
              }
            }
          },
          "province_country_code" : {
            "type" : "text",
            "fields" : {
              "keyword" : {
                "type" : "keyword",
                "ignore_above" : 256
              }
            }
          },
          "province_country_id" : {
            "type" : "text",
            "fields" : {
              "keyword" : {
                "type" : "keyword",
                "ignore_above" : 256
              }
            }
          },
          "province_country_name" : {
            "type" : "text",
            "fields" : {
              "keyword" : {
                "type" : "keyword",
                "ignore_above" : 256
              }
            }
          },
          "province_id" : {
            "type" : "text",
            "fields" : {
              "keyword" : {
                "type" : "keyword",
                "ignore_above" : 256
              }
            }
          },
          "province_name" : {
            "type" : "text",
            "fields" : {
              "keyword" : {
                "type" : "keyword",
                "ignore_above" : 256
              }
            }
          }
        }
      }
    }
  }
}

Я должен был получить один результат, однако этот запрос не дает мне никаких результатов. Может кто-нибудь помочь мне написать правильный запрос, который может соответствовать, а затем отфильтровать записи из поиска elasti c?

Я использовал это как ссылку: https://www.elastic.co/guide/en/elasticsearch/reference/current/query-filter-context.html#query -filter-context-ex

1 Ответ

1 голос
/ 08 января 2020

Вы должны использовать свое ключевое слово для фильтрации, как показано ниже:

{
    "size": 40,
    "query": {
      "bool": {
        "must": [
          {
            "match": {
              "name": {
                "query": "Salem Chennai",
                "fuzziness": 1,
                "prefix_length": 2,
                "operator": "or"
              }
            }
          }
        ],
        "filter": [
          {
            "term": {
              "country_name.keyword": "India"
            }
          }
        ]
      }
    }
  }

Поле country_name (withoud .keyword) анализируется (нормализуется) во время индексации, поэтому в зависимости от ваших анализаторов оно было преобразовано к чему-то другому (например, в нижнем регистре, может быть остановлено, ...).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...