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


1 . . . 5 6
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

Reply to: Z55xAaFjwrSrWfuMc5qp
From: Difrex(mobile) (tavern,23) 12.12.17 09:24 UTC
To: Difrex(mobile)
Subject: Re: API поиска на dynamic.lessmore.pw
Фикс для запроса эхи. Правильный запрос будет выглядеть так
====
{
  "sort": [
    {
      "date": {
        "order": "desc"
      }
    },
    {
      "_score": {
        "order": "desc"
      }
    }
  ],
  "query": {
    "query_string": {
      "fields": [
        "echo"
      ],
      "query": "idec.talks"
    }
  },
  "size": 5
}
====

From: Difrex(mobile) (tavern,23) 05.01.18 08:02 UTC
To: All
Subject: TopicID на dynamic: вытаскиваем тред целиком
Я тут ковыряя тредовый режим для dynamic'а понял, что проще добавить фичу в бэкенд,
чем разгребать свой говнокод на JS.

Так вот суть: в индексе каждому сообщению присваивается topicid в формате UUID(RFC 4122).
Зная topicid мы можем выбрать целиком тред с нужной нам сортировкой.

Чтобы вытащить тред по интересующему сообщению(мы знаем msgid) нам нужно будет сделать 2 запроса:
* Первый - узнаем topicid из сообщения
* Второй - вытягиваем ветку

Здесь и далее запросы в json отправляются методом POST на https://dynamic.lessmore.pw/search2.

Узнаем topicid
====
{
  "sort": [
    {
      "date": {
        "order": "desc"
      }
    },
    {
      "_score": {
        "order": "desc"
      }
    }
  ],
  "query": {
    "query_string": {
      "fields": [
        "msgid"
      ],
      "query": "apfIchd9i8HMMc5DKJNI"
    }
  },
  "size": 1
}
====

В ответ нам вернется документ сообщения
====
{
  "took": 1,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 1,
    "max_score": null,
    "hits": [
      {
        "_index": "idec5",
        "_type": "post",
        "_id": "apfIchd9i8HMMc5DKJNI",
        "_score": 9.252761,
        "_source": {
           ...
           "topicid": "fcb208f7-c947-42bc-a037-73d63b137913"
        },
        "sort": [
          1514976123000,
          9.252761
        ]
      }
    ]
  }
}
====

Теперь зная topicid можно вытянуть весь тред с сортировкой от старых к новым(или наоборот).

Модифицируем первый запрос
====
{
  "sort": [
    {
      "date": {
        "order": "asc"
      }
    },
    {
      "_score": {
        "order": "asc"
      }
    }
  ],
  "query": {
    "query_string": {
      "fields": [
        "topicid"
      ],
      "query": "fcb208f7-c947-42bc-a037-73d63b137913"
    }
  },
  "size": 100
}
====

Ответом будет список с документами ветки отсортированный по дате от старых сообщений к новым.

Новый поиск будет доступен тут https://dynamic.lessmore.pw/search2 в ближайшее время, и нидекс будет наполняться совсем неторопливо.
После полного реиндекса поиск будет объявлен стабильным и доступен по https://dynamic.lessmore.pw/search.
Так же фетчер, маппинг, веб будут документированы и снабжаться инструкцией по развертке.

// Народ, а каких бы еще фич хотелось бы вам?

Reply to: DC8QAVuQ8QDaADOIkQYr
From: vit01 (mira, 1) 05.01.18 08:53 UTC
To: Difrex(mobile)
Subject: Re: TopicID на dynamic: вытаскиваем тред целиком
> // Народ, а каких бы еще фич хотелось бы вам?

1. Хотелось бы добавить в FAQ описание, как пользоваться тредами и навигацией туда-сюда-обратно по msgid, сабжам, поинтам

2. Нужен парсинг цитат, комментариев и прочей разметки. И выделение цветом. А то читать просто так крайне неудобно

3. API для экспорта текущей ленты в формат RSS.

4. При доступе через клиент, когда скачиваешь сообщение, отсутствует тег ii/ok. Это баг

Reply to: Rcy51bveDTL5DRe74yPV
From: Difrex(mobile) (tavern,23) 05.01.18 09:08 UTC
To: vit01
Subject: Re: TopicID на dynamic: вытаскиваем тред целиком
>> // Народ, а каких бы еще фич хотелось бы вам?
>1. Хотелось бы добавить в FAQ описание, как пользоваться тредами и навигацией туда-сюда-обратно по msgid, сабжам, поинтам
Будет отдельная от фака дока.

>2. Нужен парсинг цитат, комментариев и прочей разметки. И выделение цветом. А то читать просто так крайне неудобно
Есть в TODO.

>3. API для экспорта текущей ленты в формат RSS.
Интересное предложение, посмотрю, что можно придумать

>4. При доступе через клиент, когда скачиваешь сообщение, отсутствует тег ii/ok. Это баг
Я удивлен, что оно вообще работает =)

Да, кстати, я был бы очень признателен, если бы хотелки и баги формировались, как таск.

* По вебу тут https://gitea.difrex.ru/lapus/dynamic/issues
* По ноде тут https://gitea.difrex.ru/Umbrella/lessmore
* По индексу тут https://gitea.difrex.ru/Umbrella/fetcher

Если удобней на гитхабе, то могу синкать актуальные изменения и туда :)

Reply to: bknpzKjtKi9B14Azs5TW
From: Difrex(mobile) (tavern,23) 08.01.18 11:43 UTC
To: Difrex(mobile)
Subject: Re: TopicID на dynamic: вытаскиваем тред целиком
Так, я начинаю индексирование всего. Теперь у почти каждого сообщения должен появиться topicid.
Те сообщения, для которых по каким-то причинам не найдено старового сообщения, получают тег "misplaced": "yes".

1 . . . 5 6