Задать вопрос
  • Elasticsearch группировка и лимит?

    MintTea
    @MintTea
    Ну как-то так.

    Top hits aggregation
    Terms aggregation

    curl -XGET http://localhost:9200/index/type/_search -d '{
        "query": {
            "match_all": {}
        },
        "aggs": {
            "group_by_types": {
                "terms": {
                    "field": "type"
                },
                "aggs": {
                    "top_hits_in_group": {
                        "top_hits": {
                            "size": 10
                        }
                    }
                }
            }
        }
    }'
    Ответ написан
    Комментировать
  • Какой запрос поиска в elasticsearch по разным уровням?

    MintTea
    @MintTea
    Если нужно именно по всем имеющимся полям, выше уже ответили про _all.

    Если поля все-таки перечислимы, лучше multi match query.

    curl -XGET 'http://elasticsearch:9200/_search' -d '{
        "query": {
            "multi_match": {
                "query": "My search query",
                "fields": [
                    "title",
                    "description",
                    "tags.name",
                    "categories.name",
                    "categories.description"
                ]
            }
        }
    }'
    Ответ написан
    Комментировать
  • Как убить контейнер в вечном restarting?

    MintTea
    @MintTea
    Во избежания повторения, нужно задавать restart policy как unless-stoped или on-failure. Вангую, что у вас был always.
    Ответ написан
    1 комментарий
  • Как запаролить страницу?

    MintTea
    @MintTea
    > В чём преимущества? Есть ли смысл заморачиваться с БД?

    Нет. Вам никто не мешает хранить в файле соленый хэш от пароля (а в бд вы бы делали то же самое), и при достаточно сложном пароле вам должно быть фиолетово на утечку этого хэша.
    Ответ написан
    Комментировать
  • Как установить ограничение на размер папки в Ubuntu?

    MintTea
    @MintTea
    dd if=/dev/zero of=/foobar.fs bs=1M count=500
    mkfs /foobar.fs
    mkdir /foobar
    mount /foobar.fs /foobar


    Готово

    9dc963868e444515b361f675813a1065.png
    Ответ написан
    3 комментария
  • Elasticsearch 5 почему сразу 5-й релиз пока ещё выпускаются 2.х?

    MintTea
    @MintTea
    Насколько я вникаю в происходящее, они хотят выровнять мажорные версии своих основных продуктов (Elasticsearch\Logstash\Kibana\Beats). Максимальная среди них сейчас - Kibana 4.5.1, что приводит нас к релизу 5.0.

    А вообще хороший вопрос, я тоже не понимаю, с чего вдруг пропущено две мажорных версии и в патчноутах ни слова об этом.
    Ответ написан
    Комментировать
  • Как изменить "primary key" в Elasticsearch (т.е. вместо _id использовать другое поле)?

    MintTea
    @MintTea
    Я не смог понять, почему замена поля _id на что-то другое решит вашу проблему.

    Во-первых, _id может быть определен клиентом. Подробнее: тыц.
    Если вам не нравятся id, генерируемые эластиком, просто передавайте свои при создании документа.

    Во-первых, ES поддерживает группировку операций в одном запросе, если проблема в производительности:
    https://www.elastic.co/guide/en/elasticsearch/refe...

    Пример создания документа с предопределенным id (в данном случае - 12345):

    curl -XPUT 0.0.0.0:9200/index_name/type_name/12345/ -d '{
        "hey": "there"
    }'
    Ответ написан
    2 комментария
  • Как организовать backup в Elasticsearch?

    MintTea
    @MintTea
    Добавьте в elasticsearch.yml:

    path.repo: [ "/home/elastic_backup" ]

    И да, это написано в тексте кидаемого исключения:

    ...RepositoryException: location [/home/elastic_backup/] doesn't match any of the locations specified by path.repo because this setting is empty...
    Ответ написан
  • Как стартовать (и автостартовать) сервисы внутри контейнера с Centos7?

    MintTea
    @MintTea
    Как стартовать (и автостартовать) сервисы внутри контейнера с Centos7?

    По-разному, зависит от сервиса. Конкретно в вашем случае, вам надо конфиге nginx'а выключить демонизацию:

    daemon off;

    И добавить в Dockerfile команду, которую надо запустить при старте контейнера:

    CMD ["nginx"]

    Если вам, кроме nginx'а, нужны в контейнере еще какие-то сервисы - вы что-то делаете не так, вам нужно несколько контейнеров, по одному на сервис.
    Ответ написан
  • Как выбрать из elasticsearch элемент, у которого точно совпадает значение массива?

    MintTea
    @MintTea
    Как-то так (And filter + Term filter):

    curl -XGET 'http://localhost:9200/index_name/type_name/_search?pretty' -d '{
        "filter": {
            "and": [
                {"term": {"field_name": 1}},
                {"term": {"field_name": 2}},
                {"term": {"field_name": 3}},
                {"term": {"field_name": 4}}
            ]
        }
    }'
    Ответ написан
    Комментировать
  • Как поведет себя кластер ElasticSearch, если на одной из нод, закончится место на диске?

    MintTea
    @MintTea
    Как будет вести себя кластер, если свободное место закончится на этих двух нодах?

    Когда заполненность диска станет 90%, часть шардов уедет на другие ноды. Больше ничего не изменится.
    Ответ написан
    Комментировать
  • Как сделать поиск в WordPress посредством ElasticSearch с учетом контроля доступа?

    MintTea
    @MintTea
    1) Вы можете сохранять ACL лист для каждого документа в самом документе, и затем подставлять ID текущего пользователя в фильтр term по этому полю в каждый запрос. По сути, ничем не отличается от принципов, по которым это реализуется в рсубд.

    2) Индексация документов возможна через плагин. Вам нужно будет вручную перед сохранением поста вытаскивать из него ссылки на файлы, скачивать их и скармливать эластику их содержимое. С гугл доками идея та же самая, тут я правда не знаю, как их автоматически получить в машиночитаемом виде.
    Ответ написан
    Комментировать
  • Кто и как использует ElasticSearch в Production в странах СНГ?

    MintTea
    @MintTea
    Кто и как использует ElasticSearch и его продукты в странах СНГ?

    Вы знаете, в основном - ищем. Шутка.

    Мы, например, пилим портал недвижимости (ага, еще один), и используем ES+MySQL как эдакую гибридную базу данных, в которой каждый компонент занимается тем, что у него лучше всего получается. MySQL - отвечает за целостность и хранение данных в нормальной форме. ES - за поиск и аггрегации по денормализованным документам. Таким образом мы как бы имеем все преимущества NoSQL, без их недостатков. Кроме этого, через ES также идет куча трафика:
    • Автодополнение в формах.
    • Поиск по геокоординатам.
    • Поиск похожих документов по хитрым алгоритмам.
    • Поиск похожих документов по не очень хитрым алгоритмам, но с хитрым ранжированием.
    • Перколирование документов перколатором для автоматического заполнения тегов.
    • Аггрегирование разнообразной статистики.
    • Аггрегирование разнообразных счетчиков в цикле запроса-ответа.
    • Логгирование и последующие извлечение информации из логов при отслеживании проблем.

    В общем и целом, спустя год после внедрения ES - ощущения примерно как в известной статье
    Пола Грэма: "У НАС ЕСТЬ СЕКРЕТНОЕ ОРУЖИЕ". Это один из тех немногих инструментов, работая с которым, день за днем тащишься от него больше и больше.

    Насколько большие обьемы данных хранятся и обрабатываются?

    В индексе держатся документы только за последние пару недель, остальное в MySQL, и объемы выходят мелкими - около 2кк документов единовременно. Алсо, большинство запросов пишутся с использованием фильтров, и потому скорость выборок становится вообще несущественной.

    Были ли какие-то глобальные проблемы и сбои в работе?

    Глобальных не было, отмечу просто неприятные моменты:
    • Т.к. данные нужны в реалтайме и систему риверов использовать не вариант, каждая запись в бд создает/обновляет/удаляет документ самостоятельно. Эта синхронизация постоянно рассыпается.
    • ES со скрипом заводится на слабых машинах. Чтобы добиться более-менее стабильных автоматических билдов, лично мне пришлось прочесть чуть ли не всю информацию в интернете, касающуюся вопросов его производительности.
    • Русская морфология порой работает довольно странно.
    • Нечитаемая каша вместо нормальных исключений. Со временем привыкаешь, но в первый раз волосы на голове шевелятся.
    Используете ли другие продукты Elastic, например Logstash, Kibana, Marvel, Shield?

    Нет. Kibana выглядит интересно, но времени поставить и настроить ее все как-то нету.

    Ваши ответы помогут мне в организации презентации на последующих конференциях, в странах Балтии, но хочется делится опытом и дальше.

    Реквестирую ссылку на конференцию.
    Ответ написан
    1 комментарий
  • Как построить запрос к Elasticsearch, чтобы фильтровать по списку regex?

    MintTea
    @MintTea
    Для фильтрации типа "или" можно использовать секцию "should" используемого вами фильтра "bool". Примерно так:
    curl -XGET 'http://localhost:9200/_search' -d '{
        "filter": {
            "bool": {
                "should": [
                    {
                        "regexp": {
                            "word": "мульт.*"
                        }
                    },
                    {
                        "regexp": {
                            "word": "фильм.*"
                        }
                    }
                ],
                "must_not": {
                    "terms": {
                        "word": ["видео", "скачать"]
                    }
                }
            }
        }
    }'


    Валидация регулярок возможна через эластик (Validating api):
    curl -XGET 'http://localhost:9200/_validate/query?explain' -d '{
        "query": {
            "regexp": {
                "word": "мульт.*"
            }
        }
    }'
    Ответ написан
    Комментировать
  • Как написать хороший роутер или где взять готовый?

    MintTea
    @MintTea
    Что посоветуете ?

    Следовать стандартам оформления кода. PSR-1, PSR-2.

    Если смотреть в сторону готовых решений...

    Symfony Routing Component. Вы охренеете, пока будете пытаться его установить, но в конце у вас будет простой yml-конфиг, в котором все роуты прописаны декларативно.
    Ответ написан
    3 комментария
  • Чем принципиально отличается аналитика в Kibana от OLAP кубов?

    MintTea
    @MintTea
    С OLAP-кубами и специфичным софтом не работал, но поверхностно ознакомился. Выглядит очень запутанно и энтерпрайзно, постараюсь держаться от них подальше :)

    По поводу аналитики с использованием ES - реализуемо, я это делал - впечатления положительные. Для этого достаточно определить, какой тип документов в вашей базе данных считается центральным, после чего при добавлении производить рекурсивную денормализацию данных - вложенные документы в этом помогут. Должно получаться что-то в духе:

    "offer": { // данные из таблицы товаров
      "price": {
        "value": 1500000,
        "currency": "RUB"
      },
      "category": { // данные из таблицы категорий
        "name": "Иномарки",
        "group": { // еще одни данные из таблицы категорий
          "name": "Автомобили"
        }
      },
      "owner": { // данные из таблицы пользователей
        "first_name": "Антон",
        "last_name": "Антонов",
        "locality": { // данные из таблицы городов
          "name": "Москва",
          "country": { // данные из таблицы стран
            "name": "Россия"
          }
        },
        "organization": { // данные из таблицы организаций
          "name": "FreeAuto",
          "phone": "+7111222333"
        }
      }
    }

    Дальнейшая выборка из получившегося индекса производится аггрегациями, которые могут быть множественными, вложенными, фильтрованными, по конкретному полю, по конкретному полю во вложенном документе, и т.д. Тут уже от ваших задач зависит, что и как вы будете аггрегировать.

    И это, Kibana - не более, чем красивый интерфейс к результатам аггрегаций, от нее вообще ничего не зависит.
    Ответ написан
    Комментировать
  • Есть ли хорошая библа позволяющая с XML работать как с БД?

    MintTea
    @MintTea
    запрос делать в XML файл в стиле selcet where

    Ага, есть

    очень содержательные XML
    1500 строк

    мило
    Ответ написан
  • Как реализовать поиск адресов в ElasticSearch?

    MintTea
    @MintTea
    Делал что-то похожее с использованием эластика и фиаса, могу оставить пару комментариев:

    1. В эластике данные, как правило, хранятся в денормализованном виде, и это нормально. Избавляться от типа address в таком случае не надо, даже более - это единственный вариант, с которым вы можете хоть что-то найти в вашем индексе (почитайте, как строится TF/IDF для оценки релевантности)

    2. Полнотекстовый поиск по адресам - сомнительное решение. Тут должны применяться фильтры.

    3. Фиас это треш и угар. Мы *бались с ним полгода и в итоге выкинули, перейдя на собственную бд/модель местоположений
    Ответ написан
    Комментировать
  • Ваше мнение о таком PHP коде?

    MintTea
    @MintTea
    Я бы в сигнатуре функции добавил тайпхинт ко второму аргументу.

    А так, обычный код. Возможно, там он и не к месту (непонятно, какие именно действия происходят внутри замыкания), но с помощью array_map зачастую можно довольно красиво переписать те участки, в которых раньше был обычный foreach.
    Ответ написан
    Комментировать