Как использовать предварительный фильтр для упругого поиска для повышения производительности? - PullRequest
0 голосов
/ 06 декабря 2018

У меня есть запросasticsearch, который ищет людей по нескольким полям, довольно просто, это выглядит так:

{
  "query": {
    "bool": {
      "should": [
        {
          "multi_match": {
            "query": "joe",
            "fields": [
              "personName^-1.0",
              "person.city^-1.0",
              "person.street^-1.0"
            ],
            "type": "phrase_prefix",
            "lenient": "true"
          }
        }
      ],
      "boost": 1.0,
      "minimum_should_match": "1"
    }
  },
  "from": 0,
  "size": 20
}

моя проблема в том, что у меня есть много людей в моей базе данных, и я хочу добавить некоторыесвоего рода повышение производительности, поэтому я получу человека "страна", а затем буду искать только людей в этой стране.

, поэтому я попробовал что-то вроде:

{
  "query": {
    "bool": {
      "must": [
        {
          "term": {
            "country": {
              "boost": "0.0",
              "value": "US"
            }
          }
        }
      ],
      "should": [
        {
          "multi_match": {
            "query": "joe",
            "fields": [
              "personName^-1.0",
              "person.city^-1.0",
              "person.street^-1.0"
            ],
            "type": "phrase_prefix",
            "lenient": "true"
          }
        }
      ],
      "boost": 1.0,
      "minimum_should_match": "1"
    }
  },
  "from": 0,
  "size": 20
}

, но это не работает...я не дает результата, и я полагаю, что ..

мой объект выглядит так:

{
  "personName": "joey",
  "country": "US",
   "city": "LA",
   "street": "hollywood",
}

мои отображения:

{
  "people": {
    "mappings": {
      "vendors": {
        "properties": {
          "country": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
          },
          "personName": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
          },
          "street": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
          },
          "city": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
          }
        }
      }
    }
  }
}

1 Ответ

0 голосов
/ 06 декабря 2018

Это может решить вашу проблему, просто измените поле страны на страну .keyword, оно будет использовать поле без анализа.

{
  "query": {
    "bool": {
      "must": [
        {
          "term": {
            "country.keyword": {
              "boost": "0.0",
              "value": "US"
            }
          }
        }
      ],
      "should": [
        {
          "multi_match": {
            "query": "joe",
            "fields": [
              "personName^-1.0",
              "person.city^-1.0",
              "person.street^-1.0"
            ],
            "type": "phrase_prefix",
            "lenient": "true"
          }
        }
      ],
      "boost": 1.0,
      "minimum_should_match": "1"
    }
  },
  "from": 0,
  "size": 20
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...