ইলাস্টিকস অনুসন্ধান - স্বতন্ত্র মূল্যবোধ ফেরান


122

আমি কীভাবে languagesরেকর্ডগুলি থেকে সমস্তটির মান পাব এবং সেগুলি অনন্য করে তুলব ।

রেকর্ডস

PUT items/1
{ "language" : 10 }

PUT items/2
{ "language" : 11 }

PUT items/3
{ "language" : 10 }

প্রশ্ন

GET items/_search
{ ... }

# => Expected Response
[10, 11]

যেকোনো সাহায্যই অসাধারণ.


1
fields: [languages]প্রদত্ত ক্ষেত্রের মানগুলিই দেবে, তবে তাদের অনন্য করে তোলা সম্ভবত কোডে করা সহজ। যদিও আপনার পক্ষে এটি করতে পারে এমন একটি সহজ উপায়ে কাজ করতে পারে।
আশাল্যান্ড

1
যারা এই বিষয় নিয়ে গবেষণা করছেন তাদের জন্যও এখানে দরকারী আলোচনা রয়েছে:
ইলাস্টিক

উত্তর:


165

আপনি সংহত পদ পদ ব্যবহার করতে পারেন ।

{
"size": 0,
"aggs" : {
    "langs" : {
        "terms" : { "field" : "language",  "size" : 500 }
    }
}}

একটি অনুসন্ধান যেমন কিছু ফিরে আসবে:

{
"took" : 16,
"timed_out" : false,
"_shards" : {
  "total" : 2,
  "successful" : 2,
  "failed" : 0
},
"hits" : {
"total" : 1000000,
"max_score" : 0.0,
"hits" : [ ]
},
"aggregations" : {
  "langs" : {
    "buckets" : [ {
      "key" : "10",
      "doc_count" : 244812
    }, {
      "key" : "11",
      "doc_count" : 136794

    }, {
      "key" : "12",
      "doc_count" : 32312
       } ]
    }
  }
}

sizeঅ্যাগ্রিগেশন নির্দিষ্ট করে মধ্যে পরামিতি পদ সর্বোচ্চ সংখ্যক অ্যাগ্রিগেশন ফলাফলে অন্তর্ভূক্ত করে নেয়। আপনার যদি সমস্ত ফলাফলের প্রয়োজন হয় তবে এটিকে এমন কোনও মানটিতে সেট করুন যা আপনার ডেটাতে অনন্য শর্তাবলীর সংখ্যার চেয়ে বড়।


2
"fields" : ["language"]একই ফলাফল ফিরে এনেছে। একত্রিতকরণ কাঠামোটি কেবল ভাষার মানগুলি ফিরিয়ে দিতে পারে কিনা তা জানতে আপনি নিজের উত্তরে প্রসারিত করতে পারেন? #=> [10, 11, 10]
চকজে হার্দি

1
@ চারলেসজে হার্দি, এর একই ফলাফল নেই। আপনি যে ডেটাটির সন্ধান করছেন সেটি "সমষ্টি" কী এর অধীনে। আমি একটি উত্তর ফলাফল সহ আমার উত্তর সম্পাদনা করেছি। আপনি যে কোনও দলিল অন্তর্ভুক্ত না করার জন্য "আকার": 0 নির্ধারণ করতে পারেন / করতে পারেন, কেবলমাত্র আপনি চান সামগ্রিক ফলাফল।
আন্তন

1
মনে রাখবেন যে আপনার কাছে যদি অনেকগুলি সম্ভাব্য মান থাকে languageতবে আপনি সমস্ত মান পেয়েছেন তা নিশ্চিত করতে size=0এবং যুক্ত করতে চান । দেখুন elasticsearch.org/guide/en/elasticsearch/reference/current/...shard_size=0
Dror

3
আমি মনে করি এই উত্তরটি ওপিকে সম্বোধন করে না। মূল প্রশ্ন পৃথক মান গণনা না করে চায় wants আমি কিছু অনুপস্থিত করছি?
ভুরলো

4
@ বিএইচবিএইচ, উত্তরটি পৃথক মান প্রদান করে। এগুলি হ'ল "কী" মান, যেমন, "10", "11" এবং "12"। (সমষ্টি> ল্যাং> বালতি> কী ...)
অ্যান্টন

9

ইলাস্টিকসার্চ 1.1+ এর কার্ডিনালিটি অগ্রিগেশন রয়েছে যা আপনাকে একটি অনন্য গণনা দেবে

মনে রাখবেন যে এটি আসলে একটি আনুমানিক এবং যথাযথতা উচ্চ কার্ডিনালিটি ডেটাসেটগুলির সাথে হ্রাস পেতে পারে, তবে এটি আমার পরীক্ষায় সাধারণত সঠিক।

