ইলাস্টিক অনুসন্ধান সহ কোনও শব্দের একটি অংশ কীভাবে অনুসন্ধান করবেন search


128

আমি সম্প্রতি ইলাস্টিক অনুসন্ধান ব্যবহার করা শুরু করেছি এবং আমি এটি কোনও শব্দের একটি অংশ অনুসন্ধান করে বলে মনে করতে পারি না।

উদাহরণ: আমার কোচডিডিবি থেকে ইলাস্টিক অনুসন্ধানে সূচিযুক্ত তিনটি নথি রয়েছে:

{
  "_id" : "1",
  "name" : "John Doeman",
  "function" : "Janitor"
}
{
  "_id" : "2",
  "name" : "Jane Doewoman",
  "function" : "Teacher"
}
{
  "_id" : "3",
  "name" : "Jimmy Jackal",
  "function" : "Student"
} 

সুতরাং এখন, আমি "ডো" সম্বলিত সমস্ত নথি অনুসন্ধান করতে চাই

curl http://localhost:9200/my_idx/my_type/_search?q=Doe

এটি কোনও হিট দেয় না তবে যদি আমি অনুসন্ধান করি

curl http://localhost:9200/my_idx/my_type/_search?q=Doeman

এটি একটি নথি ফেরত দেয় (জন ডোম্যান)।

আমি আমার সূচকের বৈশিষ্ট্য হিসাবে বিভিন্ন বিশ্লেষক এবং বিভিন্ন ফিল্টার সেট করার চেষ্টা করেছি। আমি একটি পূর্ণ অঙ্কিত ক্যোয়ারী ব্যবহার করার চেষ্টা করেছি (উদাহরণস্বরূপ:

{
  "query": {
    "term": {
      "name": "Doe"
    }
  }
}

) তবে কিছুই কাজ করছে বলে মনে হচ্ছে না।

আমি "ডো" অনুসন্ধান করার সময় আমি কীভাবে জন দোম্যান এবং জেন ডোইউম্যান উভয়কে ইলাস্টিক অনুসন্ধান করতে পারি?

হালনাগাদ

আমি এনগ্রাম টোকেনাইজার এবং ফিল্টার ব্যবহার করার চেষ্টা করেছি, যেমন ইগোর প্রস্তাবিত, এর মতো:

{
  "index": {
    "index": "my_idx",
    "type": "my_type",
    "bulk_size": "100",
    "bulk_timeout": "10ms",
    "analysis": {
      "analyzer": {
        "my_analyzer": {
          "type": "custom",
          "tokenizer": "my_ngram_tokenizer",
          "filter": [
            "my_ngram_filter"
          ]
        }
      },
      "filter": {
        "my_ngram_filter": {
          "type": "nGram",
          "min_gram": 1,
          "max_gram": 1
        }
      },
      "tokenizer": {
        "my_ngram_tokenizer": {
          "type": "nGram",
          "min_gram": 1,
          "max_gram": 1
        }
      }
    }
  }
}

আমার এখন যে সমস্যা হচ্ছে তা হ'ল প্রতিটি ক্যোয়ারী সমস্ত নথি ফেরত দেয়। কোন পয়েন্টার? এনজিগ্রাম ব্যবহারের ক্ষেত্রে ইলাস্টিক অনুসন্ধান ডকুমেন্টেশন দুর্দান্ত নয় ...


9
অবাক হওয়ার কিছু নেই, আপনি কমপক্ষে / সর্বাধিক এনগ্রাম 1 তে সেট করেছেন, তাই 1 টি চিঠি :)
মার্টিন বি

উত্তর:


85

আমি এনজিগ্রামও ব্যবহার করছি। আমি কেবলমাত্র ফিল্টার হিসাবে স্ট্যান্ডার্ড টোকেনাইজার এবং এনজিগ্রাম ব্যবহার করি। এখানে আমার সেটআপ:

{
  "index": {
    "index": "my_idx",
    "type": "my_type",
    "analysis": {
      "index_analyzer": {
        "my_index_analyzer": {
          "type": "custom",
          "tokenizer": "standard",
          "filter": [
            "lowercase",
            "mynGram"
          ]
        }
      },
      "search_analyzer": {
        "my_search_analyzer": {
          "type": "custom",
          "tokenizer": "standard",
          "filter": [
            "standard",
            "lowercase",
            "mynGram"
          ]
        }
      },
      "filter": {
        "mynGram": {
          "type": "nGram",
          "min_gram": 2,
          "max_gram": 50
        }
      }
    }
  }
}

