স্থিতিস্থাপক অনুসন্ধান কেবল নির্দিষ্ট ক্ষেত্রগুলি ফিরিয়ে দিন?


434

আমি আমার নথিগুলি সূচী করতে ইলাস্টিক অনুসন্ধান ব্যবহার করছি।

এটি সংরক্ষণ করা পুরো জসন ডকুমেন্টের পরিবর্তে কেবল নির্দিষ্ট ক্ষেত্রগুলিতে ফিরতে নির্দেশ দেওয়া কি সম্ভব?


1
elastic.co/guide/en/elasticsearch/references/current/… , নোট করুন আপনি কেবল কয়েকটি ক্ষেত্রও বাদ দিতে পারবেন
ক্রিস্টোফ রাউসি

উত্তর:


619

হাঁ! উত্স ফিল্টার ব্যবহার করুন । আপনি যদি JSON এর সাথে অনুসন্ধান করছেন তবে এটি এর মতো দেখতে পাবেন:

{
    "_source": ["user", "message", ...],
    "query": ...,
    "size": ...
}

ES 2.4 এবং এর আগে, আপনি অনুসন্ধানের API- তে ক্ষেত্রগুলি বিকল্পটিও ব্যবহার করতে পারেন :

{
    "fields": ["user", "message", ...],
    "query": ...,
    "size": ...
}

এটি ES 5+ এ অবচয় করা হয়েছে। এবং উত্স ফিল্টারগুলি যাইহোক আরও শক্তিশালী!


12
এগুলি "সঞ্চিত" হিসাবে নির্ধারণ করতে নিশ্চিত করুন: ম্যাপিংয়ের ক্ষেত্রে সত্য true অন্যথায় ES এখনও সেখান থেকে _ উত্স নথি এবং ক্ষেত্রগুলি লোড করবে। যদি ফিরিয়ে দেওয়া ডেটা পুরো ডকুমেন্টের আকারের তুলনায় অপেক্ষাকৃত ছোট হয় তবে পারফরম্যান্সে প্রভাব ফেলতে পারে।
জার হাই

6
আপনি "স্টোর" বোঝাতে চেয়েছিলেন: সত্য
sscarduzio

এগুলি কনফের ফাইলটিতে তৈরি হয়েছে বা ঠিক কোথায়?
vbNewbie

@vbNewbie: আপনি কখনই ম্যাপিং সংজ্ঞায়িত করছেন। আপনি যদি ম্যাপিংকে স্পষ্টভাবে সংজ্ঞায়িত করছেন না এবং এটি উত্পন্ন করতে ES এর উপর নির্ভর করছেন, তবে আপনাকে ES সঞ্চয় করতে চায় এমন ক্ষেত্রগুলির জন্য ম্যাপিং সংজ্ঞায়িত করতে হবে। আপনি কেবল এমন ক্ষেত্রগুলির জন্য ম্যাপিংকে সংজ্ঞায়িত করতে পারেন যেখানে আপনি বিশেষ আচরণ চান (যেমন "স্টোর": সত্য, "সূচক": "not_analyzed") বা সমস্ত ক্ষেত্র। আরও তথ্যের জন্য ম্যাপিং ডক্সে সন্ধান করুন।
সংঘর্ষ

3
ক্ষেত্রগুলি আর নতুন সংস্করণগুলিতে সমর্থিত নয়। পরিবর্তে সঞ্চিত_ক্ষেত্র ব্যবহার করুন :)
শচীন শর্মা

88

আমি get apiসহায়ক হতে ডক্সটি পেয়েছি - বিশেষত দুটি বিভাগ, উত্স ফিল্টারিং এবং ফিল্ডস : https://www.elastic.co/guide/en/elasticsearch/references/7.3/docs-get.html#get-source- ফিল্টারিং

তারা উত্স ফিল্টারিং সম্পর্কে জানায়:

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

যা আমার ব্যবহারের ক্ষেত্রে পুরোপুরি ফিট করে। আমি কেবল উত্সটি ফিল্টার করে শেষ করেছি (শর্টহ্যান্ড ব্যবহার করে):

{
    "_source": ["field_x", ..., "field_y"],
    "query": {      
        ...
    }
}

এফওয়াইআই, তারা ক্ষেত্রের প্যারামিটার সম্পর্কে ডক্সে উল্লেখ করে :

গেট অপারেশন সঞ্চিত ক্ষেত্রগুলির একটি সেট নির্দিষ্ট করার অনুমতি দেয় যা ক্ষেত্রগুলির প্যারামিটারটি পাস করে ফিরে আসবে।

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

