لچڪدار ڳولها بنياديات

Elasticsearch هڪ سرچ انجڻ آهي json rest api سان، Lucene استعمال ڪندي ۽ جاوا ۾ لکيل آهي. ھن انجڻ جي سڀني فائدن جو بيان ھيٺ ڏنل آھي سرڪاري ويب سائيٽ. هيٺ ڏنل ۾ اسان حوالو ڪنداسين Elasticsearch ES طور.

هڪجهڙا انجڻ استعمال ڪيا ويندا آهن پيچيده ڳولها لاءِ دستاويز ڊيٽابيس ۾. مثال طور، ٻوليءَ جي مورفولوجي کي نظر ۾ رکندي ڳولا ڪريو يا جيو ڪوآرڊينيٽس ذريعي ڳولا ڪريو.

هن آرٽيڪل ۾ آئون ES جي بنيادي ڳالهين بابت ڳالهائيندس مثال طور استعمال ڪندي بلاگ پوسٽن کي ترتيب ڏيڻ. مان توهان کي ڏيکاريندس ته دستاويز کي ڪيئن فلٽر، ترتيب ۽ ڳولها.

آپريٽنگ سسٽم تي انحصار نه ڪرڻ لاء، مان CURL استعمال ڪندي ES کي سڀ درخواستون ڪندس. گوگل ڪروم لاءِ هڪ پلگ ان پڻ آهي احساس.

متن ۾ دستاويز ۽ ٻين ذريعن جا لنڪ شامل آهن. آخر ۾ دستاويزن جي تڪڙي رسائي لاءِ لنڪ آهن. اڻڄاتل اصطلاحن جي تعريف ۾ ڳولي سگھجي ٿو لغتون.

ES انسٽال ڪرڻ

هن کي ڪرڻ لاء، اسان کي پهريان جاوا جي ضرورت آهي. ڊولپرز سفارش ڪريو جاوا 8 اپڊيٽ 20 يا جاوا 7 اپڊيٽ 55 کان جديد جاوا ورزن انسٽال ڪريو.

ES جي تقسيم موجود آهي ڊولپر ويب سائيٽ. آرڪائيو کي پيڪ ڪرڻ کان پوء توهان کي هلائڻ جي ضرورت آهي bin/elasticsearch. پڻ دستياب آهي apt ۽ yum لاء پيڪيجز. هتي آهي docker لاء سرڪاري تصوير. انسٽاليشن بابت وڌيڪ.

انسٽاليشن ۽ لانچ کان پوء، اچو ته ڪارڪردگي چيڪ ڪريو:

# для удобства запомним адрес в переменную
#export ES_URL=$(docker-machine ip dev):9200
export ES_URL=localhost:9200

curl -X GET $ES_URL

اسان هن طرح ڪجهه حاصل ڪنداسين:

{
  "name" : "Heimdall",
  "cluster_name" : "elasticsearch",
  "version" : {
    "number" : "2.2.1",
    "build_hash" : "d045fc29d1932bce18b2e65ab8b297fbf6cd41a1",
    "build_timestamp" : "2016-03-09T09:38:54Z",
    "build_snapshot" : false,
    "lucene_version" : "5.4.1"
  },
  "tagline" : "You Know, for Search"
}

انڊيڪسنگ

اچو ته ES ۾ پوسٽ شامل ڪريو:

# Добавим документ c id 1 типа post в индекс blog.
# ?pretty указывает, что вывод должен быть человеко-читаемым.

curl -XPUT "$ES_URL/blog/post/1?pretty" -d'
{
  "title": "Веселые котята",
  "content": "<p>Смешная история про котят<p>",
  "tags": [
    "котята",
    "смешная история"
  ],
  "published_at": "2014-09-12T20:44:42+00:00"
}'

سرور جواب:

{
  "_index" : "blog",
  "_type" : "post",
  "_id" : "1",
  "_version" : 1,
  "_shards" : {
    "total" : 2,
    "successful" : 1,
    "failed" : 0
  },
  "created" : false
}

ES خودڪار ٺاهي وئي اشارو بلاگ ۽ قسم پوسٽ. اسان هڪ مشروط قياس ٺاهي سگهون ٿا: هڪ انڊيڪس هڪ ڊيٽابيس آهي، ۽ هڪ قسم هن ڊيٽابيس ۾ هڪ ٽيبل آهي. هر قسم جي پنهنجي اسڪيم آهي - نقشه، صرف هڪ تعلقي ٽيبل وانگر. ميپنگ خودڪار طور تي ٺاهي وئي آهي جڏهن دستاويز ترتيب ڏنل آهي:

