
Vladimir
14.10.2017
04:43:27
Немного бигдаты завезли:
http://commoncrawl.org/2017/09/september-2017-crawl-archive-now-available/
The crawl archive for September 2017 is now available! The archive is located in the commoncrawl bucket at crawl-data/CC-MAIN-2017-39/. It contains 3.01 billion web pages and over 250 TiB of uncompressed content.
Может кому будет полезно. :)


Alexey
14.10.2017
11:39:11
Лови ошибки в `Task.await` и рейзи
а как их ловить, если try/rescue и try/catch не ловят падение таска при его ожидании с помощью Task.await?
если использовать генсервер, то сообщения все равно будут обрабатываться одно за другим. т.е. тогда надо делать 2 генсервера для обработки (со стратегией simple_one_for_one для динамического создания child'ов супервизором). при этом все равно не получится запустить их параллельно и дождаться выполнения в месте вызова (как при использовании Task.await для списка тасков).
в результате, если кому интересно, я сделал так:
elixir
[MyApp.Foo, MyApp.Bar]
|> Enum.map(fn x ->
sup_pid = MyApp.TaskSupervisor
Task.Supervisor.async_nolink(sup_pid, x, :run, [])
end)
|> Enum.map(&Task.yield/1)
|> Enum.each(fn
{:ok, _result} -> :ok
{:exit, {error, _stack}} -> raise error
nil -> raise "timeout running task"
end)
не знаю, насколько это идиоматично, - фактически мне было надо просто зарирейзить ошибку в основном процессе запроса.


Alex
14.10.2017
11:47:06
может Task.async_stream заюзать?

Alexey
14.10.2017
11:53:19
его не пробовал - спасибо, посмотрю вечером, получится ли прикрутить

Google

Alexey
14.10.2017
13:55:32
еще можно попробовать применить Flow вместо task/await

Yuri
14.10.2017
15:13:03
господа, есть такой Map:
map = %{aggregations: %{brand_text: %{terms: %{field: "brand_text"}},
merchant: %{terms: %{field: "merchant"}}},
query: %{bool: %{minimum_should_match: 1,
should: %{match: %{name: "query"}}}}}
как мне сюда map[:query][:bool]. вставить другой Map, например:
%{term: %{merchant: "Lacywear"}}
чет ваканалья совсем с мапами

Dmitry
14.10.2017
16:02:32

Alexey
14.10.2017
16:03:42
может что-то вроде этого?
new_val = %{term: %{merchant: "Lacywear"}}
%{map | query: %{map.query | bool: %{map.query.bool | new_val} }
но если Путин умеет вложенные мапы, то будет лучше. понятнее

Dmitry
14.10.2017
16:12:27
Путин умеет положить в любое существующее место
Т.е. он не может создать место а потом в него положить
Единственное ограничение

Alexey
14.10.2017
16:13:17
а. синтаксис в моем примере - тоже не может обновить ключ, если его в мапе нету

Dmitry
14.10.2017
16:13:44
Потому что put_in кладёт не обязательно в мап

Alexey
14.10.2017
16:13:56
вернее. значение ключа, которого нету

Google

Yuri
14.10.2017
16:21:09
а если уже есть :term
он его обновляет, а не дополняет :bool

Buckler
15.10.2017
03:12:03
Hello, Stella!
Please, calculate:
33+39=...
If you don't answer - you'll get banned from the channel...
Good luck!

Masson
15.10.2017
03:59:08
Ребята, а есть какое-нибудь руководство от программиста к программисту, например, по Elixir и или Erlang?
Включая, к примеру, хорошие и плохие практики.

Alexander
15.10.2017
04:02:33

Masson
15.10.2017
04:02:58
Понял вас. А по Erlang?

Alexander
15.10.2017
04:12:36
там как раз в формате good/bad
для эликсира самое близкое - это credo
но там все очень субъективно

Masson
15.10.2017
06:55:45
Спасибо!

Dmitry
15.10.2017
07:30:39
Есть такая по эликсиру
Только нифига не помогает если нету мозг или опыт
А если есть - то не нужны такие книжки
Так что лучше просто программировать, потом смотреть какое получилось говно и программировать опять
Я так делал

Alexey
15.10.2017
07:49:25
true story ))))

Yuri
15.10.2017
17:43:02
кто нить шарит elasticsearch? как сделать запрос, чтобы когда я фильтрую по полю, показывались остальные варианты, чтобы я мог выбирать несколько термсов

Александр
15.10.2017
17:49:22

Google

Yuri
15.10.2017
17:51:03

Александр
15.10.2017
17:51:29
ты хочешь показать вначале те что подошли, а потом все подряд?
или хочешь по нескольким условиям искать?

Yuri
15.10.2017
17:52:18
допустим я делаю fulltext поиск по title^ получаю результаты, потом фильтрую по полю Бренда например
ну стандартная штука во всех магазинах

Александр
15.10.2017
17:53:07
"should" : [
{ "term" : { "tag" : "wow" } },
{ "term" : { "tag" : "elasticsearch" } }
],
"minimum_should_match" : 1,
если по названию ищешь должно же быть строго
значит по title ищешь в must
всё остальное суёшь в should

Yuri
15.10.2017
17:54:35
хм, разделять надо

Александр
15.10.2017
17:55:55
тогда получиться, что все результаты будут с совпадением по title, те что с брендом вначале
а те что по бренду не совпали в конце
или что значит "разделять"?
ты хочешь подзапрос сделать?