আপনি precision_thresholdপ্যারামিটার দিয়ে নির্ভুলতা টিউন করতে পারেন । বাণিজ্য বন্ধ, বা অবশ্যই মেমরি ব্যবহার।

ডক্সের এই গ্রাফটি দেখায় যে কীভাবে একটি উচ্চতর precision_thresholdআরও সঠিক ফলাফলের দিকে নিয়ে যায়।


থ্রেশহোল্ড বনাম আপেক্ষিক ত্রুটি


2
না Cardinality সমষ্টি গ্যারান্টি যদি একটি শব্দ বিদ্যমান, তারপর, এটা ফলাফল (একটি গণনা> = 1) উপস্থিত হবে যে? অথবা এটি সম্ভবত এমন কিছু শর্ত মিস করতে পারে যা কেবলমাত্র একটি বড় ডেটাসেটে একবার প্রদর্শিত হয়?
চিহ্নিত করুন

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

12
আমি বিশ্বাস করি এই উত্তরটি ভুল। কার্ডিনালিটি একীকরণ একটি দুর্দান্ত সরঞ্জাম। তবে, কাজটি ছিল শর্তাদি নিজেরাই উদ্ধার করা, সেখানে কতগুলি বিভিন্ন শর্ত রয়েছে তা অনুমান করা হয়নি।
আন্তন

4

আপনি যদি প্রতিটি languageক্ষেত্রের অনন্য মানের জন্য প্রথম দস্তাবেজ পেতে চান তবে আপনি এটি করতে পারেন:

{
 "query": {
    "match_all": {
    }
  },
  "collapse": {
    "field": "language.keyword",
    "inner_hits": {
    "name": "latest",
      "size": 1
    }
  }
}

3

আমি আমার নিজের জন্যও এই জাতীয় সমাধানের সন্ধান করছি। আমি রেফারেন্স পাওয়া পদ অ্যাগ্রিগেশন

সুতরাং, নিম্নলিখিত অনুযায়ী সঠিক সমাধান হয়।

{
"aggs" : {
    "langs" : {
        "terms" : { "field" : "language",  
                    "size" : 500 }
    }
}}

তবে আপনি যদি নিম্নলিখিত ত্রুটির দিকে চলে যান:

"error": {
        "root_cause": [
            {
                "type": "illegal_argument_exception",
                "reason": "Fielddata is disabled on text fields by default. Set fielddata=true on [fastest_method] in order to load fielddata in memory by uninverting the inverted index. Note that this can however use significant memory. Alternatively use a keyword field instead."
            }
        ]}

সেক্ষেত্রে আপনাকে অনুরোধে " KEYWORD " যুক্ত করতে হবে , নীচের মত:

   {
    "aggs" : {
        "langs" : {
            "terms" : { "field" : "language.keyword",  
                        "size" : 500 }
        }
    }}

1

আপনি পেতে চান কোন পড়তা বা ম্যাজিক নম্বর (সেটিং ছাড়া সব অনন্য মান size: 500), তারপর ব্যবহার যৌগিক অ্যাগ্রিগেশন (ইএস 6.5+)

অফিসিয়াল ডকুমেন্টেশন থেকে :

"যদি আপনি নেস্টেড শর্তাদি সমষ্টিতে সমস্ত পদ বা শর্তাদির সমস্ত সংশ্লেষ পুনরুদ্ধার করতে চান তবে আপনার সম্মিলিত সংস্থানটি ব্যবহার করা উচিত যা পদগুলিকে একত্রিত করার ক্ষেত্রে ক্ষেত্রের কার্ডিনালিটির চেয়ে আরও বড় আকার নির্ধারণ করার পরিবর্তে সমস্ত সম্ভাব্য পদগুলিতে প্যাগিং করতে দেয় The পদগুলিকে একত্রিত করার অর্থ শীর্ষ পদগুলি ফিরিয়ে দেওয়া হয় এবং পৃষ্ঠাগুলির অনুমতি দেয় না ""

জাভাস্ক্রিপ্ট বাস্তবায়ন উদাহরণ:

const ITEMS_PER_PAGE = 1000;

const body =  {
    "size": 0, // Returning only aggregation results: https://www.elastic.co/guide/en/elasticsearch/reference/current/returning-only-agg-results.html
    "aggs" : {
        "langs": {
            "composite" : {
                "size": ITEMS_PER_PAGE,
                "sources" : [
                    { "language": { "terms" : { "field": "language" } } }
                ]
            }
        }
     }
};

const uniqueLanguages = [];

while (true) {
  const result = await es.search(body);

  const currentUniqueLangs = result.aggregations.langs.buckets.map(bucket => bucket.key);

  uniqueLanguages.push(...currentUniqueLangs);

  const after = result.aggregations.langs.after_key;

  if (after) {
      // continue paginating unique items
      body.aggs.langs.composite.after = after;
  } else {
      break;
  }
}

console.log(uniqueLanguages);

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.