আমি আমার নথিগুলি সূচী করতে ইলাস্টিক অনুসন্ধান ব্যবহার করছি।
এটি সংরক্ষণ করা পুরো জসন ডকুমেন্টের পরিবর্তে কেবল নির্দিষ্ট ক্ষেত্রগুলিতে ফিরতে নির্দেশ দেওয়া কি সম্ভব?
আমি আমার নথিগুলি সূচী করতে ইলাস্টিক অনুসন্ধান ব্যবহার করছি।
এটি সংরক্ষণ করা পুরো জসন ডকুমেন্টের পরিবর্তে কেবল নির্দিষ্ট ক্ষেত্রগুলিতে ফিরতে নির্দেশ দেওয়া কি সম্ভব?
উত্তর:
হাঁ! উত্স ফিল্টার ব্যবহার করুন । আপনি যদি JSON এর সাথে অনুসন্ধান করছেন তবে এটি এর মতো দেখতে পাবেন:
{
"_source": ["user", "message", ...],
"query": ...,
"size": ...
}
ES 2.4 এবং এর আগে, আপনি অনুসন্ধানের API- তে ক্ষেত্রগুলি বিকল্পটিও ব্যবহার করতে পারেন :
{
"fields": ["user", "message", ...],
"query": ...,
"size": ...
}
এটি ES 5+ এ অবচয় করা হয়েছে। এবং উত্স ফিল্টারগুলি যাইহোক আরও শক্তিশালী!
আমি get api
সহায়ক হতে ডক্সটি পেয়েছি - বিশেষত দুটি বিভাগ, উত্স ফিল্টারিং এবং ফিল্ডস : https://www.elastic.co/guide/en/elasticsearch/references/7.3/docs-get.html#get-source- ফিল্টারিং
তারা উত্স ফিল্টারিং সম্পর্কে জানায়:
যদি আপনার সম্পূর্ণ _সোর্স থেকে কেবল এক বা দুটি ক্ষেত্রের প্রয়োজন হয় তবে আপনি যে অংশগুলি প্রয়োজন সেগুলি অন্তর্ভুক্ত করতে বা ফিল্টার করার জন্য _সোর্স_সামগ্রী & _সূত্র_কেন্দ্র পরামিতি ব্যবহার করতে পারেন। এটি বিশেষত বৃহত্তর দস্তাবেজের ক্ষেত্রে সহায়ক হতে পারে যেখানে আংশিক পুনরুদ্ধার নেটওয়ার্কের ওভারহেডে সঞ্চয় করতে পারে
যা আমার ব্যবহারের ক্ষেত্রে পুরোপুরি ফিট করে। আমি কেবল উত্সটি ফিল্টার করে শেষ করেছি (শর্টহ্যান্ড ব্যবহার করে):
{
"_source": ["field_x", ..., "field_y"],
"query": {
...
}
}
এফওয়াইআই, তারা ক্ষেত্রের প্যারামিটার সম্পর্কে ডক্সে উল্লেখ করে :
গেট অপারেশন সঞ্চিত ক্ষেত্রগুলির একটি সেট নির্দিষ্ট করার অনুমতি দেয় যা ক্ষেত্রগুলির প্যারামিটারটি পাস করে ফিরে আসবে।
এটি নির্দিষ্টভাবে সঞ্চিত ক্ষেত্রগুলির জন্য প্রয়োজন মনে করে, যেখানে এটি প্রতিটি ক্ষেত্রকে একটি অ্যারেতে রাখে। যদি নির্দিষ্ট ক্ষেত্রগুলি সংরক্ষণ না করা থাকে তবে এটি _ উত্স থেকে প্রতিটি আনবে, যার ফলে 'ধীর' পুনরুদ্ধার হতে পারে। এটি টাইপ অবজেক্টের ক্ষেত্রগুলি ফেরত পাওয়ার চেষ্টা করতেও আমার সমস্যা হয়েছিল।
সুতরাং সংক্ষেপে, আপনার কাছে দুটি বিকল্প রয়েছে, হয় উত্স ফিল্টারিং বা [সঞ্চিত] ক্ষেত্রগুলি।
For the ES versions 5.X and above you can a ES query something like this
GET /.../...
{
"_source": {
"includes": [ "FIELD1", "FIELD2", "FIELD3" ... " ]
},
.
.
.
.
}
ইলাস্টিকসার্ক 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 জন্য সর্বদা খুশি!
সমস্ত REST এপিআইগুলি ফিল্টার_পথ প্যারামিটার গ্রহণ করে যা ইলাস্টিকের অনুসন্ধানে ফিরে আসা প্রতিক্রিয়া হ্রাস করতে ব্যবহৃত হতে পারে। এই পরামিতিটি বিন্দু স্বরলিপি দ্বারা প্রকাশিত ফিল্টারগুলির কমা দ্বারা পৃথক করা তালিকা গ্রহণ করে।
এখানে আরও একটি সমাধান, এখন একটি ম্যাচ এক্সপ্রেশন ব্যবহার করে
উত্স ফিল্টারিং
কীভাবে _সোর্স ক্ষেত্রটি প্রতিটি হিট দিয়ে ফিরে আসে তা নিয়ন্ত্রণ করার অনুমতি দেয়।
ইলাস্টিস্কার্ক সংস্করণ 5.5 এর সাথে পরীক্ষিত
মূল শব্দটি "অন্তর্ভুক্ত" নির্দিষ্ট ক্ষেত্রগুলি সংজ্ঞায়িত করে।
GET /my_indice/my_indice_type/_search
{
"_source": {
"includes": [ "my_especific_field"]
},
"query": {
"bool": {
"must": [
{"match": {
"_id": "%my_id_here_without_percent%"
}
}
]
}
}
}
'_সোর্স' প্যারামিটার দিয়ে একটি 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
}
}
]
}
}
হ্যাঁ উত্স ফিল্টার ব্যবহার করে আপনি এটি সম্পাদন করতে পারেন, এখানে ডক উত্স-ফিল্টারিং
অনুরোধ অনুরোধ
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"
},....
}
]
}
}
জাভাতে আপনি সেটফেটসোর্সটি এর মতো ব্যবহার করতে পারেন:
client.prepareSearch(index).setTypes(type)
.setFetchSource(new String[] { "field1", "field2" }, null)
উদাহরণস্বরূপ, আপনার তিনটি ক্ষেত্র সহ একটি ডক রয়েছে:
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
জাভা এপিআই ব্যবহার করে, নির্দিষ্ট ক্ষেত্রের সেট থেকে সমস্ত রেকর্ড পেতে আমি নিম্নলিখিতটি ব্যবহার করি:
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;
}