От установки до начала работы: краткое руководство по ElasticSearch

Node.js задняя часть база данных Elasticsearch
От установки до начала работы: краткое руководство по ElasticSearch

Официальный сайт ElasticSearch:

woohoo.elastic.co/expensive/en/bad…


Установить

ElasticнеобходимостьJava 8окрестности. Пожалуйста, обратитесь кэта статьяЧтобы установить Java, вы можете решить проблему настройки среды!

установленJava 8После этого введите следующую команду в терминал для загрузкиElasticпочтовый индекс (Пожалуйста, измените номер версии самостоятельно).

$ wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.5.1.zip
$ unzip elasticsearch-5.5.1.zip
$ cd elasticsearch-5.5.1/

запускать

во всех приготовлениях(JavaПосле завершения установки введитеElasticВ корневом каталоге файла введите следующую команду для запускаElastic.

$ ./bin/elasticsearch

После завершения запуска откройте браузер и введите в адресную строкуlocalhost:9200, если появится сообщение, похожее на следующее, запуск выполнен успешно.

{
  "name" : "atntrTf",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "tf9250XhQ6ee4h7YI11anA",
  "version" : {
    "number" : "5.5.1",
    "build_hash" : "19c13d0",
    "build_date" : "2017-07-18T20:44:24.823Z",
    "build_snapshot" : false,
    "lucene_version" : "6.6.0"
  },
  "tagline" : "You Know, for Search"
}

P.S. рекомендую одинAPIинструмент запросаPostMan, который может заменить браузеры и терминалы для запускаAPIзапрос и может выполнять операции с возвращенными даннымиJSONПреобразование формата, интуитивно понятный и лаконичный.

Базовые концепты

Node (узел) и Cluster (кластер)

ElasticПо сути, это распределенная база данных, которая позволяет нескольким серверам работать вместе, в то время как каждый сервер может запускать несколькоElasticпример. каждыйElasticЭкземпляр называется узлом, а группа узлов называется кластером.


Показатель

ElasticсерединаIndex(индекс) эквивалентен реляционной базе данныхdataBase(база данных), конечно, можно понимать и какtable(поверхность). каждыйIndexИмя должно быть в нижнем регистре. Следующая команда может просмотреть текущийElasticвсе под экземплярIndex, в том числе каждыйIndexразмер документа и т.д.

$ curl -X GET 'http://localhost:9200/_cat/indices?v'

Конечно, вы также можете использовать вышеупомянутыеPostManВведите адрес маршрутизации в приведенной выше команде для просмотра.


Документ

IndexКаждая запись данных в называетсяDocument(документация). много строкDocumentпредставляет собойIndex. такIndexЕго можно рассматривать как стол, когда он маленький.DocumentСтруктура данных вJSONформат указан.

{
  "auth": "Assassin",
  "work": "NodeJS全栈",
  "email": "告诉你才怪@qq.com",
}

Тип (категория)

IndexЕсли это рассматривается как база данных, тоTypeЕго можно рассматривать как таблицу этой базы данных. Обратите внимание, что то же самоеIndexвнизTypeдолжна иметь аналогичную структуру (schema), что отличается от реляционных баз данных. Следующая команда выводит список текущихIndexвсе подType.

$ curl 'localhost:9200/_mapping?pretty=true'

Еще одно слово,ESСравнение с различными элементами реляционных баз данных:

Relational DB Database Table Row Colum
ElasticSearch Index Type Document Field

Типы данных в Elastic

Здесь перечислены только часто используемые типы данных, а остальные будут обсуждаться позже.

  1. String: Тип строки, который будет сегментирован по умолчанию. который включаетkeywordиtextдва подтипа.

    ключевое слово: при хранении данные не будут индексироваться с помощью сегментации слов и могут использоваться для извлечения, фильтрации, сортировки и агрегирования. Например: «Стальная конструкция стены»,keywordвозьму в целом.

    текст: при сохранении данных данные будут проиндексированы по словесной сегментации, но если данные в этом поле не нуждаются в словесной сегментации, используйтеtextбудет тратить место для хранения.textТипы данных нельзя использовать для сортировки и агрегирования. Например: «Стальная конструкция стены»,textОн будет разделен на «стену», «стальную конструкцию».

    Токенизатор: только дляtextтип.gitадресGitHub.com/many out/E последний…. Его функция заключается в сегментации текста по определенным правилам. Способ установки: Разархивируйте загруженный плагин сегментации слов в корневой каталог.plugins, затем перезапуститеElasticпример.

  2. Тип номера:

    • long: длинное целое, 64-битное хранилище
    • целое число: целое число, 32-битное хранилище
    • short: короткое целое, 16-битное хранилище
    • байт: тип байта, 8-битное хранилище
    • double: двойная точность, 64-битное хранилище
    • float: тип одинарной точности, 32-битное хранилище
  3. другие простые типы

    • дата: тип времени
    • boolean: логический тип
    • двоичный: байтовый тип
  4. составной тип

    • массив: тип массива
    • объект: тип объекта json
    • Array[Object]: вложенный тип массива объектов

Создание отображения индекса

IndexСоздание включений для каждой таблицыTypeОпределение. существуетJavaScriptи метод создания в терминале выглядит следующим образом:

  • JavaScript
import elasticsearch from 'elasticsearch';
const esClient = new elasticsearch.Client({
  host: 'localhost:9200',
  log: 'error',
});
const settings = {
  number_of_shards: 5,
  number_of_replicas: 1,
};
const PromiseList = [
  esClient.indices.create({
    index: 'student',
    body: {
      settings, // index的一些设置
      mappings: {
        // type
        person: {
          // type 的各个字段
          properties: {
            sno: {
              type: 'long',
            },
            name: {
              type: 'keyword',
            },
            sex: {
              type: 'keyword',
            },
            class: {
              type: 'text',
              analyzer: 'ik_max_word',
              search_analyzer: 'ik_max_word',
              fields: {
                raw: {
                  type: 'keyword',
                  ignore_above: 128,
                },
              },
            },
            register: {
              type: 'date',
            },
          },
        },
        .....
      },
    },
  }),
  .....
];
PromiseList.map(p => p.catch(e => console.log(e.message)));
.....

В приведенном выше коде с помощьюPromisesДля пакетного создания баз данных, если вы создаете только одну библиотеку, вы можете использоватьasync await.

  • Терминал
$ curl -X PUT -H 'Content-Type: application/json' 'localhost:9200/student' -d '
{
  mappings: {
    // type
    person: {
    // type 的各个字段
      properties: {
        sno: {
          type: 'long',
        },
        name: {
          type: 'keyword',
        },
        sex: {
          type: 'keyword',
        },
        class: {
          type: 'text',
          analyzer: 'ik_max_word',
          search_analyzer: 'ik_max_word',
          fields: {
            raw: {
              type: 'keyword',
              ignore_above: 128,
            },
          },
        },
        register: {
          type: 'date',
        },
      },
    },
  },
}'

В приведенном выше коде файл с именемstudentизIndex, в том числеpersonТаблица содержит четыре поля:son,name,sex,register.

Удаление индекса

После разговора о создании пришло время удалить его. Удалить легко:

  • JavaScript
import elasticsearch from 'elasticsearch';
const esClient = new elasticsearch.Client({
  host: 'localhost:9200',
  log: 'error',
});
Promise.all(
  [
    'student',
    .....
  ].map(index =>
    esClient.indices
      .delete({ index })
      .catch(() => console.error(`delete fail: ${index}`))
  )
);

В приведенном выше коде с помощьюPromisesЧтобы удалить базы данных в пакетах, если вы удаляете только одну базу данных, вы можете использоватьasync await.

  • Терминал
$ curl -X DELETE 'localhost:9200/student'

Эластичный запрос данных

ElasticЧасто используемые методы запросов в

поиск, получение, подсчет, mget, msearch и т. д.

конфигурационный файл

import elasticSearch from 'elasticsearch';


let _client = null;

export default () => {
  if (!_client) {
    _client = new elasticSearch.Client('localhost:9200');
  }
  return _client;
};

Условный запрос для одной записи

Структура запроса условного запроса для одноручных записей аналогичнаJSONОбъект

{
  index: database_name,
  type: table_name,
  body: {
    query: {
      bool: {
        filter: {
          term: {
            'field_name': value,
          },
        },
      },
    },
  },
}

Это простейшая структура запроса

средиfilterСтоимость свойстваObject | Array, вArrayпредставляет собой массив объектов. как[{term: {key: value}}, ...].

Конечно, запрос не может быть таким простым, есть и другие свойства, которые можно добавить.

запрос фильтра терминов и терминов (запрос соответствия)

termВ основном используется для точного соответствия значениям, таким как числа, даты, логические значения. ОдинtermСтруктура запроса:

{ term: { key: value } }

похожий наtermsВ основном используется для фильтрации запросов, соответствующих нескольким условиям. Например

{ terms: 'tag': [ 'react', 'vue', 'angular' ] }

запрос фильтра диапазона (запрос диапазона)

rangeФильтрация позволяет найти пакет данных по заданному диапазону

{
  range: {
    age: {
      gte: 18,
      lt: 28,
    }
  }
}

Ключевые слова с ограниченной областью действия:

  • gt: больше, чем

  • gte: больше или равно

  • л: меньше чем

  • lte: меньше или равно

Отражено в структуре запроса:

{
  index: database_name,
  type: table_name,
  body: {
    query: {
      range: {
        age: {
          gte: 18,
          lt: 28,
        }
      }
  },
}

rangeиterm(s)Он принадлежит к тому же уровню атрибутов, поэтому его можно использовать какfilterзначение свойства массива

существует и отсутствует фильтр

exists & missingИспользуется для определения того, существует или нет указанное поле в записи.

{
  exists: {
    field: 'field_value'
  }
}

exists & missingиterm(s)Он принадлежит к тому же уровню атрибутов, поэтому его можно использовать какfilterзначение свойства массива

логический фильтр

boolБулев логический запрос, включая ключевые слова:

  • должен: эквивалентно и

  • must_not: эквивалентно not

  • следует: эквивалентно или

Использование простое, просто заменитеfilter, конечно, сfilterТо же использование.

совокупный запрос

Для этой части будут некоторые различия в понимании языкового описания. В конце концов, агрегация все еще относительно велика, поэтому я бы порекомендовал Du Niang, чтобы быть более профессиональным (я сделаю резюме, когда немного подрасту!!)

ES-аггс

Пакетный условный запрос

Пакетный условный запрос — это процесс запроса, который последовательно обрабатывает набор различных наборов условий запроса, как и пакетный процесс.

пакетный условный запрос msearch

msearchОн заключается в том, чтобы поместить структуру общего условного запроса в массив, а затем использовать массив в качестве структуры запроса.

{
  body: [
    { index: database_1, type: table_1 },
    {
      query: {
        term: { field: value },
      },
    },
    { index: database_2, type: table_2 },
    {
      query: {
        bool: {
          must: {
            term: {
              field: value,
            },
          },
          filter: [
            { term: { field: value } },
            { term: { field: value } },
          ],
        },
      },
    },
}

Как видно из приведенной выше структуры,msearchСтруктура запроса представляет собой структуру массива, начинающуюся с нижнего индекса 0, с двумя соседними элементами в виде единой структуры запроса.

Запрос идентификатора пакета mget

Этот метод подходит для пакетных запросов, когда известно несколько идентификаторов записей.

{
  index: database,
  type: table,
  body: {
    ids,
  },
}

вidsпредставляет собой массив.


Искусство /Убийца это я

Добро пожаловать, чтобы следовать за автором~

редактировать /флуоресценция

Эта статья была опубликована с разрешения автора, и авторские права принадлежат автору.

Если вы хотите подписаться на другие сообщения с передовой линии KnownsecFED, выполните поиск и подпишитесь на нашу общедоступную учетную запись WeChat: KnownsecFED. Добро пожаловать, чтобы оставить сообщение для обсуждения, мы ответим как можно скорее.

Спасибо за чтение.