Пользовательские фасеты с использованием Elasti c Поиск - PullRequest
0 голосов
/ 15 марта 2020

У меня есть страница поиска, которая использует фасеты. Когда пользователь вводит термины в строке поиска или устанавливает флажок фасета в левом столбце, это запускает новый поиск в нашем поисковом индексе Elasti c. enter image description here

Вот как работают аспекты. Наш запрос включает агрегирование по каждой из категорий фасетов. Например, ответ агрегации для категории «имя» включает в себя все имена из набора результатов и количество раз, когда каждое имя появляется в наборе результатов. Поскольку это приложение Vuejs, а данные фасета являются адаптивной переменной, фасет затем обновляется новым списком ключей и количеством документов в скобках.

enter image description here

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

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

Я предполагаю, что мне нужно провести рефакторинг, чтобы, когда пользователь выбирает флажок в категории foo, агрегация работала с другим набором результатов, который учитывал термин панели поиска и проверенные значения во всех других категориях, но игнорирует выбор пользователя в категории foo. Как это можно сделать в Elasti c?

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

В конечном счете, Мне нужно реализовать это с помощью высокоуровневого REST-клиента Elasti c для JAVA, но даже простые примеры cURL были бы полезны.

Вот мой текущий запрос агрегирования ...

        for (String colName : colNames) {
        sourceBuilder.aggregation(AggregationBuilders.terms(colName)
                .field(colName + ".keyword"));
    }

1 Ответ

0 голосов
/ 15 марта 2020

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

Для него можно использовать глобальное агрегирование .

Определяет одну корзину всех документов в контексте выполнения поиска. Этот контекст определяется индексами и типами документов, которые вы ищете, но не зависит от самого поискового запроса

Пример

Отображение:

{
  "index50" : {
    "mappings" : {
      "properties" : {
        "name" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        }
      }
    }
  }

Данные:

 "hits" : [
      {
        "_index" : "index50",
        "_type" : "_doc",
        "_id" : "v8MR3XABAqtoal9HOsoo",
        "_score" : 1.0,
        "_source" : {
          "name" : "john"
        }
      },
      {
        "_index" : "index50",
        "_type" : "_doc",
        "_id" : "wMMR3XABAqtoal9HU8rs",
        "_score" : 1.0,
        "_source" : {
          "name" : "doe"
        }
      }
    ]

Запрос:

{
  "query": {
    "match": {
      "name": "john"
    }
  },
  "aggs": {
    "name_global_faucet": {
      "global": {},--> will return terms from all documents
      "aggs": {
        "first_name": {
          "terms": {
            "field": "name.keyword",
            "size": 10
          }
        }
      }
    },
    "name_faucet": {
      "terms": {--> will return terms from documents returned in query
        "field": "name.keyword",
        "size": 10
      }
    }
  }
}

Результат:

  "hits" : {
    "total" : {
      "value" : 1,
      "relation" : "eq"
    },
    "max_score" : 0.6931472,
    "hits" : [
      {
        "_index" : "index50",
        "_type" : "_doc",
        "_id" : "v8MR3XABAqtoal9HOsoo",
        "_score" : 0.6931472,
        "_source" : {
          "name" : "john"
        }
      }
    ]
  },
  "aggregations" : {
    "name_faucet" : {
      "doc_count_error_upper_bound" : 0,
      "sum_other_doc_count" : 0,
      "buckets" : [
        {
          "key" : "john",
          "doc_count" : 1
        }
      ]
    },
    "name_global_faucet" : {
      "doc_count" : 2,
      "first_name" : {
        "doc_count_error_upper_bound" : 0,
        "sum_other_doc_count" : 0,
        "buckets" : [
          {
            "key" : "doe",
            "doc_count" : 1
          },
          {
            "key" : "john",
            "doc_count" : 1
          }
        ]
      }
    }
  }
}
...