কম্পিউটার

রেলে ইলাস্টিকসার্চ সহ পূর্ণ-পাঠ্য অনুসন্ধান

ইলাস্টিক সার্চ সেখানকার সবচেয়ে জনপ্রিয় সার্চ ইঞ্জিনগুলির মধ্যে একটি। অনেক বড় কোম্পানির মধ্যে যারা এটি পছন্দ করে এবং সক্রিয়ভাবে তাদের উৎপাদনে এটি ব্যবহার করে, নেটফ্লিক্স, মিডিয়াম, গিটহাবের মতো জায়ান্ট রয়েছে৷

ইলাস্টিকসার্চ খুবই শক্তিশালী, প্রধান ব্যবহারের ক্ষেত্রে ফুল-টেক্সট সার্চ, রিয়েল-টাইম লগ এবং সিকিউরিটি অ্যানালাইসিস রয়েছে।

দুর্ভাগ্যবশত, ইলাস্টিকসার্চ রেল সম্প্রদায়ের কাছ থেকে খুব বেশি মনোযোগ পায় না, তাই এই নিবন্ধটি দুটি লক্ষ্য মাথায় রেখে এটি পরিবর্তন করার চেষ্টা করে:পাঠককে ইলাস্টিকসার্চ ধারণার সাথে পরিচয় করিয়ে দিন এবং এটিকে রুবি অন রেলের সাথে কীভাবে ব্যবহার করবেন তা দেখান।

আপনি একটি উদাহরণ প্রকল্পের উত্স কোড খুঁজে পেতে পারেন যা আমরা এখানে তৈরি করতে যাচ্ছি। প্রতিশ্রুতির ইতিহাস কমবেশি এই নিবন্ধের বিভাগগুলির ক্রম অনুসারে।

পরিচয়

একটি বিস্তৃত দৃষ্টিকোণ থেকে, ইলাস্টিকসার্চ হল একটি সার্চ ইঞ্জিন যা

  • অ্যাপাচি লুসিনের উপরে নির্মিত;
  • JSON নথিগুলি সঞ্চয় করে এবং কার্যকরভাবে সূচী করে;
  • ওপেন সোর্স;
  • এর সাথে ইন্টারঅ্যাক্ট করার জন্য REST API-এর একটি সেট প্রদান করে;
  • ডিফল্টভাবে কোন নিরাপত্তা নেই (যেকেউ এটি সর্বজনীন এন্ডপয়েন্টের মাধ্যমে জিজ্ঞাসা করতে পারে);
  • স্কেল অনুভূমিকভাবে বেশ ভাল।

আসুন কিছু মৌলিক ধারণার উপর দ্রুত নজর দেওয়া যাক।

ইলাস্টিকসার্চের সাহায্যে, আমরা নথিগুলিকে সূচকে রাখি, যেগুলি পরে ডেটার জন্য জিজ্ঞাসা করা হয়৷

একটি সূচক একটি রিলেশনাল ডাটাবেসের একটি টেবিলের অনুরূপ; এটি একটি দোকান যেখানে আমরা ডকুমেন্ট রাখি (সারি) যা পরে জিজ্ঞাসা করা যেতে পারে।

একটি নথি হল ক্ষেত্রগুলির একটি সংগ্রহ (একটি রিলেশনাল ডাটাবেসের একটি সারির অনুরূপ)।

একটি ম্যাপিং একটি রিলেশনাল ডাটাবেসের স্কিমা সংজ্ঞার মত। সন্নিবেশের সময় ইলাস্টিকসার্চ দ্বারা ম্যাপিং স্পষ্টভাবে সংজ্ঞায়িত বা অনুমান করা যেতে পারে; সূচী ম্যাপিং আগে থেকে সংজ্ঞায়িত করা সর্বদা ভাল।

এটিকে কভার করে, আসুন এখন আমাদের পরিবেশ সেট আপ করি।

ইলাস্টিক সার্চ ইনস্টল করা হচ্ছে