আসুন আপনি 50 অক্ষর পর্যন্ত শব্দের অংশগুলি খুঁজে পান। আপনার প্রয়োজন অনুযায়ী সর্বোচ্চ_গ্রাম সামঞ্জস্য করুন। জার্মান ভাষায় শব্দগুলি সত্যিই বড় হয়ে উঠতে পারে, তাই আমি এটিকে একটি উচ্চ মূল্যে সেট করি।



আপনি কি সূচকের সেটিংস থেকে যা পান তা কি এটি যা কনফিগার করার জন্য আপনি ইলাস্টিক অনুসন্ধানে পোস্ট করেন?
টমাস জানসন

ইলাস্টিকসার্ক কনফিগার করার জন্য এটি একটি পোস্ট।
রোকে

আমি ইলাস্টিকসার্কের বর্তমান সংস্করণগুলির সাথে দৃ
firm

1
@ জিমসি আমি কমপক্ষে 7 বছর ধরে ইলাস্টিক অনুসন্ধান ব্যবহার করি নি, তাই আমি প্রকল্পের বর্তমান পরিবর্তনগুলি জানি না।
রোকে

63

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


14
ইগর ঠিক আছে। অন্তত নেতৃস্থানীয় * মুছে ফেলুন। এনজিরাম ইলাস্টিক অনুসন্ধান উদাহরণের জন্য, এই টুকরোটি দেখুন: gist.github.com/988923
karmi

3
@ কর্মমি: আপনার সম্পূর্ণ উদাহরণের জন্য ধন্যবাদ! সম্ভবত আপনি আপনার মন্তব্যটিকে একটি আসল উত্তর হিসাবে যুক্ত করতে চান, এটি আমার পক্ষে কাজ করে এবং আমি কী উত্সাহ দিতে চাই।
ফ্যাবিয়ান স্টেগ

54

আমি মনে করি কোনও ম্যাপিং পরিবর্তন করার দরকার নেই। ক্যোরি_স্ট্রিং ব্যবহার করার চেষ্টা করুন , এটি নিখুঁত। সমস্ত পরিস্থিতি ডিফল্ট স্ট্যান্ডার্ড বিশ্লেষকের সাথে কাজ করবে:

আমাদের কাছে ডেটা রয়েছে:

{"_id" : "1","name" : "John Doeman","function" : "Janitor"}
{"_id" : "2","name" : "Jane Doewoman","function" : "Teacher"}

দৃশ্যপট 1:

{"query": {
    "query_string" : {"default_field" : "name", "query" : "*Doe*"}
} }

প্রতিক্রিয়া:

{"_id" : "1","name" : "John Doeman","function" : "Janitor"}
{"_id" : "2","name" : "Jane Doewoman","function" : "Teacher"}

দৃশ্য 2:

{"query": {
    "query_string" : {"default_field" : "name", "query" : "*Jan*"}
} }

প্রতিক্রিয়া:

{"_id" : "1","name" : "John Doeman","function" : "Janitor"}

দৃশ্য 3:

{"query": {
    "query_string" : {"default_field" : "name", "query" : "*oh* *oe*"}
} }

প্রতিক্রিয়া:

{"_id" : "1","name" : "John Doeman","function" : "Janitor"}
{"_id" : "2","name" : "Jane Doewoman","function" : "Teacher"}

সম্পাদনা - বসন্তের ডেটা স্থিতিস্থাপক অনুসন্ধানের সাথে একই বাস্তবায়ন https://stackoverflow.com/a/43579948/2357869

অন্যের চেয়ে ক্যোয়ারী_স্ট্রিং কীভাবে আরও ভাল তা আরও একটি https://stackoverflow.com/a/43321606/2357869


3
আমি মনে করি এটি সবচেয়ে সহজ
এ্যাসগি দানদ্যান্রি

হ্যাঁ . আমি আমার প্রকল্পে বাস্তবায়ন করেছি।
অপ্সটার ইলাস্টিকসার্চ প্রো-বিজয়

সন্ধানে একাধিক ক্ষেত্র কীভাবে অন্তর্ভুক্ত করবেন?
শুভম এ।

