Add bool filter to suggestion endpoint (#19476) (#19685)

This commit is contained in:
Søren Louv-Jansen 2018-06-05 21:54:54 +02:00 committed by GitHub
parent d131af8da8
commit a1eebca019
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 16 additions and 11 deletions

View file

@ -26,9 +26,9 @@ export function registerValueSuggestions(server) {
method: ['POST'],
handler: async function (req, reply) {
const { index } = req.params;
const { field, query } = req.payload;
const { field, query, boolFilter } = req.payload;
const { callWithRequest } = server.plugins.elasticsearch.getCluster('data');
const body = getBody({ field, query });
const body = getBody({ field, query, boolFilter });
try {
const response = await callWithRequest(req, 'search', { index, body });
const buckets = get(response, 'aggregations.suggestions.buckets') || [];
@ -41,7 +41,7 @@ export function registerValueSuggestions(server) {
});
}
function getBody({ field, query }) {
function getBody({ field, query, boolFilter = [] }) {
// Helps ensure that the regex is not evaluated eagerly against the terms dictionary
const executionHint = 'map';
@ -57,6 +57,11 @@ function getBody({ field, query }) {
size: 0,
timeout: '1s',
terminate_after: terminateAfter,
query: {
bool: {
filter: boolFilter,
}
},
aggs: {
suggestions: {
terms: {

View file

@ -26,9 +26,9 @@ import { getSuggestionsProvider as conjunction } from './conjunction';
const cursorSymbol = '@kuery-cursor@';
export function getSuggestionsProvider({ config, indexPatterns }) {
export function getSuggestionsProvider({ config, indexPatterns, boolFilter }) {
const getSuggestionsByType = mapValues({ field, value, operator, conjunction }, provider => {
return provider({ config, indexPatterns });
return provider({ config, indexPatterns, boolFilter });
});
return function getSuggestions({ query, selectionStart, selectionEnd }) {

View file

@ -24,15 +24,15 @@ import { kfetch } from '../../kfetch';
const type = 'value';
const requestSuggestions = memoize((query, field) => {
const requestSuggestions = memoize((query, field, boolFilter) => {
return kfetch({
pathname: `/api/kibana/suggestions/values/${field.indexPatternTitle}`,
method: 'POST',
body: JSON.stringify({ query, field: field.name }),
body: JSON.stringify({ query, field: field.name, boolFilter }),
});
}, resolver);
export function getSuggestionsProvider({ config, indexPatterns }) {
export function getSuggestionsProvider({ config, indexPatterns, boolFilter }) {
const allFields = flatten(
indexPatterns.map(indexPattern => {
return indexPattern.fields.map(field => ({
@ -64,7 +64,7 @@ export function getSuggestionsProvider({ config, indexPatterns }) {
return [];
}
return requestSuggestions(query, field).then(data => {
return requestSuggestions(query, field, boolFilter).then(data => {
const quotedValues = data.map(value => `"${escapeQuotes(value)}"`);
return wrapAsSuggestions(start, end, query, quotedValues);
});
@ -85,8 +85,8 @@ function wrapAsSuggestions(start, end, query, values) {
});
}
function resolver(query, field) {
function resolver(query, field, boolFilter) {
// Only cache results for a minute
const ttl = Math.floor(Date.now() / 1000 / 60);
return [ttl, query, field.indexPatternTitle, field.name].join('|');
return [ttl, query, field.indexPatternTitle, field.name, JSON.stringify(boolFilter)].join('|');
}