Придавать больший вес существованию поля - PullRequest
0 голосов
/ 04 декабря 2018

Я пытаюсь выучить и написать запросы на поиск.Я понял, что существует поле «существует», которое возвращает документы указанного поля, существует или нет.Чтобы узнать, что я пишу простой запрос и хочу узнать больше и поиграть со структурой запроса.

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

"query": {
"bool": {
  "minimum_should_match" : 1,
  "should": [
    {
      "exists": {
        "field": "geo"
      }
    },
    {
      "exists": {
        "field": "location"
      }
    }
  ]
   "size": 100
}

Я хочу получить все документы, у которых сначала есть гео-поле (например, есть 30 документов с полем местоположения), а остальные 70 (размер - документы существуют геополе) будет документ, который содержит поля местоположения (другие должны).Таким образом, наличие веса поля местоположения для моего случая меньше, чем гео-существование.

Я попробовал повысить для этого, и это не сработало для моего случая, когда я делаю;

"query": {
"bool": {
  "minimum_should_match" : 1,
  "should": [
    {
      "exists": {
        "field": "geo",
        "boost": 5 
      }
    },
    {
      "exists": {
        "field": "location"
      }
    }
  ]
   "size": 100
}

Когда я изменяю Minimum_should_match на 2, он возвращает только те документы, которые существуют в геополе.

Ответы [ 2 ]

0 голосов
/ 04 декабря 2018

Вы должны попробовать этот запрос

{
  "query": {
    "function_score": {
      "functions": [
        {
          "filter": {
            "exists": {
              "field": "geo"
            }
          },
          "weight": 2
        },
        {
          "filter": {
            "exists": {
              "field": "location"
            }
          },
          "weight": 1
        }
      ]
    }
  },
  "from": 0,
  "_source": [
    "geo", "location"
  ],
  "size": 100
}

Это дает следующий результат;

 {
    "_index": "mentions",
    "_type": "post",
    "_id": "1",
    "_score": 2,
    "_source": {
      "geo": {
        "lon": XXX,
        "lat": XXX
      },
      "location": "California, USA"
    }
  },

{
    "_index": "mentions",
    "_type": "post",
    "_id": "2",
    "_score": 1,
    "_source": {
      "location": "Berlin, Germany"
    }
  }

Оценка первой функции равна 2, поскольку у нее есть географическое поле, а у второй - нет.

0 голосов
/ 04 декабря 2018

Вы не должны использовать повышение для этого случая.Вместо этого используйте сортировку:

"query": {
  "bool": {
    "minimum_should_match" : 1,
    "should": [
      {
        "exists": {
          "field": "geo"
        }
      },
      {
        "exists": {
          "field": "location"
        }
      }
    ]
  "size": 100
  }
},
"sort" : [
  { "geo" : {"order" : "asc"}},
  { "location" : {"order" : "asc"}}
]

Таким образом, вы получите отсортированные результаты (сначала будут документы с географическим полем, а затем документы с полем местоположения)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...