ম্যাকওএস-এ ইলাস্টিকসার্চ ইনস্টল করার সবচেয়ে সহজ উপায় হল ব্রু ব্যবহার করা:

brew tap elastic/tap
brew install elastic/tap/elasticsearch-full

একটি বিকল্প হিসাবে, আমরা ডকারের মাধ্যমে এটি চালাতে পারি:

docker run \
  -p 127.0.0.1:9200:9200 \
  -p 127.0.0.1:9300:9300 \
  -e "discovery.type=single-node" \
  docker.elastic.co/elasticsearch/elasticsearch:7.16.2

অন্যান্য বিকল্পের জন্য, অনুগ্রহ করে অফিসিয়াল রেফারেন্স দেখুন।

ইলাস্টিক সার্চ ডিফল্টরূপে পোর্ট 9200 এ অনুরোধ গ্রহণ করে। আপনি এটি একটি সাধারণ কার্ল অনুরোধের সাথে চলছে কিনা তা পরীক্ষা করতে পারেন (বা এটি একটি ব্রাউজারে খুলুন):

curl https://localhost:9200

APIs

ইলাস্টিকসার্চ প্রতিটি সম্ভাব্য ধরণের কাজের জন্য ইন্টারঅ্যাক্ট করার জন্য REST API-এর একটি সেট সরবরাহ করে। উদাহরণ স্বরূপ, ধরুন আমরা একটি নথি তৈরি করতে JSON বিষয়বস্তুর প্রকার সহ একটি POST অনুরোধ চালাই:

curl -X POST https://localhost:9200/my-index/_doc \
  -H 'Content-Type: application/json' \
  -d '{"title": "Banana Cake"}'

এই ক্ষেত্রে, my-index একটি সূচকের নাম (যদি এটি উপস্থিত না থাকে তবে এটি স্বয়ংক্রিয়ভাবে তৈরি হয়)।

_doc একটি সিস্টেম রুট (সমস্ত সিস্টেম রুট একটি আন্ডারস্কোর দিয়ে শুরু হয়)।

এপিআইগুলির সাথে আমরা কীভাবে ইন্টারঅ্যাক্ট করতে পারি তার একাধিক উপায় রয়েছে৷

  1. curl ব্যবহার করে কমান্ড-লাইন থেকে (আপনি jq সহজ খুঁজে পেতে পারেন)।
  2. JSON প্রিন্ট করার জন্য কিছু এক্সটেনশন ব্যবহার করে ব্রাউজার থেকে GET কোয়েরি চালানো হচ্ছে।
  3. কিবানা ইনস্টল করা এবং Dev Tools কনসোল ব্যবহার করা, যা আমার প্রিয় উপায়।
  4. অবশেষে কিছু দুর্দান্ত ক্রোম এক্সটেনশনও রয়েছে।

এই নিবন্ধটির জন্য, আপনি কোনটি বেছে নিচ্ছেন তা বিবেচ্য নয়—আমরা যাইহোক সরাসরি API-এর সাথে ইন্টারঅ্যাক্ট করতে যাচ্ছি না। পরিবর্তে, আমরা একটি রত্ন ব্যবহার করব, যা হুডের নীচে REST API-এর সাথে কথা বলে৷

একটি নতুন অ্যাপ শুরু করা হচ্ছে

ধারণাটি হল 26K+ গানের একটি পাবলিক ডেটাসেট ব্যবহার করে একটি গানের লিরিক্স অ্যাপ্লিকেশন তৈরি করা। প্রতিটি গানের একটি শিরোনাম, শিল্পী, ধারা এবং পাঠ্য লিরিক্স ক্ষেত্র রয়েছে। আমরা পূর্ণ-পাঠ্য অনুসন্ধানের জন্য ইলাস্টিকসার্চ ব্যবহার করব।

আসুন একটি সাধারণ রেল অ্যাপ্লিকেশন তৈরি করে শুরু করি:

rails new songs_api --api -d postgresql

