Ответы пользователя по тегу Elasticsearch
  • 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"
                ]
            }
        }
    }'
    Ответ написан
    Комментировать
  • 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...
    Ответ написан
  • Как выбрать из 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": "мульт.*"
            }
        }
    }'
    Ответ написан
    Комментировать
  • Чем принципиально отличается аналитика в 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. Фиас это треш и угар. Мы *бались с ним полгода и в итоге выкинули, перейдя на собственную бд/модель местоположений
    Ответ написан
    Комментировать
  • Как на продуктиве обновить ElasticSearch 1.3.* до 1.4.*?

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

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

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

    MintTea
    @MintTea
    Покажите ulimit -a. И как вы сервер запускаете, сервисом/вручную/супервизором?
    Ответ написан
  • Какие шаги переноса данных elasticsearch на сервер?

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

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


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

    MintTea
    @MintTea
    Filtered query, Term filter

    Думаю, что так:
    Post.search(
        {
            filtered: {
                query: {
                    query_string: {
                        query: req.params.q
                    }
                },
                filter: {
                    term: {
                        access: true
                    }
                }
            }
        },
        {
          from: (curPage - 1) * perPage,
          size: perPage,
          sort: 'num:desc'
        },
        function(err, results) {
        }
    )


    Вы все-таки попробуйте прочесть доки по dsl эластика ;)
    Ответ написан
    Комментировать
  • Как искать данные данные в elasticsearch с полями from & size?

    MintTea
    @MintTea
    Если я правильно понимаю этот ваш nodejs, то судя по исходнику функции schema.statics.search, запрос должен выглядеть как-то так:
    Post.search(
        {query_string: {query: 'client'}},
        {from: 3, size: 3},
        function() { /* callback */ }
    );
    Ответ написан
    4 комментария
  • Есть ли аналог IN() в ElasticSearch для nested?

    MintTea
    @MintTea
    curl -XGET 'http://localhost:9200/index_name/product/_search?pretty' -d '{
        "filter": {
            "nested": {
                "path": "categories",
                "filter": {
                    "terms": {
                        "category_id": ["category_one", "category_two"]
                    }
                }
            }
        }
    }'
    Ответ написан
    Комментировать
  • Elasticsearch. . Как сделать поиск по полю, которое содержит дефис?

    MintTea
    @MintTea
    GDRP5MbKvBE.jpg

    Если вас интересует аналог такого запроса:
    SELECT * FROM index_name WHERE field_name='1111-2222-3333-4444'


    То необходимо сначала задать mapping для этого поля:
    curl -XPUT 'http://localhost:9200/index_name/type_name/_mapping' -d '
    {
        "properties" : {
            "field_name" : {"type": "string", "index": "not_analyzed"}
        }
    }
    '


    После чего записи можно найти, используя фильтр "term":
    curl -XGET 'http://localhost:9200/index_name/type_name/_search?pretty' -d '{
        "filter": {
            "term": {
                "field_name": "1111-2222-3333-4444"
            }
        }
    }'
    Ответ написан
    Комментировать