# Получим mapping всех типов индекса blog
curl -XGET "$ES_URL/blog/_mapping?pretty"

سرور جي جواب ۾، مون تبصرن ۾ ترتيب ڏنل دستاويز جي فيلڊ جا قدر شامل ڪيا:

{
  "blog" : {
    "mappings" : {
      "post" : {
        "properties" : {
          /* "content": "<p>Смешная история про котят<p>", */ 
          "content" : {
            "type" : "string"
          },
          /* "published_at": "2014-09-12T20:44:42+00:00" */
          "published_at" : {
            "type" : "date",
            "format" : "strict_date_optional_time||epoch_millis"
          },
          /* "tags": ["котята", "смешная история"] */
          "tags" : {
            "type" : "string"
          },
          /*  "title": "Веселые котята" */
          "title" : {
            "type" : "string"
          }
        }
      }
    }
  }
}

اهو نوٽ ڪرڻ جي قابل آهي ته ES هڪ واحد قدر ۽ قدر جي هڪ صف جي وچ ۾ فرق نٿو ڪري. مثال طور، عنوان جي ميدان ۾ صرف هڪ عنوان شامل آهي، ۽ ٽيگ فيلڊ ۾ تارن جي هڪ صف شامل آهي، جيتوڻيڪ اهي نقشي سازي ۾ ساڳي طرح پيش ڪيا ويا آهن.
اسان بعد ۾ نقشي سازي بابت وڌيڪ ڳالهائينداسين.

درخواستون

ان جي id ذريعي هڪ دستاويز ٻيهر حاصل ڪرڻ:

# извлечем документ с id 1 типа post из индекса blog
curl -XGET "$ES_URL/blog/post/1?pretty"
{
  "_index" : "blog",
  "_type" : "post",
  "_id" : "1",
  "_version" : 1,
  "found" : true,
  "_source" : {
    "title" : "Веселые котята",
    "content" : "<p>Смешная история про котят<p>",
    "tags" : [ "котята", "смешная история" ],
    "published_at" : "2014-09-12T20:44:42+00:00"
  }
}

جواب ۾ نيون ڪيچون ظاهر ٿيون: _version и _source. عام طور تي، سڀ چابيون سان شروع _ سرڪاري طور تي درجه بندي ڪئي وئي آهي.

ڪيٻي _version دستاويز جو نسخو ڏيکاري ٿو. اهو ڪم ڪرڻ لاءِ پراميد لاڪنگ ميڪانيزم جي ضرورت آهي. مثال طور، اسان هڪ دستاويز کي تبديل ڪرڻ چاهيون ٿا جنهن جو نسخو 1 آهي. اسان تبديل ٿيل دستاويز جمع ڪريون ٿا ۽ ظاهر ڪريون ٿا ته هي نسخو 1 واري دستاويز جي ترميم آهي. جيڪڏهن ڪنهن ٻئي شخص به نسخي 1 سان دستاويز کي ايڊٽ ڪيو ۽ اسان جي اڳيان تبديليون پيش ڪيون، پوءِ ES اسان جي تبديلين کي قبول نه ڪندو، ڇاڪاڻ ته اهو دستاويز کي ورزن 2 سان محفوظ ڪري ٿو.

ڪيٻي _source دستاويز تي مشتمل آهي جنهن کي اسان ترتيب ڏنو آهي. ES ڳولا جي عملن لاء هي قدر استعمال نٿو ڪري ڇاڪاڻ ته انڊيڪس استعمال ڪيا ويندا آهن ڳولا لاءِ. خلا کي بچائڻ لاءِ، ES محفوظ ڪري ٿو ڪمپريسڊ ماخذ دستاويز. جيڪڏهن اسان کي صرف id جي ضرورت آهي، ۽ نه ته سڄو ماخذ دستاويز، پوء اسان ذريعو اسٽوريج کي بند ڪري سگهون ٿا.

جيڪڏهن اسان کي اضافي معلومات جي ضرورت نه آهي، اسان صرف مواد حاصل ڪري سگهون ٿا _source:

