تعداد داکیومنت های ایندکس

http://localhost:9200/exploit/_count

ساخت ایندکس جدید

PUT http://192.168.13.248:9200/exploit

حذف ایندکس

DELETE http://192.168.13.248:9200/exploit

گرفتن داکیومنت

http://192.168.13.248:9200/exploit/_doc/5

گرفتن داکیومنت بدون متا دیتا

http://192.168.13.248:9200/exploit/_source/5

گرفتن مالتی داکیومنت ( مطالعه شود mget )

http://192.168.13.248:9200/exploit/_mget

لیست داکیومنت

http://192.168.13.196:9200/exploit/_search/?size=1000&pretty=true

لیست ایندکس ها

http://localhost:9200/_cat/indices?v=true

idioms

term - اگر مقادیر فیلد ها در الستیک را بهقسمت های کوچک بشکنیم و برای هر کدام ایندکس بگذاریم ، به هر یونیت یا قسمت از مقدار یک ترم گفته می شود ، مثلا یک فیلد با تایپ text به چندین ترم کوچک می شکند و هر کدام ایندکس گذاری می شود و یک فیلد با تایپ keyword ، کلش یک term است

mapping

توجه خیلی مهم :

در صورتی که بخواهیم مپینگ رو ثابت بزاریم ، یعنی داینامیک به صورت دیفالت نباشه ، خیلی از ساختار هایی که ابتدا تو مپ تعریف می کنیم ، قابل تغییر نیست و هر بار نیازه reindex کنیم

بهتره قبل از مپ دستی ، تمامی فیلد ها و ساختار ها رو بررسی کنیم چون هر بار reindex کلی دردسر داره

در صورتی که مپ رو به ایندکس ندهیم ، جنریک ترین تایپ دیفالت رو خودش متناسب به داده در نظر می گیره و بدیش اینه دیگه امکان تغییر در مپ وجود نداره ( می تونیم اضافه کنیم ولی نمی توانیم مپ موجود رو تغییر بدیم ) همچنین در صورتی که بخواهیم مپ رو تغییر بدیم تنها روش reindex کردن هست .

  • روش اول اینه موقع ساخت ایندکس ، همون جا مپ رو بدیم

                PUT /my-index-000001
              {
                "mappings": {
                  "properties": {
                    "age":    { "type": "integer" },  
                    "email":  { "type": "keyword"  }, 
                    "name":   { "type": "text"  }     
                  }
                }
              }
    

روش دوم اینه بعد ساخت ایندکس ، مپ کنیم

      PUT /my-index-000001/_mapping
    {
      "properties": {
        "employee-id": {
          "type": "keyword",
          "index": false
        }
      }
    }

بهتر است مپ کردن با توجه به ساختار داده رو غیرفعال کنیم , ۲ روش می توان تنظیم کرد که اگر داده شامل فیلدی بود که خارج از ساختار است ، آن را نادیده بگیرد(false) و حالت دوم اینکه تمامی داده را با خطا برگرداند و چیزی ذخیره نکند (strict) :

{
  "mappings": {
    "dynamic": "strict",  // در این حالت اگر ورودی تایپی متفاوت داشته باشد خطا می خورد و سطر ذخیره نمی شود
    "properties": {
      // Define your properties explicitly here
    }
  }
}
  • توجه شود در صورتی که داینامیک فالس باشد ، فیلد های خارج از مپ در جیسون _source ذخیره میشوند ولی ایندکس نمیشوند و به این روش می توانیم مشخص کنیم در سورس چه فیلد هایی بشیند :
PUT /your_index
{
  "mappings": {
    "dynamic": "false",
    "_source": {
      "includes": ["field1", "field2", "field3"] // اینجا میگیم تنها این ۳ فیلد اجازه دارن
    },
    "properties": {
      "field1": { "type": "text" },
      "field2": { "type": "keyword" },
      "field3": { "type": "date", "format": "yyyy-MM-dd" }
    }
  }
}


text vs keyword

