Ответы пользователя по тегу Elasticsearch
  • Какой запрос поиска в 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"
                ]
            }
        }
    }'
    Ответ написан
  • 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"
    }'
    Ответ написан
  • Как выбрать из elasticsearch элемент, у которого точно совпадает значение массива?

  • Как поведет себя кластер ElasticSearch, если на одной из нод, закончится место на диске?

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

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

    MintTea
    @MintTea
    Если вам некритично использовать именно официальный клиент, могу посоветовать альтернативную библиотеку: Elastica.

    Вот пример "заполнения индекса данными и организации поиска":

    use Elastica\Client;
    use Elastica\Document;
    use Elastica\Index;
    use Elastica\Query;
    use Elastica\QueryBuilder;
    
    // Get client
    $client = new Client();
    
    // Get index
    $index = $client->getIndex('index_name');
    $index->create(array(), true);
    
    // Get type
    $tweets = $index->getType('tweets');
    $tweets->addDocuments(array(
        new Document(1, ['author' => 'anton', 'text' => 'My first tweet']),
        new Document(2, ['author' => 'ivan', 'text' => 'My second tweet']),
        new Document(3, ['author' => 'vadim', 'text' => 'My third tweet']),
        new Document(4, ['author' => 'anton', 'text' => 'My fourth tweet']),
    ));
    
    // Perform refresh to be able to search
    $index->refresh();
    
    // Get query builder
    $qb = new QueryBuilder();
    
    // Get query
    $filter = $qb->filter()->term(['author' => 'vadim']);
    $filteredQuery = $qb->query()->filtered($filter);
    $query = new Query($filteredQuery);
    
    // Search!
    $resultSet = $tweets->search($query);
    
    // Result set is iterable
    foreach($resultSet as $result) {
        var_dump($result->getData());
    }
    Ответ написан
  • Для чего используется Mapping в Elasticsearch?

    MintTea
    @MintTea
    Mapping - описание схемы документов, которые вы будете сохранять в типе. Вам обязательно необходимо указывать ее явно, т.к. автомаппинг, применяющийся по умолчанию, хорош только для быстрого старта.

    По сути, вы перечисляете каждое поле, которое может встретиться в документе и указываете для них их тип (int, float, string, date) и прочие настройки для этого поля, зависящие от типа: формат для дат, точность для float'ов, analyzer для строк, и так далее.
    Ответ написан
  • Как сделать поиск в 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 выглядит интересно, но времени поставить и настроить ее все как-то нету.

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

    Реквестирую ссылку на конференцию.
    Ответ написан
  • Как построить запрос к 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": "мульт.*"
            }
        }
    }'
    Ответ написан
  • Чем принципиально отличается аналитика в 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 - не более, чем красивый интерфейс к результатам аггрегаций, от нее вообще ничего не зависит.
    Ответ написан
  • Как реализовать поиск адресов в ElasticSearch?

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

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

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

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

    MintTea
    @MintTea
    Я лично использовал Completion Suggester, который подходит, если вам заранее известны запросы, которые может искать пользователь. В моем случае это были названия населенных пунктов.

    Общая схема примерно такая. В зависимости от используемого вами фреймворка и php-клиента к эластику, код можете дописать самостоятельно. Также я опускаю детали о настройке русской морфологии, если она вам нужна, т.к. это еще более глобальный вопрос.

    1. Создаете отдельный индекс для suggester'а
    curl -XPUT http://localhost:9200/typeahead/

    2. Создаете отдельный тип в этом индексе и задаете ему корректный mapping
    curl -XPUT http://localhost:9200/typeahead/locality/_mapping -d '{
        "properties": {
            "suggest": {
                "type": "completion"
            }
        }
    }'


    3. Заполняете его вашими данными
    curl -XPOST http://localhost:9200/typeahead/locality/ -d '{
        "suggest": {
            "output": "Москва, Московская область, Россия",
            "input": ["Москва"]
        }
    }'
    curl -XPOST http://localhost:9200/typeahead/locality/ -d '{
        "suggest": {
            "output": "Новосибирск, Новосибирская область, Россия",
            "input": ["Новосибирск"]
        }
    }'


    4. Создаете контроллер в вашем приложении, который будет отвечать на ajax-запросы

    5. Внутри контроллера дергаете сервер elasticsearch'а
    curl -XGET http://localhost:9200/typeahead/_suggest -d '{
        "locality-suggest" : {
            "text" : "Новосиб",
            "completion" : {
                "field" : "suggest"
            }
        }
    }'


    6. На клиенте вешаете обработчик на событие ввода букв в input и дергаете ваш контроллер ajax'ом

    7. Полученный ответ рендерите как предложение ввода

    8. Профит
    Ответ написан
  • Как на продуктиве обновить ElasticSearch 1.3.* до 1.4.*?

    MintTea
    @MintTea
    Вы ведь внимательно прочли документацию, правда? Миграция с 1.3 на 1.4 не требует полного рестарта всего кластера и может быть выполнена нода за нодой. Их у вас всего три, так что можно проделать все вручную.

    Конечно, в случае, если ваше приложение использует какой-либо функционал, для которого сломана обратная совместимость, то сперва вам следует обновить код приложения, но и это вполне выполнимо.
    Ответ написан
  • Можно ли заставить работать elasticsearch на 512 RAM?

    MintTea
    @MintTea
    В общем и целом, можно. У меня есть подтвержденный пример одновременной работы трех инстансов (мне надо было именно три отдельных инстанса, да) в virtualbox'е с 1024 мб памяти, работало стабильно. Получалось где-то по 200мб на каждый инстанс.
    Естественно, с ростом размера индексов, этого не будет хватать, поэтому вам будет проще купить более мощный сервер.
    Ответ написан
  • Какие шаги переноса данных elasticsearch на сервер?

    MintTea
    @MintTea
    Я думаю, вы ошиблись где-то здесь:

    ...скопировал все файлы из "/var/lib/elasticsearch/" ... не хотелось бы через импорт-экспорт в файлы делать...


    Попробуйте использовать стандартный модуль, предназначенный для бэкапа/рестора данных.
    Либо эту утилиту, если нет времени настраивать стандартный функционал. Документация у нее исчерпывающая, но можете дать знать, если у вас возникнут трудности.
    Ответ написан
  • Как в mongoosastic сделать доп.поле проверки?