curl -XGET "$ES_URL/blog/post/1/_source?pretty"
{
  "title" : "Веселые котята",
  "content" : "<p>Смешная история про котят<p>",
  "tags" : [ "котята", "смешная история" ],
  "published_at" : "2014-09-12T20:44:42+00:00"
}

توھان پڻ چونڊي سگھوٿا صرف ڪجھ خاص فيلڊ:

# извлечем только поле title
curl -XGET "$ES_URL/blog/post/1?_source=title&pretty"
{
  "_index" : "blog",
  "_type" : "post",
  "_id" : "1",
  "_version" : 1,
  "found" : true,
  "_source" : {
    "title" : "Веселые котята"
  }
}

اچو ته ڪجهه وڌيڪ پوسٽن کي ترتيب ڏيو ۽ وڌيڪ پيچيده سوالن کي هلائي.

curl -XPUT "$ES_URL/blog/post/2" -d'
{
  "title": "Веселые щенки",
  "content": "<p>Смешная история про щенков<p>",
  "tags": [
    "щенки",
    "смешная история"
  ],
  "published_at": "2014-08-12T20:44:42+00:00"
}'
curl -XPUT "$ES_URL/blog/post/3" -d'
{
  "title": "Как у меня появился котенок",
  "content": "<p>Душераздирающая история про бедного котенка с улицы<p>",
  "tags": [
    "котята"
  ],
  "published_at": "2014-07-21T20:44:42+00:00"
}'

ترتيب ڏيڻ

# найдем последний пост по дате публикации и извлечем поля title и published_at
curl -XGET "$ES_URL/blog/post/_search?pretty" -d'
{
  "size": 1,
  "_source": ["title", "published_at"],
  "sort": [{"published_at": "desc"}]
}'
{
  "took" : 8,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "failed" : 0
  },
  "hits" : {
    "total" : 3,
    "max_score" : null,
    "hits" : [ {
      "_index" : "blog",
      "_type" : "post",
      "_id" : "1",
      "_score" : null,
      "_source" : {
        "title" : "Веселые котята",
        "published_at" : "2014-09-12T20:44:42+00:00"
      },
      "sort" : [ 1410554682000 ]
    } ]
  }
}

اسان آخري پوسٽ چونڊيو. size جاري ڪيل دستاويزن جي تعداد کي محدود ڪري ٿو. total درخواست سان ملندڙ دستاويزن جو ڪل تعداد ڏيکاري ٿو. sort آئوٽ ۾ انٽيجرز جو هڪ صف شامل آهي جنهن سان ترتيب ڏنل آهي. اهي. تاريخ کي انٽيجر ۾ تبديل ڪيو ويو. ترتيب ڏيڻ بابت وڌيڪ معلومات ۾ ملي سگهي ٿي دستاويز.

فلٽر ۽ سوال

ES کان وٺي نسخو 2 فلٽر ۽ سوالن جي وچ ۾ فرق نٿو ڪري، بدران حوالن جو تصور متعارف ڪرايو ويو آهي.
هڪ سوال جو حوالو فلٽر جي حوالي سان مختلف آهي ته سوال هڪ _score ٺاهي ٿو ۽ ڪيش ٿيل نه آهي. مان توهان کي ڏيکاريندس _score بعد ۾ ڇا آهي.

تاريخ طرفان فلٽر ڪريو

اسان درخواست استعمال ڪندا آهيون حد فلٽر جي حوالي سان:

# получим посты, опубликованные 1ого сентября или позже
curl -XGET "$ES_URL/blog/post/_search?pretty" -d'
{
  "filter": {
    "range": {
      "published_at": { "gte": "2014-09-01" }
    }
  }
}'

ٽيگ ذريعي فلٽر ڪريو

اسان استعمال ڪريون ٿا اصطلاح سوال ڏنل لفظ تي مشتمل دستاويز جي سڃاڻپ ڳولڻ لاءِ:

# найдем все документы, в поле tags которых есть элемент 'котята'
curl -XGET "$ES_URL/blog/post/_search?pretty" -d'
{
  "_source": [
    "title",
    "tags"
  ],
  "filter": {
    "term": {
      "tags": "котята"
    }
  }
}'
{
  "took" : 9,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "failed" : 0
  },
  "hits" : {
    "total" : 2,
    "max_score" : 1.0,
    "hits" : [ {
      "_index" : "blog",
      "_type" : "post",
      "_id" : "1",
      "_score" : 1.0,
      "_source" : {
        "title" : "Веселые котята",
        "tags" : [ "котята", "смешная история" ]
      }
    }, {
      "_index" : "blog",
      "_type" : "post",
      "_id" : "3",
      "_score" : 1.0,
      "_source" : {
        "title" : "Как у меня появился котенок",
        "tags" : [ "котята" ]
      }
    } ]
  }
}