যেহেতু আমরা এটি শুধুমাত্র API হিসাবে ব্যবহার করব, আমরা --api প্রদান করি ব্যবহৃত মিডলওয়্যার সেট সীমিত করতে পতাকা।

আসুন আমাদের অ্যাপটিকে ভারাক্রান্ত করি:

bin/rails generate scaffold Song title:string artist:string genre:string lyrics:text

এখন, মাইগ্রেশন চালাই এবং সার্ভার শুরু করি:

bin/rails db:create db:migrate
bin/rails server

এর পরে, আমরা যাচাই করি যে GET এন্ডপয়েন্ট কাজ করে:

curl https://localhost:3000/songs

এটি একটি খালি অ্যারে প্রদান করে, যা কোন আশ্চর্যের বিষয় নয় কারণ এখনও কোন ডেটা নেই৷

ইলাস্টিকসার্চ প্রবর্তন করা হচ্ছে

এর মিশ্রণে Elasticsearch যোগ করা যাক। এটি করার জন্য, আমাদের প্রয়োজন হবে ইলাস্টিক সার্চ-মডেল রত্ন। এটি একটি অফিসিয়াল ইলাস্টিকসার্চ রত্ন যা রেল মডেলের সাথে সুন্দরভাবে একত্রিত হয়৷

আপনার Gemfile-এ নিম্নলিখিত যোগ করুন :

gem 'elasticsearch-model'

ডিফল্টরূপে, এটি লোকালহোস্টে 9200 পোর্টের সাথে সংযুক্ত হবে, যা আমাদের জন্য পুরোপুরি উপযুক্ত, কিন্তু আপনি যদি এটি পরিবর্তন করতে চান, তাহলে আপনি ক্লায়েন্টকে শুরু করতে পারেন

Song.__elasticsearch__.client = Elasticsearch::Client.new host: 'myserver.com', port: 9876

এর পরে, ইলাস্টিকসার্চ দ্বারা আমাদের মডেলকে সূচীযোগ্য করতে, আমাদের দুটি জিনিস করতে হবে। প্রথমত, আমাদের একটি ম্যাপিং প্রস্তুত করতে হবে (যা মূলত আমাদের ডেটা স্ট্রাকচার সম্পর্কে ইলাস্টিকসার্চকে বলে), এবং দ্বিতীয়ত, আমাদের একটি অনুসন্ধান অনুরোধ তৈরি করা উচিত। আমাদের রত্ন উভয়ই করতে পারে, তাই আসুন এটি কীভাবে ব্যবহার করবেন তা দেখা যাক৷

Elastisearch-সম্পর্কিত কোডকে একটি পৃথক মডিউলে রাখা সবসময়ই ভালো ধারণা, তাই আসুন app/models/concerns/searchable.rb-এ একটি উদ্বেগ তৈরি করি। এবং যোগ করুন

# app/models/concerns/searchable.rb

module Searchable
  extend ActiveSupport::Concern

  included do
    include Elasticsearch::Model
    include Elasticsearch::Model::Callbacks

    mapping do
      # mapping definition goes here
    end

    def self.search(query)
      # build and run search
    end
  end
end

যদিও এটি কেবল একটি কঙ্কাল, এখানে আনপ্যাক করার মতো কিছু আছে৷