সুতরাং সংক্ষেপে, আপনার কাছে দুটি বিকল্প রয়েছে, হয় উত্স ফিল্টারিং বা [সঞ্চিত] ক্ষেত্রগুলি।


আমার জন্য কৌশলটি। "ক্ষেত্রগুলি" ব্যবহার করে ভূ-পয়েন্ট ফিরিয়ে নিয়ে আমার সমস্যা হয়েছিল, তবে "_সোর্স" ঠিক ঠিক কাজ করে, ধন্যবাদ!
ইয়োনলেড


12

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

এই ক্ষেত্রে, আপনি ব্যবহার করতে চাই:

{  
   "size": $INT_NUM_OF_DOCS_TO_RETURN,
   "stored_fields":[  
      "doc.headline",
      "doc.text",
      "doc.timestamp_utc"
   ],
   "query":{  
      "bool":{  
         "must":{  
            "term":{  
               "doc.topic":"news_on_things"
            }
         },
         "filter":{  
            "range":{  
               "doc.timestamp_utc":{  
                  "gte":1451606400000,
                  "lt":1483228800000,
                  "format":"epoch_millis"
               }
            }
         }
      }
   },
   "aggs":{  

   }
}

সঞ্চিত ক্ষেত্রগুলিকে কীভাবে সূচক করতে হয় সে সম্পর্কে ডকুমেন্টেশন দেখুন। একটি Upvote জন্য সর্বদা খুশি!


7
here you can specify whichever field you want in your output and also which you don't.

  POST index_name/_search
    {
        "_source": {
            "includes": [ "field_name", "field_name" ],
            "excludes": [ "field_name" ]
        },
        "query" : {
            "match" : { "field_name" : "value" }
        }
    }

7

response_filtering

সমস্ত REST এপিআইগুলি ফিল্টার_পথ প্যারামিটার গ্রহণ করে যা ইলাস্টিকের অনুসন্ধানে ফিরে আসা প্রতিক্রিয়া হ্রাস করতে ব্যবহৃত হতে পারে। এই পরামিতিটি বিন্দু স্বরলিপি দ্বারা প্রকাশিত ফিল্টারগুলির কমা দ্বারা পৃথক করা তালিকা গ্রহণ করে।

https://stackoverflow.com/a/35647027/844700


6

এখানে আরও একটি সমাধান, এখন একটি ম্যাচ এক্সপ্রেশন ব্যবহার করে

উত্স ফিল্টারিং
কীভাবে _সোর্স ক্ষেত্রটি প্রতিটি হিট দিয়ে ফিরে আসে তা নিয়ন্ত্রণ করার অনুমতি দেয়।

ইলাস্টিস্কার্ক সংস্করণ 5.5 এর সাথে পরীক্ষিত

মূল শব্দটি "অন্তর্ভুক্ত" নির্দিষ্ট ক্ষেত্রগুলি সংজ্ঞায়িত করে।

GET /my_indice/my_indice_type/_search
{
    "_source": {
        "includes": [ "my_especific_field"]
        },
        "query": {
        "bool": {
                "must": [
                {"match": {
                    "_id": "%my_id_here_without_percent%"
                    }
                }
            ]
        }
    }
}

5

'_সোর্স' প্যারামিটার দিয়ে একটি REST এপিআই জিইটি অনুরোধ করা যেতে পারে।

অনুরোধ অনুরোধ

http://localhost:9200/opt_pr/_search?q=SYMBOL:ITC AND OPTION_TYPE=CE AND TRADE_DATE=2017-02-10 AND EXPIRY_DATE=2017-02-23&_source=STRIKE_PRICE

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