مڪمل متن جي ڳولا

اسان جا ٽي دستاويز مواد جي ميدان ۾ ھيٺ ڏنل آھن:

  • <p>Смешная история про котят<p>
  • <p>Смешная история про щенков<p>
  • <p>Душераздирающая история про бедного котенка с улицы<p>

اسان استعمال ڪريون ٿا ملندڙ سوال ڏنل لفظ تي مشتمل دستاويز جي سڃاڻپ ڳولڻ لاءِ:

# source: false означает, что не нужно извлекать _source найденных документов
curl -XGET "$ES_URL/blog/post/_search?pretty" -d'
{
  "_source": false,
  "query": {
    "match": {
      "content": "история"
    }
  }
}'
{
  "took" : 13,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "failed" : 0
  },
  "hits" : {
    "total" : 3,
    "max_score" : 0.11506981,
    "hits" : [ {
      "_index" : "blog",
      "_type" : "post",
      "_id" : "2",
      "_score" : 0.11506981
    }, {
      "_index" : "blog",
      "_type" : "post",
      "_id" : "1",
      "_score" : 0.11506981
    }, {
      "_index" : "blog",
      "_type" : "post",
      "_id" : "3",
      "_score" : 0.095891505
    } ]
  }
}

بهرحال، جيڪڏهن اسان مواد جي فيلڊ ۾ "ڪهاڻيون" ڳوليندا آهيون، اسان کي ڪجهه به نه ملندو، ڇاڪاڻ ته انڊيڪس ۾ صرف اصل لفظ شامل آهن، نه انهن جي تنن تي. اعلي معيار جي ڳولا ڪرڻ لاء، توهان کي تجزيي کي ترتيب ڏيڻ جي ضرورت آهي.

ميدان _score شو مطابقت. جيڪڏهن درخواست فلٽر جي حوالي سان جاري ڪئي وئي آهي، پوء _score قدر هميشه 1 جي برابر هوندو، جنهن جو مطلب آهي فلٽر سان مڪمل ميچ.

تجزيو ڪندڙ

تجزيو ڪندڙ ذريعن جي متن کي ٽوڪن جي سيٽ ۾ تبديل ڪرڻ جي ضرورت آهي.
تجزيه ڪندڙ هڪ تي مشتمل آهن ٽوڪنائزر ۽ ڪيترائي اختياري ٽوڪن فلٽر. Tokenizer ڪيترن ئي کان اڳ ٿي سگهي ٿو چار فلٽر. ٽوڪنائزرز ماخذ جي تار کي ٽوڪن ۾ ٽوڙيندا آهن، جهڙوڪ اسپيس ۽ اوقاف جا اکر. TokenFilter ٽوڪن کي تبديل ڪري سگھي ٿو، نئين کي حذف ڪري سگھي ٿو يا شامل ڪري سگھي ٿو، مثال طور، رڳو لفظ جي اسٽيم کي ڇڏي ڏيو، اڳڀرائي ختم ڪريو، مترادفات شامل ڪريو. CharFilter - سڄي سورس اسٽرنگ کي تبديل ڪري ٿو، مثال طور، HTML ٽيگ کي ڪٽيو.

ES ڪيترائي آهن معياري تجزيو ڪندڙ. مثال طور، هڪ تجزيه نگار روسي.

اچو ته فائدو وٺون api ۽ اچو ته ڏسون ته ڪيئن معياري ۽ روسي تجزيه نگار تارن کي تبديل ڪندا آهن ”ڪٿن بابت عجيب ڳالهيون“:

