เริ่มต้นใช้งาน Elastic Search NodeJs Client

Dec 25 2022
ES: ข้อกำหนดเบื้องต้นของการค้นหาแบบยืดหยุ่น ในบทความก่อนหน้าของเราเกี่ยวกับการค้นหาแบบยืดหยุ่น เราได้เรียนรู้เกี่ยวกับพื้นฐานของการค้นหาแบบยืดหยุ่น วิธีการทำงาน และวิธีการสร้างดัชนีใหม่ ในบทความนี้ เราจะทำงานกับไคลเอ็นต์ NodeJS ของ Elastic Search ต่อไป และสำรวจวิธีการทำดัชนีเอกสารใหม่ อัปเดตเอกสารที่ทำดัชนีแล้วที่มีอยู่ และลบเอกสารที่ทำดัชนี

ES: การค้นหาแบบยืดหยุ่น

ข้อกำหนดเบื้องต้น

การค้นหาแบบยืดหยุ่นคืออะไร? การค้นหาแบบยืดหยุ่นทำงานอย่างไร สร้างดัชนีใหม่ด้วยการแมปและการตั้งค่าใน Elastic Search ไหม

ในบทความก่อนหน้าของเราเกี่ยวกับ Elastic Search เราได้เรียนรู้เกี่ยวกับพื้นฐานของ Elastic Search วิธีการทำงาน และวิธีสร้างดัชนีใหม่ ในบทความนี้ เราจะทำงานกับไคลเอ็นต์ NodeJS ของ Elastic Search ต่อไป และสำรวจวิธีการทำดัชนีเอกสารใหม่ อัปเดตเอกสารที่ทำดัชนีแล้วที่มีอยู่ และลบเอกสารที่ทำดัชนี เมื่อเข้าใจคุณลักษณะเหล่านี้แล้ว เราจะสามารถใช้ Elastic Search เพื่อจัดการและอัปเดตข้อมูลในโครงการของเราได้อย่างมีประสิทธิภาพมากขึ้น มาเริ่มกันเลยและดูว่าฟังก์ชันเหล่านี้ทำงานอย่างไร

ตัวอย่างด้านล่างทั้งหมดอ้างอิงจากไคลเอนต์ ES Node

การติดตั้ง

คุณสามารถใช้แพ็คเกจ npm Elastic Search ในแอปพลิเคชัน nodejs ของคุณ

npm install @elastic/elasticsearch

คลัสเตอร์ ES ของเราได้รับการกำหนดค่าโดยปิดใช้งานการรักษาความปลอดภัยอย่างชัดเจนนั่นคือเหตุผลที่เราสามารถเชื่อมต่อผ่าน HTTP

import { Client, errors } from '@elastic/elasticsearch';

const client = new Client({
  node: 'http://example.com'
});

ข้อมูลอ้างอิงอื่นๆ ที่เกี่ยวข้องกับ ES ทั้งหมดที่คุณจะได้รับที่นี่

ปิง

หากต้องการตรวจสอบว่าไคลเอนต์ ES เชื่อมต่อกับคลัสเตอร์ http ที่กำหนดไว้ ให้ดำเนินการ ping

client
  .ping({
    // ping usually has a 3000ms timeout
    requestTimeout: 1000,
  })
  .then(() => {
    this.logger.info('Elasticsearch connected');
  })
  .catch((err: errors.ConnectionError) => {
    this.logger.error('Elasticsearch unavailable', { error: err });
  });

async createIndex(indexName: string) {
  return this.client.indices.create({
    index: indexName,
    mappings: {},
    settings: {}
  });
};

ตรวจสอบว่ามีดัชนีอยู่หรือไม่

async indexExists(indexName: string) {
  return this.client.indices.exists({
    index: indexName,
  });
};

ก่อนเพิ่มเอกสารใดๆ ลงในดัชนี ขอแนะนำให้อัปเดตการตั้งค่าดัชนีและเพิ่มตัววิเคราะห์ที่จำเป็นตามฟังก์ชันการค้นหาของคุณ นี่คือตัวอย่างการตั้งค่าดัชนี:

async indexSetting(indexName: string) {
  return this.client.indices.putSettings({
    index: indexName,
    body: {
      settings: {
        max_ngram_diff: 19,
        analysis: {
          filter: {
            autocomplete_filter: {
              type: 'ngram',
              min_gram: '1',
              max_gram: '20',
            },
          },
          analyzer: {
            autocomplete: {
              filter: ['lowercase', 'autocomplete_filter'],
              type: 'custom',
              tokenizer: 'standard',
            },
          },
        },
        number_of_replicas: '1',
      },
    }
  });
};

เพิ่มการแมป