এটি চেষ্টা করুন: - {"ক্যোয়ারী": {"ক্যোয়ারী_স্ট্রিং": fields "ক্ষেত্রগুলি": ["সামগ্রী", "নাম"], "ক্যোয়ারী": "এটি এবং এটি"}}}
অপস্টার ইলাস্টিকস প্রো-বিজয়


14

আপনার সূচি ম্যাপিংগুলি পরিবর্তন না করে আপনি একটি সাধারণ উপসর্গ ক্যোয়ারী করতে পারেন যা আপনি যেমন আশা করছেন তেমন আংশিক অনুসন্ধান করবে

অর্থাত।

{
  "query": { 
    "prefix" : { "name" : "Doe" }
  }
}

https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-prefix-query.html


আপনি উপসর্গ কোয়েরি ব্যবহার করে মাল্টি ফিল্ড অনুসন্ধান করতে পারেন?
ব্যাটম্যাকি

ধন্যবাদ, আমি যা খুঁজছিলাম! পারফরম্যান্স প্রভাব সম্পর্কে কোন চিন্তা?
ভিংটোফ্ট

6

সমাধানটি এখানে বর্ণিত হিসাবে ব্যবহার করে দেখুন: ইলাস্টিক অনুসন্ধানে ঠিক সাবস্ট্রিং অনুসন্ধানগুলি

{
    "mappings": {
        "my_type": {
            "index_analyzer":"index_ngram",
            "search_analyzer":"search_ngram"
        }
    },
    "settings": {
        "analysis": {
            "filter": {
                "ngram_filter": {
                    "type": "ngram",
                    "min_gram": 3,
                    "max_gram": 8
                }
            },
            "analyzer": {
                "index_ngram": {
                    "type": "custom",
                    "tokenizer": "keyword",
                    "filter": [ "ngram_filter", "lowercase" ]
                },
                "search_ngram": {
                    "type": "custom",
                    "tokenizer": "keyword",
                    "filter": "lowercase"
                }
            }
        }
    }
}

ডিস্ক ব্যবহারের সমস্যা এবং খুব দীর্ঘ অনুসন্ধানের সমস্যার সমাধানের জন্য সংক্ষিপ্ত 8 টি অক্ষর দীর্ঘ এনগ্রাম ব্যবহৃত হয় ( "ম্যাক্স_গ্রাম": 8 এর সাথে কনফিগার করা হয়েছে )। ৮ টিরও বেশি অক্ষরের সাথে শর্তাবলী অনুসন্ধান করতে, আপনার অনুসন্ধানটিকে একটি বুলিয়ান এবং ক্যোয়ারিতে পরিণত করুন that স্ট্রিংটিতে প্রতিটি স্বতন্ত্র 8-বর্ণচিহ্ন অনুসন্ধান করুন। উদাহরণস্বরূপ, যদি কোনও ব্যবহারকারী বড় ইয়ার্ডের জন্য অনুসন্ধান করে (একটি 10-বর্ণের স্ট্রিং), সন্ধানটি হবে:

"আরজ ইয়া এবং আরজ ইয়ার এবং আরজ ইয়ার্ড


2
মৃত লিঙ্ক, pls ঠিক করা
ডার্কমুক্কে

আমি কিছুক্ষণের জন্য এই জাতীয় কিছু সন্ধান করছি। ধন্যবাদ! আপনার সাথে কিভাবে মেমরির দাঁড়িপাল্লা চিনেন min_gramএবং max_gramএটা দেখে মনে হচ্ছে এটা সুসংগত ক্ষেত্র মূল্যবোধের আকার এবং পরিসীমা উপর নির্ভরশীল হবে minএবং max। এরকম কিছু ব্যবহার করে কীভাবে ভ্রূকুটি করা হচ্ছে?
গ্লেন থম্পসন

এছাড়াও ngramটোকনাইজারের উপর দিয়ে ফিল্টার হওয়ার কোনও কারণ আছে কি? আপনি কি কেবল টোকেনাইজার হিসাবে এটি না পেতে এবং তারপরে একটি ছোট হাতের ফিল্টার প্রয়োগ করতে পারেন ... index_ngram: { type: "custom", tokenizer: "ngram_tokenizer", filter: [ "lowercase" ] }আমি চেষ্টা করে দেখেছি এটি বিশ্লেষক পরীক্ষার এপিআই ব্যবহার করে একই ফলাফল দেবে
গ্লেন থম্পসন

2