# используем анализатор standard       
# обязательно нужно перекодировать не ASCII символы
curl -XGET "$ES_URL/_analyze?pretty&analyzer=standard&text=%D0%92%D0%B5%D1%81%D0%B5%D0%BB%D1%8B%D0%B5%20%D0%B8%D1%81%D1%82%D0%BE%D1%80%D0%B8%D0%B8%20%D0%BF%D1%80%D0%BE%20%D0%BA%D0%BE%D1%82%D1%8F%D1%82"
{
  "tokens" : [ {
    "token" : "веселые",
    "start_offset" : 0,
    "end_offset" : 7,
    "type" : "<ALPHANUM>",
    "position" : 0
  }, {
    "token" : "истории",
    "start_offset" : 8,
    "end_offset" : 15,
    "type" : "<ALPHANUM>",
    "position" : 1
  }, {
    "token" : "про",
    "start_offset" : 16,
    "end_offset" : 19,
    "type" : "<ALPHANUM>",
    "position" : 2
  }, {
    "token" : "котят",
    "start_offset" : 20,
    "end_offset" : 25,
    "type" : "<ALPHANUM>",
    "position" : 3
  } ]
}
# используем анализатор russian
curl -XGET "$ES_URL/_analyze?pretty&analyzer=russian&text=%D0%92%D0%B5%D1%81%D0%B5%D0%BB%D1%8B%D0%B5%20%D0%B8%D1%81%D1%82%D0%BE%D1%80%D0%B8%D0%B8%20%D0%BF%D1%80%D0%BE%20%D0%BA%D0%BE%D1%82%D1%8F%D1%82"
{
  "tokens" : [ {
    "token" : "весел",
    "start_offset" : 0,
    "end_offset" : 7,
    "type" : "<ALPHANUM>",
    "position" : 0
  }, {
    "token" : "истор",
    "start_offset" : 8,
    "end_offset" : 15,
    "type" : "<ALPHANUM>",
    "position" : 1
  }, {
    "token" : "кот",
    "start_offset" : 20,
    "end_offset" : 25,
    "type" : "<ALPHANUM>",
    "position" : 3
  } ]
}

معياري تجزييٽر اسٽرنگ کي خالن جي حساب سان ورهايو ۽ هر شيءِ کي لوئر ڪيس ۾ تبديل ڪري ڇڏيو، روسي تجزيه نگار غير اهم لفظن کي هٽائي، ان کي لوئر ڪيس ۾ تبديل ڪيو ۽ لفظن جي اسٽيم کي ڇڏي ڏنو.

اچو ته ڏسون ته ٽوڪنائزر، ٽوڪن فلٽر، چار فلٽر روسي تجزيه نگار استعمال ڪري ٿو:

{
  "filter": {
    "russian_stop": {
      "type":       "stop",
      "stopwords":  "_russian_"
    },
    "russian_keywords": {
      "type":       "keyword_marker",
      "keywords":   []
    },
    "russian_stemmer": {
      "type":       "stemmer",
      "language":   "russian"
    }
  },
  "analyzer": {
    "russian": {
      "tokenizer":  "standard",
      /* TokenFilters */
      "filter": [
        "lowercase",
        "russian_stop",
        "russian_keywords",
        "russian_stemmer"
      ]
      /* CharFilters отсутствуют */
    }
  }
}

اچو ته بيان ڪريون اسان جي تجزيي کي روسي جي بنياد تي، جيڪو ڪٽيندو html ٽيگ. اچو ته ان کي ڊفالٽ سڏين، ڇاڪاڻ ته هن نالي سان هڪ تجزيه نگار ڊفالٽ طور استعمال ڪيو ويندو.

{
  "filter": {
    "ru_stop": {
      "type":       "stop",
      "stopwords":  "_russian_"
    },
    "ru_stemmer": {
      "type":       "stemmer",
      "language":   "russian"
    }
  },
  "analyzer": {
    "default": {
      /* добавляем удаление html тегов */
      "char_filter": ["html_strip"],
      "tokenizer":  "standard",
      "filter": [
        "lowercase",
        "ru_stop",
        "ru_stemmer"
      ]
    }
  }
}

سڀ کان پهريان، سڀئي HTML ٽيگ ماخذ واري اسٽرنگ مان هٽايا ويندا، پوءِ ٽوڪنائزر معيار ان کي ٽوڪن ۾ ورهائي ڇڏيندو، نتيجي ۾ ايندڙ ٽوڪن کي لوئر ڪيس ۾ منتقل ڪيو ويندو، غير اهم لفظن کي هٽايو ويندو، ۽ باقي ٽوڪنز لفظ جي اسٽيم ۾ رهندي.

انڊيڪس ٺاهڻ