প্রথম এবং সবচেয়ে গুরুত্বপূর্ণ বিষয় হল Elasticsearch::Model , যা ES এর সাথে ইন্টারঅ্যাক্ট করার জন্য কিছু কার্যকারিতা যোগ করে। Elasticsearch::Model::Callbacks মডিউল নিশ্চিত করে যে যখন আমরা একটি রেকর্ড আপডেট করি, এটি স্বয়ংক্রিয়ভাবে ইলাস্টিকসার্চে ডেটা আপডেট করে। ম্যাপিং ব্লক হল যেখানে আমরা ইলাস্টিকসার্চ ইনডেক্স ম্যাপিং রাখি, যা নির্ধারণ করে ইলাস্টিকসার্চে কোন ক্ষেত্রগুলি সংরক্ষণ করা হবে এবং তাদের কী ধরনের থাকা উচিত। অবশেষে, একটি অনুসন্ধান আছে যে পদ্ধতিটি আমরা আসলে গানের লিরিক্সের জন্য Elasticsearch অনুসন্ধান করতে ব্যবহার করব। আমরা যে রত্নটি ব্যবহার করছি সেটি একটি অনুসন্ধান প্রদান করে পদ্ধতি যা একটি সহজ প্রশ্নের সাথে ব্যবহার করা যেতে পারে যেমন Song.search("genesis") , কিন্তু আমরা এটিকে ডিএসএল ক্যোয়ারী ব্যবহার করে তৈরি করা আরও জটিল অনুসন্ধান ক্যোয়ারী দিয়ে ব্যবহার করব (পরে আরও বিস্তারিত)।

আসুন আমাদের মডেল ক্লাসে উদ্বেগ অন্তর্ভুক্ত করতে ভুলবেন না:

# /app/models/song.rb

class Song < ApplicationRecord
  include Searchable
end

ম্যাপিং

ইলাস্টিকসার্চে, ম্যাপিং একটি রিলেশনাল ডাটাবেসের স্কিমার সংজ্ঞার মতো। আমরা নথিগুলির গঠন বর্ণনা করি যা আমরা সংরক্ষণ করতে চাই। একটি সাধারণ রিলেশনাল ডাটাবেসের বিপরীতে, আমাদের ম্যাপিংকে আগেভাগে সংজ্ঞায়িত করতে হবে না:ইলাস্টিকসার্চ আমাদের জন্য ধরণ অনুমান করার জন্য যথাসাধ্য চেষ্টা করবে। তবুও, যেহেতু আমরা কোনো চমক চাই না, আমরা আমাদের ম্যাপিং আগে থেকেই স্পষ্টভাবে সংজ্ঞায়িত করব৷

PUT /my-index/_mapping ব্যবহার করে REST এন্ডপয়েন্টের মাধ্যমে ম্যাপিং আপডেট করা যেতে পারে এবং GET /my-index/_mapping এর মাধ্যমে পড়ুন , কিন্তু ইলাস্টিক সার্চ রত্ন আমাদের জন্য বিমূর্ত করে, তাই আমাদের যা করতে হবে তা হল ম্যাপিং প্রদান করা ব্লক:

# app/models/concerns/searchable.rb

mapping do
  indexes :artist, type: :text
  indexes :title, type: :text
  indexes :lyrics, type: :text
  indexes :genre, type: :keyword
end

আমরা শিল্পী সূচী করতে যাচ্ছি , শিরোনাম , এবং লিরিক টেক্সট টাইপ ব্যবহার করে ক্ষেত্র। এটি একমাত্র টাইপ যা একটি পূর্ণ-পাঠ্য অনুসন্ধানের জন্য সূচিত করা হয়। জেনার এর জন্য , আমরা কীওয়ার্ড টাইপ ব্যবহার করব, যা সঠিক মান দ্বারা ফিল্টার করা একটি আদর্শ অনুসন্ধান।

এখন bin/rails console দিয়ে রেল কনসোল চালান এবং তারপর চালান

Song.__elasticsearch__.create_index!

এটি ইলাস্টিকসার্চে আমাদের সূচক তৈরি করবে। __elasticsearch__ অবজেক্ট হল আমাদের ইলাস্টিকসার্চ জগতের প্রবেশদ্বার, ইলাস্টিকসার্চের সাথে ইন্টারঅ্যাক্ট করার জন্য অনেক দরকারী পদ্ধতিতে পরিপূর্ণ৷

ডেটা আমদানি করা