Yuri
15.10.2017
18:00:14
вот типо такого https://github.com/ankane/searchkick#aggregations

Александр
15.10.2017
18:01:12
ну в эластике нет подзапросов, там хитрые скрипты
на самом деле я скриптами ни разу не пользовался, всё получилось грамотной организацией данных и bool + boost запросами
попробуй как я выше написал про must по title и should по всему остальному
ааа, в таком фильтре нужно точное сравнение

Yuri
15.10.2017
18:03:25
ну вот так он фильтрует, но все равно не показывает мне все merchant
query: %{
bool: %{
must: %{
multi_match: %{
query: query,
type: "most_fields",
fields: [ "name", "body" ]
}
},
should: %{
term: %{
merchant: "BUTIK"
}
},
minimum_should_match: 1
},
},

Google

Александр
15.10.2017
18:03:38
ааа
я понял

Yuri
15.10.2017
18:04:22
он просто показывает один BUTIK в секции aggregations в ответе

Александр
15.10.2017
18:04:25
у тебя проблема не в фильтрации, а показать из каких брендов есть товары списком, но чтобы товары были с пагинацией?

Yuri
15.10.2017
18:04:57
ну да
что бы мол потом отфилььтровать по нескольким брендам
типо ща стоит AND и все, не дает выбрать еще бренды
вот что отдает:
"merchant" => %{"buckets" => [%{"doc_count" => 250, "key" => "BUTIK"}],
"doc_count_error_upper_bound" => 0, "sum_other_doc_count" => 0}},

Александр
15.10.2017
18:06:35
а у тебя какая версия эластика?
там менялось это несколько раз
я когда делал это facets называлось
сейчас aggregations
https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket-terms-aggregation.html
это тебе надо?

Yuri
15.10.2017
18:08:06
Version: 5.6.1, Build: 667b497/2017-09-14T19:22:05.189Z, JVM: 1.8.0_102
да, так называеться, но это не дает понимания )
в запрос я добавляю:
aggregations: %{
merchant: %{
terms: %{
field: "merchant",
order: %{ _term: "asc" },
size: 20
}
},
}
здесь чет надо в секции query мне кажеться

Александр
15.10.2017
18:11:23
да, у тебя будет:
{
"query": {
... (то что у тебя уже получается)
},
"aggregations": {
... то что нужно добавить из доки
}
}

Yuri
15.10.2017
18:12:03
да

Google

Yuri
15.10.2017
18:12:08
так и есть )

Александр
15.10.2017
18:12:10
соответственно возьми самый простой пример
{
"aggs" : {
"genres" : {
"terms" : { "field" : "genre" }
}
}
}
и поподставляй свои поля и посмотри на результат

Yuri
15.10.2017
18:13:12
так и делаю

Александр
15.10.2017
18:13:31
и что не получается?


Yuri
15.10.2017
18:13:39
query: %{
bool: %{
must: %{
multi_match: %{
query: query,
type: "most_fields",
fields: [ "name", "body" ]
}
},
should: %{
term: %{
merchant: "BUTIK"
}
},
minimum_should_match: 1
},
},
aggregations: %{
merchant: %{
terms: %{
field: "merchant",
order: %{ _term: "asc" },
size: 20
}
}
}
}
он все фильтрует
но, не показывает всех merchant
которые были без фильтрации по нему
понимаешь
%{"_shards" => %{"failed" => 0, "skipped" => 0,
"successful" => 5, "total" => 5},
"aggregations" => %{"merchant" => %{"buckets" => [%{"doc_count" => 250,
"key" => "BUTIK"}], "doc_count_error_upper_bound" => 0,
"sum_other_doc_count" => 0}},
"hits" => %{"hits" =>
если убрать это
should: %{
term: %{
merchant: "BUTIK"
}
},
minimum_should_match: 1
то будет результат:
%{"_shards" => %{"failed" => 0, "skipped" => 0,
"successful" => 5, "total" => 5},
"aggregations" => %{"merchant" => %{"buckets" => [%{"doc_count" => 291,
"key" => "AIZEL"}, %{"doc_count" => 250, "key" => "BUTIK"},
%{"doc_count" => 5, "key" => "Bambolo"},
%{"doc_count" => 681, "key" => "Elyts"},
%{"doc_count" => 119, "key" => "Finn Flare"},
%{"doc_count" => 300, "key" => "GroupPrice"},
%{"doc_count" => 273, "key" => "Izobility.com"},
%{"doc_count" => 20, "key" => "KANZLER"},
%{"doc_count" => 196, "key" => "Lacywear"},
%{"doc_count" => 8, "key" => "MercLondon"},
%{"doc_count" => 10, "key" => "O'STIN"},
%{"doc_count" => 207, "key" => "PRESLI"},
%{"doc_count" => 156, "key" => "THE OUTLET"},
%{"doc_count" => 142, "key" => "TOPBRANDS"},
%{"doc_count" => 11, "key" => "TomTailor"},
%{"doc_count" => 73, "key" => "Vkostume"},
%{"doc_count" => 4, "key" => "Westland"},
%{"doc_count" => 87, "key" => "Zarina"},
%{"doc_count" => 48, "key" => "littlegentrys"},
%{"doc_count" => 6, "key" => "paper-shop"}],
"doc_count_error_upper_bound" => 0, "sum_other_doc_count" => 858}},
"hits" => %{"hits" =>
вот мне нужен такойже список чтобы можно было выбирать несколько