مٿي اسان بيان ڪيو ڊفالٽ تجزيه ڪندڙ. اهو سڀني اسٽرنگ فيلڊ تي لاڳو ٿيندو. اسان جي پوسٽ ۾ ٽيگ جي هڪ صف شامل آهي، تنهنڪري ٽيگ پڻ تجزيه ڪندڙ طرفان پروسيس ڪيو ويندو. ڇاڪاڻ ته اسان پوسٽون ڳولي رھيا آھيون ھڪڙي ٽيگ سان صحيح ميچ سان، پوء اسان کي ٽيگ فيلڊ لاء تجزيو کي غير فعال ڪرڻ جي ضرورت آھي.

اچو ته هڪ انڊيڪس blog2 ٺاهيون هڪ تجزيه نگار ۽ ميپنگ سان، جنهن ۾ ٽيگ جي فيلڊ جو تجزيو بند ٿيل آهي:

curl -XPOST "$ES_URL/blog2" -d'
{
  "settings": {
    "analysis": {
      "filter": {
        "ru_stop": {
          "type": "stop",
          "stopwords": "_russian_"
        },
        "ru_stemmer": {
          "type": "stemmer",
          "language": "russian"
        }
      },
      "analyzer": {
        "default": {
          "char_filter": [
            "html_strip"
          ],
          "tokenizer": "standard",
          "filter": [
            "lowercase",
            "ru_stop",
            "ru_stemmer"
          ]
        }
      }
    }
  },
  "mappings": {
    "post": {
      "properties": {
        "content": {
          "type": "string"
        },
        "published_at": {
          "type": "date"
        },
        "tags": {
          "type": "string",
          "index": "not_analyzed"
        },
        "title": {
          "type": "string"
        }
      }
    }
  }
}'

اچو ته ساڳيا 3 پوسٽون هن انڊيڪس ۾ شامل ڪيون (blog2). مان هن عمل کي ڇڏي ڏيندس ڇاڪاڻ ته ... اهو بلاگ انڊيڪس ۾ دستاويز شامل ڪرڻ جي برابر آهي.

اظهار جي حمايت سان مڪمل متن جي ڳولا

اچو ته هڪ ٻي قسم جي درخواست تي نظر رکون:

# найдем документы, в которых встречается слово 'истории'
# query -> simple_query_string -> query содержит поисковый запрос
# поле title имеет приоритет 3
# поле tags имеет приоритет 2
# поле content имеет приоритет 1
# приоритет используется при ранжировании результатов
curl -XPOST "$ES_URL/blog2/post/_search?pretty" -d'
{
  "query": {
    "simple_query_string": {
      "query": "истории",
      "fields": [
        "title^3",
        "tags^2",
        "content"
      ]
    }
  }
}'

ڇاڪاڻ ته اسان روسي اسٽيمنگ سان هڪ تجزيه ڪندڙ استعمال ڪري رهيا آهيون، پوء هي درخواست سڀني دستاويزن کي واپس آڻيندو، جيتوڻيڪ اهي صرف لفظ 'تاريخ' تي مشتمل آهن.

درخواست ۾ خاص اکر شامل ٿي سگھن ٿا، مثال طور:

""fried eggs" +(eggplant | potato) -frittata"

درخواست نحو:

+ signifies AND operation
| signifies OR operation
- negates a single token
" wraps a number of tokens to signify a phrase for searching
* at the end of a term signifies a prefix query
( and ) signify precedence
~N after a word signifies edit distance (fuzziness)
~N after a phrase signifies slop amount
# найдем документы без слова 'щенки'
curl -XPOST "$ES_URL/blog2/post/_search?pretty" -d'
{
  "query": {
    "simple_query_string": {
      "query": "-щенки",
      "fields": [
        "title^3",
        "tags^2",
        "content"
      ]
    }
  }
}'

# получим 2 поста про котиков

حوالن

PS

جيڪڏهن توهان هڪجهڙا مضمونن ۾ دلچسپي رکو ٿا- سبق، نوان مضمونن لاءِ خيال آهن، يا توهان وٽ تعاون لاءِ تجويزون آهن، ته پوءِ مون کي ذاتي پيغام يا اي ميل ذريعي پيغام ملڻ تي خوشي ٿيندي [ايميل محفوظ ٿيل].

جو ذريعو: www.habr.com