Мне нужен способ сопоставления с ближайшим номером документа эластичного поиска.
Я хочу использовать упругий поиск для фильтрации количественных атрибутов и смог достичь жестких ограничений, используя диапазон запросы принимают, что результаты, которые находятся за пределами этого набора результатов, пропускаются.Я бы предпочел, чтобы результаты поиска нескольких фильтров были наиболее близки.
const query = {
query: {
bool: {
should: [
{
range: {
gte: 5,
lte: 15
}
},
{
range: {
gte: 1979,
lte: 1989
}
}
]
}
}
}
const results = await client.search({
index: 'test',
body: query
})
Скажем, у меня были документы, в которых были год и продажи.Во фрагменте приведен небольшой пример того, как это будет сделано в javascript.Он просматривает весь список и вычисляет оценку, затем на основе этой оценки сортирует их, ни в коем случае результаты не отфильтровываются, они просто упорядочены по релевантности.
const data = [
{ "item": "one", "year": 1980, "sales": 20 },
{ "item": "two", "year": 1982, "sales": 12 },
{ "item": "three", "year": 1986, "sales": 6 },
{ "item": "four", "year": 1989, "sales": 4 },
{ "item": "five", "year": 1991, "sales": 6 }
]
const add = (a, b) => a + b
const findClosestMatch = (filters, data) => {
const scored = data.map(item => ({
...item,
// add the score to a copy of the data
_score: calculateDifferenceScore(filters, item)
}))
// mutate the scored array by sorting it
scored.sort((a, b) => a._score.total - b._score.total)
return scored
}
const calculateDifferenceScore = (filters, item) => {
const result = Object.keys(filters).reduce((acc, x) => ({
...acc,
// calculate the absolute difference between the filter and data point
[x]: Math.abs(filters[x] - item[x])
}), {})
// sum the total diffences
result.total = Object.values(result).reduce(add)
return result
}
console.log(
findClosestMatch({ sales: 10, year: 1984 }, data)
)
<script src="https://codepen.io/synthet1c/pen/KyQQmL.js"></script>
Я пытаюсь добиться того же в эластичном поиске, но безуспешно при использовании запроса function_score .например,
const query = {
query: {
function_score: {
functions: [
{
linear: {
"year": {
origin: 1984,
},
"sales": {
origin: 10,
}
}
}
]
}
}
}
const results = await client.search({
index: 'test',
body: query
})
Нет текста для поиска, я использую его для фильтрации только по числам, я делаю что-то не так или это не тот упругий поиск, и есть ли лучшие альтернативы?
При использовании вышеизложенного каждый документ по-прежнему имеет оценку по умолчанию, и я не смог получить какой-либо фильтр для применения каких-либо модификаторов к оценке.
Спасибо за любую помощь, я новичок вasticsearchссылки на статьи или области документации приветствуются!