প্রতিবার যখন আমরা একটি রেকর্ড তৈরি করি, এটি স্বয়ংক্রিয়ভাবে ইলাস্টিকসার্চে ডেটা পাঠাবে। সুতরাং, আমরা গানের লিরিক্স সহ একটি ডেটাসেট ডাউনলোড করতে যাচ্ছি এবং এটি আমাদের অ্যাপে আমদানি করতে যাচ্ছি। প্রথমে, এই লিঙ্ক থেকে এটি ডাউনলোড করুন (Creative Commons Attribution 4.0 International লাইসেন্স এর অধীনে একটি ডেটাসেট ) এই CSV ফাইলটিতে 26,000 টিরও বেশি রেকর্ড রয়েছে, যা আমরা নীচের কোড সহ আমাদের ডাটাবেস এবং ইলাস্টিকসার্চে আমদানি করব:

require 'csv'

class Song < ApplicationRecord
  include Searchable

  def self.import_csv!
    filepath = "/path/to/your/file/tcc_ceds_music.csv"
    res = CSV.parse(File.read(filepath), headers: true)
    res.each_with_index do |s, ind|
      Song.create!(
        artist: s["artist_name"],
        title: s["track_name"],
        genre: s["genre"],
        lyrics: s["lyrics"]
      )
    end
  end
end

রেল কনসোল খুলুন এবং Song.import_csv! চালান (এই কিছু সময় লাগতে পারে). বিকল্পভাবে, আমরা প্রচুর পরিমাণে আমাদের ডেটা আমদানি করতে পারি, যা অনেক দ্রুত, কিন্তু এই ক্ষেত্রে, আমরা নিশ্চিত করতে চাই যে আমরা আমাদের PostgreSQL ডাটাবেস এবং ইলাস্টিকসার্চে রেকর্ড তৈরি করি।

যখন আমদানি শেষ হয়, তখন আমাদের কাছে এখন প্রচুর গান রয়েছে যা আমরা অনুসন্ধান করতে পারি৷

ডেটা অনুসন্ধান করা

ইলাস্টিক সার্চ-মডেল রত্ন একটি অনুসন্ধান যোগ করে পদ্ধতি যা আমাদের সমস্ত সূচীকৃত ক্ষেত্রের মধ্যে অনুসন্ধান করতে দেয়। আমাদের অনুসন্ধানযোগ্য উদ্বেগের ক্ষেত্রে এটি ব্যবহার করা যাক:

# app/models/concerns/searchable.rb

# ...
def self.search(query)
  self.__elasticsearch__.search(query)
end
# ...

রেল কনসোল খুলুন এবং res =Song.search('genesis') চালান . প্রতিক্রিয়া অবজেক্টে অনেক মেটা তথ্য রয়েছে:অনুরোধটি কত সময় নিয়েছে, কোন নোড ব্যবহার করা হয়েছে ইত্যাদি। আমরা হিটগুলিতে আগ্রহী, res.response["hits"]["hits"] .

আসুন আমাদের কন্ট্রোলারের সূচী পরিবর্তন করি পরিবর্তে ES জিজ্ঞাসা করার পদ্ধতি।

# app/controllers/songs_controller.rb

def index
  query = params["query"] || ""
  res = Song.search(query)
  render json: res.response["hits"]["hits"]
end

এখন আমরা এটি একটি ব্রাউজারে লোড করার চেষ্টা করতে পারি বা কার্ল ব্যবহার করে দেখতে পারি https://localhost:3000/songs?query=genesis . প্রতিক্রিয়া এই মত দেখাবে:


[
  {
  "_index": "songs",
  "_type": "_doc",
  "_id": "22676",
  "_score": 12.540506,
  "_source": {
    "id": 22676,
    "title": "genesis",
    "artist": "grimes",
    "genre": "pop",
    "lyrics": "heart know heart ...",
    "created_at": "...",
    "updated_at": "..."
    }
  },
...
]

