У меня есть документ с вложенной структурой, вложенный объект имеет assignment_name и due_date:
Отображение
{
"goal": {
"mappings": {
"doc": {
"properties": {
"title": {
"type": "keyword"
},
// lot's of other fields here ...
"steps": {
"type": "nested",
"properties": {
"assignment_name": {
"type": "keyword"
},
"due_date": {
"type": "date"
}
// lots of other fields here
}
}
}
}
}
}
}
Я бы хотел:
user_a)Этот запрос дает мне случайный результат (без сортировки):
{
"query":{
"bool":{
"filter":[
{
"nested":{
"path":"steps",
"query":{
"term":{
"steps.assignment_name":"user_a"
}
}
}
}
]
}
},
"sort":[
{
"steps.due_date":{
"order":"asc",
"nested":{
"path":"steps",
"filter":{
"term":{
"steps.assignment_name":"user_a"
}
}
}
}
}
],
"from":0,
"size":25
}
Во-первых, вам нужно убедиться, что тип данных для поля steps — nested. Затем вы должны использовать вложенная сортировка для сортировки документов на основе вложенного поля документа.
Запрос будет таким:
{
"query": {
"bool": {
"filter": [
{
"nested": {
"path": "steps",
"query": {
"term": {
"steps.assignment_name": "user_a"
}
}
}
}
]
}
},
"sort": [
{
"steps.due_date": {
"order": "asc",
"nested": {
"path": "steps",
"filter": {
"term": {
"steps.assignment_name": "user_a"
}
}
}
}
}
]
}
Уловка выше заключается в использовании того же фильтра сортировки, который используется в основном запросе для фильтрации документов. Это гарантирует, что при сортировке документов будет учитываться правильное значение поля вложенного документа.
@shredding Можете ли вы добавить сопоставление индекса с вопросом?
Фактическое сопоставление несколько отличается (поскольку проблему было проще объяснить с помощью комментариев, но я буду обновлять соответственно) в секунду!
Обновлено. Теперь я скопировал сопоставление и фактический запрос. Извините, что мне не удалось привести упрощенный пример.
Есть ли вероятность того, что один документ имеет более одного вложенного документа, где steps.assignment_name имеет значение как user_a?
Это на самом деле идея. У него может быть n шагов с различными назначениями, и я хочу, чтобы был следующий.
Это действительно странно, так как это не случайно. У меня есть модульный тест, и он работает примерно 19 из 20 раз.
Ладно, вроде не случайно. Я увеличил команду sleep после фиксации индекса до одной секунды, и теперь она работает. Так что может быть просто проблема с синхронизацией в моем модульном тесте. Спасибо большое.
... хм. или нет, он ломается примерно каждые 1/30, но, возможно, это проблема синхронизации.
Похоже, вы запрашиваете до обновления индекса.
Есть ли способ узнать, обновлен ли индекс? Сейчас я использую flush_index и pythons sleep.
Посмотрите на обновить индекс. Это следует использовать с осторожностью для производственного кластера. Хотя его можно использовать для dev/test env и UT.
Да, в производстве у меня все в порядке с задержкой. Я добавил 1 секунду сна с последующим обновлением и смог запустить модульный тест 100 раз подряд. Спасибо за вашу помощь.
Как включить другие критерии фильтрации для сортировки?
Хм. Это не работает. Я получаю нулевые результаты с постфиксом
.keywordи случайные (не отсортированные) результаты без него.