ก่อนเพิ่มเอกสารใดๆ ลงในดัชนี ขอแนะนำให้อัปเดตการตั้งค่าดัชนี จากนั้นอัปเดตการแมปดัชนีและกำหนดคุณสมบัติตัววิเคราะห์ด้วยฟิลด์ นี่คือตัวอย่างของการแมปดัชนี:

ขณะที่อัปเดตการตั้งค่า เราได้เพิ่มautocompleteตัววิเคราะห์ซึ่งเราสามารถกำหนดให้ในการแมปเป็นคุณสมบัติการค้นหาได้ การทำแผนที่ดัชนีอาจแตกต่างกันไปสำหรับดัชนีต่างๆ

const searchProperty = {
  type: 'text',
  analyzer: 'autocomplete',
  search_analyzer: 'standard',
};

async indexMapping(indexName: string) {
  return this.client.indices.putMapping({
    index: indexName,
    body: {
      properties: {
        id: { type: 'keyword' },
        createdAt: { type: 'date' },
        updatedAt: { type: 'date' },
        caseCode: searchProperty,
        policyNo: searchProperty,
        claimRegNo: searchProperty,
        vehicleRegNo: searchProperty,
        vehicleChassisNo: searchProperty,
        claimStatus: { type: 'keyword' },
        lossType: { type: 'keyword' },
        vehicleType: { type: 'keyword' },
        zone: { type: 'keyword' },
        insurer: { type: 'keyword' },
        caseStatus: { type: 'keyword' },
        business: { type: 'keyword' },
      },
    },
  });
};

เพิ่มเอกสาร

มีหลายวิธีในการเพิ่มเอกสารในดัชนี:

เอกสารฉบับเดียว

async addDocument(indexName: string, payload: DataType) {
  return this.client.index({
    index: indexName,
    type: '_doc',
    id: payload.id,
    body: payload
  });
};

async addBulkDocuments(indexName: data = []) {
  const payload = data.map((item) => {
    return [
      {
        index: {
          _index: indexName,
          _type: '_doc',
          _id: item.id,
        },
      },
      item,
    ]
  })
  return this.client.bulk({
    refresh: true,
    body: payload
  });
};

async updateDocument(indexName: string, payload: DataType) {
  return this.client.update({
    index: indexName,
    type: '_doc',
    id: payload.id,
    body: payload
  });
};

อัปเดตเอกสารเดี่ยว:อัปเดตเอกสารด้วยสคริปต์หรือเอกสารบางส่วน

client.update(...)

client.updateByQuery(...)

ลบเอกสารเดียว

async deleteDocument(indexName: string, id: string) {
  return this.client.delete({
    index: indexName,
    id,
  });
};

ลบเอกสารเดี่ยว:อัปเดตเอกสารด้วยสคริปต์หรือเอกสารบางส่วน

client.delete(...)

client.deleteByQuery(...)

ไคลเอ็นต์ JavaScript ของ Elasticsearch [8.5] ​​| ยืดหยุ่น

การอ้างอิง API | ไคลเอ็นต์ JavaScript ของ Elasticsearch [8.5] ​​| ยืดหยุ่น

ตัวอย่าง | ไคลเอ็นต์ JavaScript ของ Elasticsearch [8.5] ​​| ยืดหยุ่น

สร้างตัววิเคราะห์แบบกำหนดเอง | คู่มือการค้นหาแบบยืดหยุ่น [8.5] ​​| ยืดหยุ่น

การอ้างอิงตัววิเคราะห์ในตัว | คู่มือการค้นหาแบบยืดหยุ่น [8.5] ​​| ยืดหยุ่น

ชนิดข้อมูลฟิลด์ | คู่มือการค้นหาแบบยืดหยุ่น [8.5] ​​| ยืดหยุ่น

ฉันหวังว่าคุณจะสนุกกับการอ่านเกี่ยวกับ Elastic Search และวิธีการใช้เพื่อเพิ่มประสิทธิภาพการค้นหาและการวิเคราะห์ในแอปพลิเคชันต่างๆ หากคุณพบว่าบทความนี้มีประโยชน์หรือมีคำถามเพิ่มเติม โปรดอย่าลังเลที่จะติดต่อฉันผ่านทางความคิดเห็น

สำหรับการอัปเดตและข้อมูลเชิงลึกเพิ่มเติมเกี่ยวกับเทรนด์เทคโนโลยีล่าสุด โปรดติดตามฉันบนTwitterหรือLinkedIn ขอบคุณที่อ่าน และฉันหวังว่าจะได้ติดต่อกับคุณทางโซเชียลมีเดีย

ทวิตเตอร์ :https://twitter.com/geekfarmer_

ลิงค์ใน :https://www.linkedin.com/in/geekfarmer