{
"took": 59,
"timed_out": false,
"_shards": {
    "total": 5,
    "successful": 5,
    "failed": 0
},
"hits": {
    "total": 104,
    "max_score": 7.3908954,
    "hits": [
        {
            "_index": "opt_pr",
            "_type": "opt_pr_r",
            "_id": "AV3K4QTgNHl15Mv30uLc",
            "_score": 7.3908954,
            "_source": {
                "STRIKE_PRICE": 160
            }
        },
        {
            "_index": "opt_pr",
            "_type": "opt_pr_r",
            "_id": "AV3K4QTgNHl15Mv30uLh",
            "_score": 7.3908954,
            "_source": {
                "STRIKE_PRICE": 185
            }
        },
        {
            "_index": "opt_pr",
            "_type": "opt_pr_r",
            "_id": "AV3K4QTgNHl15Mv30uLi",
            "_score": 7.3908954,
            "_source": {
                "STRIKE_PRICE": 190
            }
        },
        {
            "_index": "opt_pr",
            "_type": "opt_pr_r",
            "_id": "AV3K4QTgNHl15Mv30uLm",
            "_score": 7.3908954,
            "_source": {
                "STRIKE_PRICE": 210
            }
        },
        {
            "_index": "opt_pr",
            "_type": "opt_pr_r",
            "_id": "AV3K4QTgNHl15Mv30uLp",
            "_score": 7.3908954,
            "_source": {
                "STRIKE_PRICE": 225
            }
        },
        {
            "_index": "opt_pr",
            "_type": "opt_pr_r",
            "_id": "AV3K4QTgNHl15Mv30uLr",
            "_score": 7.3908954,
            "_source": {
                "STRIKE_PRICE": 235
            }
        },
        {
            "_index": "opt_pr",
            "_type": "opt_pr_r",
            "_id": "AV3K4QTgNHl15Mv30uLw",
            "_score": 7.3908954,
            "_source": {
                "STRIKE_PRICE": 260
            }
        },
        {
            "_index": "opt_pr",
            "_type": "opt_pr_r",
            "_id": "AV3K4QTgNHl15Mv30uL5",
            "_score": 7.3908954,
            "_source": {
                "STRIKE_PRICE": 305
            }
        },
        {
            "_index": "opt_pr",
            "_type": "opt_pr_r",
            "_id": "AV3K4QTgNHl15Mv30uLd",
            "_score": 7.381078,
            "_source": {
                "STRIKE_PRICE": 165
            }
        },
        {
            "_index": "opt_pr",
            "_type": "opt_pr_r",
            "_id": "AV3K4QTgNHl15Mv30uLy",
            "_score": 7.381078,
            "_source": {
                "STRIKE_PRICE": 270
            }
        }
    ]
}

}


এটি আমার জন্য খুব ব্যবহার পূর্ণ।
থুসিঠা ইন্দুনিল

4

হ্যাঁ উত্স ফিল্টার ব্যবহার করে আপনি এটি সম্পাদন করতে পারেন, এখানে ডক উত্স-ফিল্টারিং

অনুরোধ অনুরোধ

POST index_name/_search
 {
   "_source":["field1","filed2".....] 
 }

আউটপুট হবে

{
  "took": 57,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 1,
    "max_score": 1,
    "hits": [
      {
        "_index": "index_name",
        "_type": "index1",
        "_id": "1",
        "_score": 1,
        "_source": {
          "field1": "a",
          "field2": "b"
        },
        {
          "field1": "c",
          "field2": "d"
        },....
      }
    ]
  }
}

2

জাভাতে আপনি সেটফেটসোর্সটি এর মতো ব্যবহার করতে পারেন:

client.prepareSearch(index).setTypes(type)
            .setFetchSource(new String[] { "field1", "field2" }, null)

2

উদাহরণস্বরূপ, আপনার তিনটি ক্ষেত্র সহ একটি ডক রয়েছে:

PUT movie/_doc/1
{
  "name":"The Lion King",
  "language":"English",
  "score":"9.3"
}

আপনি যদি ফিরে আসতে চান nameএবং scoreআপনি নিম্নলিখিত কমান্ডটি ব্যবহার করতে পারেন:

GET movie/_doc/1?_source_includes=name,score

যদি আপনি এমন কিছু ক্ষেত্র পেতে চান যা কোনও প্যাটার্নের সাথে মেলে:

GET movie/_doc/1?_source_includes=*re

হতে পারে কিছু ক্ষেত্র বাদ দিন:

GET movie/_doc/1?_source_excludes=score

0

জাভা এপিআই ব্যবহার করে, নির্দিষ্ট ক্ষেত্রের সেট থেকে সমস্ত রেকর্ড পেতে আমি নিম্নলিখিতটি ব্যবহার করি:

public List<Map<String, Object>> getAllDocs(String indexName) throws IOException{
    int scrollSize = 1000;
    List<Map<String,Object>> data = new ArrayList<>();
    SearchResponse response = null;
    while( response == null || response.getHits().getHits().length != 0){
        response = client.prepareSearch(indexName)
            .setTypes("typeName")  // The document types to execute the search against. Defaults to be executed against all types.
        .setQuery(QueryBuilders.matchAllQuery())
        .setFetchSource(new String[]{"field1", "field2"}, null)
        .setSize(scrollSize)
        .execute()
        .actionGet();
        for(SearchHit hit : response.getHits()){
            System.out.println(hit.getSourceAsString());
        }
    }
    return data;
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.