Строковый запрос ES Query с отдельной проверкой уникальных значений - PullRequest
0 голосов
/ 20 ноября 2018

У меня есть запрос строки запроса, в котором выполняется поиск по именам элементов из поля мгновенного поиска

{
"query": {
    "query_string" : {
        "default_field" : "name",
        "query" : "'.$searchQuery.'"
    }
}
}

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

                "_source": {
                "name": "Whatever Item Name",
                "category": "Whatever Category",

Таким образом, если в качестве входных данных для поиска выбрано «Независимо от *», оба должны возвращать элементы с именем «Независимо от», но также отдельно возвращать список уникальных значений категории, содержащих «Независимо от» (не все элементы, имеющие «Независимую категорию»). , Поэтому следует возвращать элементы, имена которых совпадают, которые могут иметь любую категорию, а также доступные категории среди всех элементов в отдельности. Можно ли это объединить в одном запросе?

1 Ответ

0 голосов
/ 20 ноября 2018

У вас есть несколько вариантов, но вот два, которые я бы попробовал сначала.

Используйте один запрос с тегами / именованными подзапросами.Как вы можете видеть ниже, в bool/should мы запрашиваем имена и категории, которые соответствуют some_input, с небольшим повышением по категориям, поэтому они ранжируются лучше всего и всплывают в результатах.Кроме того, результаты называются либо name_match, либо category_match, чтобы вы знали, что это за хиты.Возможно, вы захотите немного поиграть с бустом.Также вам может потребоваться изменить размер, чтобы получить все ожидаемые результаты:

{
  "size": 20,
  "query": {
    "bool": {
      "should": [
        {
          "query": {
            "query_string": {
              "default_field": "name",
              "query": "some_input",
              "_name": "name_match"
            }
          }
        },
        {
          "match": {
            "category": {
              "query": "some_input",
              "boost": 2,
              "_name": "category_match"
            }
          }
        }
      ]
    }
  }
}

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

{
  "query": {
    "query_string": {
      "default_field": "name",
      "query": "some_input"
    }
  },
  "aggs": {
    "categories": {
      "filter": {
        "match": {
          "category": {
            "query": "some_input"
          }
        }
      },
      "aggs": {
        "categories": {
          "terms": {
            "field": "category",
            "size": 10
          }
        }
      }
    }
  }
}

ОБНОВЛЕНИЕ

Чтобы вычислить категории для всех данных,Вы можете использовать post_filter вместо query:

{
  "post_filter": {
    "query_string": {
      "default_field": "name",
      "query": "some_input"
    }
  },
  "aggs": {
    "categories": {
      "filter": {
        "match": {
          "category": {
            "query": "some_input"
          }
        }
      },
      "aggs": {
        "categories": {
          "terms": {
            "field": "category",
            "size": 10
          }
        }
      }
    }
  }
}
...