اگر بخواهیم یک فیلد استرینگ را آنالیز کرده و فول تکست سرچ کنیم باید فیلد را text بزاریم ، برای متن ها و دیسکریپشن و …

اما اگر استرینگ یک کلید هست و نیاز به aggs یا exact matching هست برای فیلتر یا مرتب کردن ، باید از keyword استفاده کنیم . توجه کنیم کل keyword یک term هست و آنالیز یا شکسته نمی شود مانند ID , tag , lable , username

و به صورت دیفالت هم می توان یک فیلد ، هر دو باشد به صورت زیر

اگر یک فیلد تکست را ‌خیره کنیم ، احتمالا الستیک به شکل زیر ، آن را ذخیره کند (dynamic mapping ):

"description": {
    "type": "text",
    "fields": {
        "keyword": {
            "type": "keyword",
            "ignore_above": 256
        }
    }
}

و در نهایت اگر می خواهیم یک فیلد تنها ذخیره شود ، بدون آنالیز و ایندکس باید index: false و تایپ type : keyword باشد

  "field_without_index": {
    "type": "keyword",
    "index": false
  }
  

bulk create

POST /_bulk
{ "create": {"_id": "7", "_index": "index1"} }
{ "my_field": "foo" }
{ "create": {"_index": "index1"} }
{ "my_field": "foo2" } 

bulk update

POST _bulk
{ "update" : {"_id" : "1", "_index" : "index1", "retry_on_conflict" : 3} }
{ "doc" : {"field" : "value"} }
{ "update" : { "_id" : "0", "_index" : "index1", "retry_on_conflict" : 3} }
{ "script" : { "source": "ctx._source.counter += params.param1", "lang" : "painless", "params" : {"param1" : 1}}, "upsert" : {"counter" : 1}}

update without id

در این صورت چون ایدی برای آپدیت مهم نیست باید کوییری بزنیم و سپس فیلد مورد نظر را آپدیت کنیم

POST feeds/_update_by_query
{"script": {
      "source":"ctx._source.title_fa = 'salam1243';ctx._source.sentiment.negative = '0.47';ctx._source.summary_fa ='salam1234';",
      "lang": "painless"
    },
    "query": {
      "term": {
            "common_key.keyword": "b9e0c6de-9613-404d-9377-bdc43175d3b1"
      }
    }
    }



mget - multi get

یکی از روش ها برای گرفتن داکیومنت ها با استفاده از ID ، این روش زمانی استفاده می شود که ما شناسه داکیومنت ها را داشته باشیم .

اگر بخوایم مشخص کنیم چه فیلد هایی می خواییم و چه فیلد هایی نمی خواییم :

GET /_mget

    {
      "docs": [
        {
          "_index": "my-index-000001",               مشخص می کنیم بر روی کدام ایندکس
          "_id": "1",                                 مشخص می کنیم بر روی کدام ایدی
          "_source": [ "field3", "field4" ],           مشخص می کنیم  کدام فیلد ها رو می خوایم
        },
        {
          "_index": "my-index-000001",
          "_id": "2",
                    "_source": {
                    "include": [ "user" ],                       مشخص می کنیم  کدام فیلد ها رو می خوایم
                    "exclude": [ "user.location" ]                مشخص می کنیم  کدام فیلد ها رو نمی خوایم
                    "stored_fields": [ "field1", "field2" ]         ترتیب
                    "routing": "key2"                               انتخاب شارد
                  }
        }
      ]
    }

query

خیلی قوی تر از مالتی گت هست و داخل سرچ استفاده میشود

شامل دو دسته میشود : لیف کويری ها که ساده هستند و بدون بول یا نستد استفاده می شوند - کامپوند کوییری ها که ترکیبی اند و پر کاربرد ترینش بول هست

درون api search قرار دارد و بعد از کوییری ، می بایست مشخص کینم

___ leaf query

match ------- در مچ باید کلمات دقیق باشند .