আপনি দেখতে পাচ্ছেন, প্রকৃত ডেটা _source-এর অধীনে ফেরত দেওয়া হয় কী, অন্যান্য ক্ষেত্রগুলি হল মেটাডেটা, যার মধ্যে সবচেয়ে গুরুত্বপূর্ণ হল _score নথিটি নির্দিষ্ট অনুসন্ধানের জন্য কীভাবে প্রাসঙ্গিক তা দেখাচ্ছে। আমরা শীঘ্রই এটিতে পৌঁছাব, তবে প্রথমে আসুন কীভাবে প্রশ্ন করতে হয় তা শিখি।

কোয়েরি DSL

ইলাস্টিকসার্চ ক্যোয়ারী ডিএসএল জটিল ক্যোয়ারী তৈরির একটি উপায় প্রদান করে এবং আমরা রুবি কোড থেকেও এটি ব্যবহার করতে পারি। উদাহরণস্বরূপ, শুধুমাত্র শিল্পী ক্ষেত্র অনুসন্ধান করতে অনুসন্ধান পদ্ধতি পরিবর্তন করা যাক:

# app/models/concerns/searchable.rb

module Searchable
  extend ActiveSupport::Concern

  included do
    # ...

    def self.search(query)
      params = {
        query: {
          match: {
            artist: query,
          },
        },
      }

      self.__elasticsearch__.search(params)
    end
  end
end