আপনি যদি স্ব-সম্পূর্ণরূপে কার্যকারিতা বাস্তবায়ন করতে চান তবে কমপ্লিশেশন প্রস্তাবক হ'ল সর্বাধিক ঝরঝরে সমাধান। পরবর্তী ব্লগ পোস্টে এটি কীভাবে কাজ করে তার একটি খুব স্পষ্ট বর্ণনা রয়েছে।

দুটি কথায়, এটি একটি এফএসটি নামক একটি ইন-মেমরি ডেটা স্ট্রাকচার যা বৈধ পরামর্শ দেয় এবং দ্রুত পুনরুদ্ধার এবং মেমরির ব্যবহারের জন্য অনুকূলিত হয় ized মূলত, এটি কেবল একটি গ্রাফ। উদাহরণ হিসেবে বলা যায়, এবং FST শব্দ ধারণকারী জন্য hotel, marriot, mercure, munchenএবং munichভালো দেখাবে:

এখানে চিত্র বর্ণনা লিখুন


2

আপনি regexp ব্যবহার করতে পারেন।

{ "_id" : "1", "name" : "John Doeman" , "function" : "Janitor"}
{ "_id" : "2", "name" : "Jane Doewoman","function" : "Teacher"  }
{ "_id" : "3", "name" : "Jimmy Jackal" ,"function" : "Student"  } 

আপনি যদি এই প্রশ্নটি ব্যবহার করেন:

{
  "query": {
    "regexp": {
      "name": "J.*"
    }
  }
}

আপনি তাদের নাম "জে" দিয়ে শুরু করে এমন সমস্ত ডেটা দেবেন iderযদি আপনি প্রথম দুটি রেকর্ড পেতে চান যে তাদের নাম "মানুষ" দিয়ে শেষ হয় যাতে আপনি এই ক্যোয়ারীটি ব্যবহার করতে পারেন:

{
  "query": { 
    "regexp": {
      "name": ".*man"
    }
  }
}

এবং যদি আপনি সমস্ত রেকর্ড পেতে চান যে তাদের নামে "মি" আছে, আপনি এই ক্যোয়ারীটি ব্যবহার করতে পারেন:

{
  "query": { 
    "regexp": {
      "name": ".*m.*"
    }
  }
}

এটি আমার পক্ষে কাজ করে .আমি আশা করি আমার উত্তরটি আপনার সমস্যার সমাধানের জন্য উপযুক্ত হবে।


1

উইলকার্ডস (*) ব্যবহার করে স্কোরের ক্যালক আটকা যায়


1
আপনি কি নিজের উত্তরে আরও বিশদ যুক্ত করতে পারবেন? এটি কী করে তার জন্য একটি নমুনা কোড বা ডকুমেন্টেশনের রেফারেন্স সরবরাহ করুন।
ক্রাই

0

আমি এটি ব্যবহার করছি এবং আমার কাজ হয়েছে

"query": {
        "query_string" : {
            "query" : "*test*",
            "fields" : ["field1","field2"],
            "analyze_wildcard" : true,
            "allow_leading_wildcard": true
        }
    }

-6

কিছু মনে করো না.

আমাকে লুসিন ডকুমেন্টেশনটি দেখতে হবে। মনে হচ্ছে আমি ওয়াইল্ডকার্ড ব্যবহার করতে পারি! :-)

curl http://localhost:9200/my_idx/my_type/_search?q=*Doe*

কৌতুক করে!


11
@ আইমোটভ উত্তর দেখুন। ওয়াইল্ডকার্ডের ব্যবহার মোটেও ভাল স্কেল করছে না।
মাইক মুনরো

5
@ আইডিএক্স - আপনার নিজের উত্তর কীভাবে হ্রাস করা হয়েছে তা দেখুন। ডাউনভোটস একটি উত্তরের গুণমান এবং প্রাসঙ্গিকতার প্রতিনিধিত্ব করে। সঠিক উত্তরটি গ্রহণ করতে আপনি কি এক মিনিট সময় দিতে পারবেন? কমপক্ষে নতুন ব্যবহারকারীরা আপনার প্রতি কৃতজ্ঞ হবে।
asyncwait

3
যথেষ্ট ডাউনভোটস ওপি স্পষ্ট জানিয়েছে যে এখন সেরা উত্তরটি কী। কেউ আরও ভাল পোস্ট করার আগে যা উত্তম উত্তর বলে মনে হয়েছিল তা ভাগ করার জন্য +1।
এস ডানিয়েল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.