prefix ------- اگر ابتدای کلمه را می دانیم باید از prefix استفاده کنیم .

match_phrase ----- ترتیب عبارت هم مهم است .

fuzzy ----- غلط های املایی رو درست می کنه .

term ------ زمانی که می خوهیم سرچ دقیق بر روی عدد تاریخ یا استیرینگ بزنیم ، توجه شود روی تکست کار نمی کند .

range -------- ترم لول است و بازه ای از نوع مشخص یگیرد

    GET /_search
    {
      "_source" : ["title" , "age " ] ,         مشخص می کنه چه فیلد هایی و ترتیب آنها
      "query": {                                باید درون کوییری مشخص کنیم که match , term , range ,....
        "match": {                                   در متچ ، باید کله دقیق برابر مقدار باشد تا پیدا شود ، مقدار اول کلید و مقدار دوم متن مورد نظر هست
          "field1": {                                                        فیلدی که در مچ باید جستوجو درون آن انجام شود
            "query":
                  {
                    "query": "Programs Rating",                متن جستوجو
                    "operator": "and" ,                        باید تمام متن در خروجی باشد
                    "fuzziness": "AUTO",                        اجازه می دهد که به صورت فازی سرچ کنیم
                  }

          }
        }
      }
    }

___ compound query

ابتدا یک آبجکت بول میسازیم و ۴ روش برای ایجاد کامپوند کویری داریم : درون موارد زیر می توانیم شرایط لیف کویری رو بنویسیم .توجه شود در هر کدام از موارد زیر میتوان چند شرط لیف کوییری گذاشت .

must ------- که یعنی باید درون کویری شرط های آن باشد

should ----- اگر شرط های این باشه امتیاز آن بالا تر می ره . به عبارت دیگر اگر ریزالت ما ۴۰ تا باشه ، شولد هیچ تاثیری توی تعداد نتایج نداره ، اما تو نمره و ترتیب آنها نقش داره .

filter ----- در نهایت می توان با فیلتر ، خروجی را فیلتر کرد . همچنین می توان گفت ترم لول ها درون فیلتر قرار می گیرند ، مثل term , range

must_not ---- نباید این شرط ها درون نتیجه باشد .

    POST exploit/_search
    {
      "size": 10,
      "query": {
        "bool": {
          "must": [
            {
              "match": {
                "type": {
                  "query": "Linux Kernel",
                  "operator": "and"
                }
              }
            },
            {
              "match": {
                "platform": {
                  "query": "Linux mac",
                  "operator": "or"
                }
              }
            }
          ],
          "filter": [
            {
              "range": {
                "date": { "gte" : "2007-12-29T00:00:00Z", "lte" : "2023-12-29T00:00:00Z" } 
              }
            }
          ]
        }
      }
    }

اگر بخواهیم درون یک کوییری چند شرط بزاریم ، باید از bool استفاده کنیم ، خود بول باید یکی از موارد must و filter و should و must_not را بگیرد .

اینسرت تکی

curl -POST ‘localhost:9200/exploit/_doc’ -H ‘Content-Type: application/json’ -d’ { “timestamp”: “2018-01-24 12:34:56”, “message”: “User logged in”, “user_id”: 4, “admin”: false } ’

curl -X PUT “localhost:9200/exploit/_bulk?pretty” -H ‘Content-Type: application/json’ -d’ { “create”: { } } { “@timestamp”: “2099-05-07T16:24:32.000Z”, “event”: { “original”: “192.0.2.242 - - [07/May/2020:16:24:32 -0500] “GET /images/hm_nbg.jpg HTTP/1.0” 304 0” } } { “create”: { } } { “@timestamp”: “2099-05-08T16:25:42.000Z”, “event”: { “original”: “192.0.2.255 - - [08/May/2099:16:25:42 +0000] “GET /favicon.ico HTTP/1.0” 200 3638” } } ’

مرتب بر اساس آیدی

http://192.168.13.248:9200/exploit/_search/?size=1000&pretty=true&sort=_id