ক্যোয়ারী-ম্যাচ কনস্ট্রাক্ট আমাদের শুধুমাত্র একটি নির্দিষ্ট ক্ষেত্র অনুসন্ধান করতে দেয় (এই ক্ষেত্রে, শিল্পী)। এখন, যদি আমরা আবার "জেনেসিস" দিয়ে গানগুলি জিজ্ঞাসা করি ( https://localhost:3000/songs?query=genesis লোড করে এটি চেষ্টা করে দেখুন ), আমরা শুধুমাত্র "জেনেসিস" ব্যান্ডের গানগুলি পাব, এবং তাদের শিরোনামে "জেনেসিস" আছে এমন গানগুলি নয়৷ যদি আমরা একাধিক ক্ষেত্র অনুসন্ধান করতে চাই, যা প্রায়শই হয়, আমরা একটি মাল্টি-ম্যাচ ক্যোয়ারী ব্যবহার করতে পারি:

# app/models/concerns/searchable.rb

def self.search(query)
  params = {
    query: {
      multi_match: {
        query: query, 
        fields: [ :title, :artist, :lyrics ] 
      },
    },
  }

  self.__elasticsearch__.search(params)
end

ফিল্টারিং

আমরা যদি রক গানের মধ্যে কেবল অনুসন্ধান করতে চাই, তাহলে কী হবে? তারপর, আমাদের রীতি অনুসারে ফিল্টার করতে হবে! এটি আমাদের অনুসন্ধানকে আরও জটিল করে তুলবে, কিন্তু চিন্তা করবেন না—আমরা ধাপে ধাপে সবকিছু ব্যাখ্যা করব!

  def self.search(query, genre = nil)
    params = {
      query: {
        bool: {
          must: [
            {
              multi_match: {
                query: query, 
                fields: [ :title, :artist, :lyrics ] 
              }
            },
          ],
          filter: [
            {
              term: { genre: genre }
            }
          ]
        }
      }
    }

    self.__elasticsearch__.search(params)
  end

প্রথম নতুন কীওয়ার্ড হল bool, যা একাধিক প্রশ্ন একত্রিত করার একটি উপায় মাত্র। আমাদের ক্ষেত্রে, আমরা must একত্রিত করছি এবং ফিল্টার . প্রথমটি (অবশ্যই ) স্কোরে অবদান রাখে এবং একই প্রশ্ন রয়েছে যা আমরা আগে ব্যবহার করেছি। দ্বিতীয়টি (ফিল্টার ) স্কোরে অবদান রাখে না, এটি যা বলে তা করে:ক্যোয়ারির সাথে মেলে না এমন নথিগুলিকে ফিল্টার করে। আমরা জেনার অনুসারে আমাদের রেকর্ডগুলি ফিল্টার করতে চাই, তাই আমরা ক্যোয়ারী শব্দটি ব্যবহার করি৷

এটা মনে রাখা গুরুত্বপূর্ণ যে ফিল্টার-টার্ম পূর্ণ-পাঠ্য অনুসন্ধানের সাথে সমন্বয়ের কোন সম্পর্ক নেই। এটি সঠিক মানের দ্বারা একটি নিয়মিত ফিল্টার, যেভাবে WHERE ধারা SQL-এ কাজ করে (WHERE genre ='rock' ) টার্ম কিভাবে ব্যবহার করতে হয় তা জেনে রাখা ভালো ফিল্টারিং, কিন্তু আমাদের এখানে এটির প্রয়োজন হবে না।

স্কোরিং

অনুসন্ধানের ফলাফলগুলি _score অনুসারে সাজানো হয়েছে এটি দেখায় কিভাবে একটি আইটেম একটি নির্দিষ্ট অনুসন্ধানের জন্য প্রাসঙ্গিক। স্কোর যত বেশি, নথিটি তত বেশি প্রাসঙ্গিক। আপনি সম্ভবত লক্ষ্য করেছেন যে আমরা যখন জেনেসিস শব্দটি অনুসন্ধান করেছি , পপ আপ যে প্রথম ফলাফল ছিল Grimes দ্বারা গান, আমি আসলে জেনেসিস ব্যান্ড আরো আগ্রহী ছিল. সুতরাং, আমরা কি শিল্পী ক্ষেত্রে আরও মনোযোগ দিতে স্কোরিং প্রক্রিয়া পরিবর্তন করতে পারি? হ্যাঁ আমরা পারি, কিন্তু এটি করার জন্য, আমাদের প্রথমে আমাদের প্রশ্নটি পরিবর্তন করতে হবে:

  def self.search(query)
    params = {
      query: {
        bool: {
          should: [
            { match: { title: query }},
            { match: { artist: query }},
            { match: { lyrics: query }},
          ],
        }
      },
    }

    self.__elasticsearch__.search(params)
  end

এই ক্যোয়ারীটি মূলত প্রাক্তনটির সমতুল্য, এটি বুল কীওয়ার্ড ব্যবহার করছে, যা একাধিক প্রশ্ন একত্রিত করার একটি উপায়। আমরা উচিত ব্যবহার করি , যাতে তিনটি প্রশ্ন আলাদাভাবে থাকে (প্রতি ক্ষেত্রে একটি):এগুলি মূলত লজিক্যাল OR ব্যবহার করে একত্রিত করা হয়। যদি আমরা অবশ্যই ব্যবহার করি পরিবর্তে, তারা যৌক্তিক AND ব্যবহার করে একত্রিত হবে। কেন আমাদের মাঠে প্রতি আলাদা ম্যাচ দরকার? কারণ এখন আমরা বুস্ট প্রপার্টি নির্দিষ্ট করতে পারি, যা একটি সহগ যা নির্দিষ্ট ক্যোয়ারী থেকে স্কোরকে গুণ করে:

  def self.search(query)
    params = {
      query: {
        bool: {
          should: [
            { match: { title: query }},
            { match: { artist: { query: query, boost: 5 } }},
            { match: { lyrics: query }},
          ],
        }
      },
    }

    self.__elasticsearch__.search(params)
  end

অন্যান্য জিনিস সমান, আমাদের স্কোর পাঁচ গুণ বেশি হবে যদি ক্যোয়ারীটি শিল্পীর সাথে মেলে। জেনেসিস চেষ্টা করুন https://localhost:3000/songs?query=genesis দিয়ে আবার প্রশ্ন করুন , এবং আপনি জেনেসিস ব্যান্ডের গান প্রথম আসছে দেখতে পাবেন। মিষ্টি!

হাইলাইটিং

ইলাস্টিকসার্চ-এর আরেকটি সহায়ক বৈশিষ্ট্য হল নথির মধ্যে মিল হাইলাইট করতে সক্ষম হচ্ছে, যা ব্যবহারকারীকে আরও ভালভাবে বুঝতে সাহায্য করে যে কেন একটি নির্দিষ্ট ফলাফল অনুসন্ধানে উপস্থিত হয়েছে।

HTML-এ, এটির জন্য একটি বিশেষ HTML ট্যাগ আছে, এবং Elasticsearch স্বয়ংক্রিয়ভাবে এটি যোগ করতে পারে।

চলুন searchable.rb খুলি আবার উদ্বেগ এবং একটি নতুন কীওয়ার্ড যোগ করুন:

def self.search(query)
  params = {
    query: {
      bool: {
        should: [
          { match: { title: query }},
          { match: { artist: { query: query, boost: 5 } }},
          { match: { lyrics: query }},
        ],
      }
    },
    highlight: { fields: { title: {}, artist: {}, lyrics: {} } }
  }

  self.__elasticsearch__.search(params)
end

নতুন হাইলাইট ক্ষেত্র নির্দিষ্ট করে যে কোন ক্ষেত্রগুলি হাইলাইট করা উচিত। আমরা তাদের সব নির্বাচন. এখন, যদি আমরা https://localhost:3000/query=genesis লোড করি , আমরা "হাইলাইট" নামে একটি নতুন ক্ষেত্র দেখতে পাব যাতে em এ মোড়ানো মিলিত বাক্যাংশ সহ নথির ক্ষেত্র রয়েছে ট্যাগ।

হাইলাইট করার বিষয়ে আরও জানতে, অনুগ্রহ করে অফিসিয়াল গাইড পড়ুন।

অস্পষ্টতা

ঠিক আছে, আমরা যদি ভুল করে benesis লিখে থাকি জেনেসিস এর পরিবর্তে ? এটি কোনো ফলাফল দেবে না, তবে আমরা ইলাস্টিকসার্চকে কম পিকি হতে এবং অস্পষ্ট অনুসন্ধানের অনুমতি দিতে পারি, তাই এটি জেনেসিস প্রদর্শন করবে পাশাপাশি ফলাফল।

এখানে এটা কিভাবে করা হয়. শুধু { match:{ artist:{ query:query, boost:5 } } } থেকে শিল্পী ক্যোয়ারী পরিবর্তন করুন থেকে { ম্যাচ:{ শিল্পী:{ প্রশ্ন:প্রশ্ন, বুস্ট:5, অস্পষ্টতা:"অটো" } } } . সঠিক অস্পষ্টতা মেকানিক্স কনফিগার করা যেতে পারে. আরো বিস্তারিত জানার জন্য অনুগ্রহ করে অফিসিয়াল ডক্স দেখুন।

পরবর্তী কোথায়?

আমি আশা করি এই নিবন্ধটি আপনাকে নিশ্চিত করেছে যে ইলাস্টিকসার্চ একটি শক্তিশালী টুল যা আপনাকে যখন একটি অ-তুচ্ছ অনুসন্ধান বাস্তবায়ন করতে হবে তখন ব্যবহার করা যেতে পারে এবং করা উচিত। আপনি যদি আরও জানতে প্রস্তুত হন, এখানে কিছু সহায়ক লিঙ্ক রয়েছে:

সম্পদ

  • অফিসিয়াল ইলাস্টিক সার্চ রেফারেন্স
  • রুবি রত্ন
  • রেল রত্ন
  • ব্যবহারিক জ্ঞানে ভরা একটি খুব সুন্দর বই
  • বিল্ডিং স্বয়ংসম্পূর্ণ

বিকল্প রত্ন

  • সার্চকিক
  • চিউই

  1. স্ট্রাইপ সহ রেলগুলিতে কীভাবে এককালীন ক্রয় বিক্রি করবেন

  2. রেলের সাথে হটওয়্যার ব্যবহার করা

  3. রেলের সাথে Tailwind CSS ব্যবহার করা

  4. রেলের সাথে কৌণিক ব্যবহার 5