develop.16: Обсуждение вопросов программирования

From: Difrex(mobile) (tavern,23) 12.12.17 07:22 UTC
To: All
Subject: API поиска на dynamic.lessmore.pw

== Поиск на dynamic.lessmore.pw



Как это ваще устроено??? На самом деле [API]( https://dynamic.lessmore.pw/search) -- это открытый всем Elasticsearch, который предоставляет
гору возможностей для поиска за счет движка Lucene. Давайте что-нибудь найдем!

Вот в [этом]( XWShDDcuR4C8PcrTFdGl) вот комменте я пообещал рассказать как это все сделать. Приступим.

Давайте для начала попробуем поискать этот самый коммент(XWShDDcuR4C8PcrTFdGl). Здесь и далее мы будем использовать только
*curl*.

====
curl -XPOST -d '{"query": {"query_string" : {"fields" : ["msgid"], "query" :"XWShDDcuR4C8PcrTFdGl"}}}' https://dynamic.lessmore.pw/search
====

Нам вернется такой вот ответ
====
{
  "took": 2,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 1,
    "max_score": 8.316952,
    "hits": [
      {
        "_index": "idec_net",
        "_type": "post",
        "_id": "XWShDDcuR4C8PcrTFdGl",
        "_score": 8.316952,
        "_source": {
          "echo": "idec.talks",
          "subg": "Re: Совет нодов",
          "to": "Peter",
          "author": "Difrex(mobile)",
          "message": "\nПостараюсь завтра написать пост с обзором в ii://develop.16. Ну, и ссылку в этот тред скину.",
          "date": "1513020107",
          "msgid": "XWShDDcuR4C8PcrTFdGl",
          "tags": "",
          "repto": "h97Frgqdtapl4AI11aUj",
          "address": "tavern,23"
        }
      }
    ]
  }
}
====
Вот и он!

Нам вернулось одно сообщение, что не удивительно, т.к. ID в сети уникальны, а мы искали именно по нему.

А теперь давайте выведем все последние(5) сообщения(по дате) из эхи *idec.talks*:
====
curl -XPOST -d '{"sort": [{"date": {"order": "desc"}}, {"_score": {"order": "desc" }}], "size": 5}' https://dynamic.lessmore.pw/search -H 'Content-type: application/json'
{
  "took": 2,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  }
...
====

Смотрите, тут мы отсортировали(на стороне сервера) сообщения по дате в порядке убывания и ограничили лимит в 5 сообщений.
Попробуйте перевести это на SQL(====select * from idec.talks order by date desc limit 5====).

А теперь выполним более сложный поиск: мы найдем сообщения по строке! Т.е. выполним полнотекстовый поиск!

Запрос будет выглядеть так:
====
{
  "sort": [
    {
      "date": {
        "order": "desc"
      }
    },
    {
      "_score": {
        "order": "desc"
      }
    }
  ],
  "query": {
    "simple_query_string": {
      "query": "обзор"
    }
  },
  "size": 5
}
====
Отправляем его POST-ом в https://dynamic.lessmore.pw/search.

В ответ нам на это вернется список из 5 сообщений отсортированных по дате, где найдены вхождения слова "обзор".
Кстати, верхнее сообщение(b2rhH6sOfzEzgGZzLT51(на данный момент)) из эхи habra.16 и с заголовком
"Обзор литературы по языку Python для начинающих".

Вот так вот. Чтобы делать более лучшие вещи читайте документацию(query DSL) по Elasticsearch.

// Да, если вашей эхи нет в индексе, то убедитесь, что она есть в list.txt
[251 / 285]