توی این پست میخوایم اصل ماجرا رو جمع و جور کنیم تا توی پست بعدی بریم سراغ اسکریپت نویسی و آنالایزر ها
GET firstindex/_count GET /firstindex/_doc/1 GET firstindex/_doc/1/_source GET /firstindex/_search { "query": { "term": { "username": "Ali" } }} GET /firstindex/_search
{
"query": {
"range" : {
"id" : {
"gte" : 20
}}}
GET /firstindex/_search
{
"query": {
"range" : {
"id" : {
"lte" : 20
}
}}}
خب، همین قدر بسه، بریم ببینیم این ها چی هستن
اولین کد همونجور که معلومه، تعداد doc های index رو نشون میده
دومی، اطلاعات doc 1 رو برمیگردونه و سومی هم فقط فیلد های doc 1
چهارمی هم هر Username ای که علی باشه
و اما پنجمی، پنجمی از یک range id استفاده میکنه، یعنی چند تا id، و gte هم یعنی مساوی یا کوچک تر از عدد 20
ششمی هم همونه، فقط بزرگ تر یا مساوی 20
دقت کنید که روی آی دی های عددی کار میکنه
اگریگیشن که در الاستیک به صورت aggs نوشته میشود، برای به دست آوردن لیستی از doc ها با یک فیلد یکسان است، یعنی چی؟
مثلا من میخوام ببینم چند تا قمی دارم، چند تا تهرانی، و چند تا اصفهانی، میخواهم به آن هایی که بیشتر هستند یک کد تخفیف بدهم یا مثلا برنامه ام را در شهر آنها اجرا کنم
پس یک اگریگیشن روی city user ها میزنم و دسته ها را به دست می آورم
GET /firstindex/_search
{
"aggs": {
"citys": {
"terms": {
"field": "city",
"size": 10000
}}}}
اینجا ما روی فیل city aggs زدیم و 10000 تای اول رو خواستیم
سایز دیفالت 10 هست، پس اینو در نظر داشته باشین تا به مشکل نخورین
نکته مهم:
aggs فقط روی فیلد های keyword کار میکنه و روی فیلد های string جواب نمیده، اما چرا؟
چون keyword ها یک مقدار ثابت و کلیدی هستند، اما استرینگ ها حالت متن و اطلاعات محتوایی دارند، مانند این است که روی متن مقالات اگریگیشن بزنید.
اسم citys هم فقط یک اسم است، برای قاطی نشدن با بقیه اگریگیشن ها (که الان توضیح میدم) باید اسم تعیین کرد
اسم میتواند هر چیزی باشد و اصلا اهمیتی ندارد
و حالا 2 تا اگریگیشن با هم:
GET /users/_search
{
"aggs": {
"citys": {
"terms": {
"field": "city",
"size": 10000
}
},
"ten_years": {
"terms": {
"field": "age"
} } } }
POST /users/_search
{
"aggs": {
"citys": {
"terms": {
"field": "city",
"size": 20
},
"aggs": {
"pageination": {
"bucket_sort": {
"sort": [
{
"sort_field_1": {
"order": "asc"
}
},
{
"sort_field_2": {
"order": "desc"
}
},
"sort_field_3"
]}}}}}}
در اینجا از bucket_sort استفاده کرده ایم، میتوان با آن چند sort انجام داد، ما به ترتیب اولویت های sort را sort_fiel_1 و 2 و 3 به ترتیب گذاشته ایم (میتوانند فیلد های مجازی هم باشند)
default order هر order desc هست و نیازی به تعریف آن نیست
مرتب سازی در الاستیک سرچ بحث بزرگی دارد، اما یک مثال ساده اش این میشود:
GET /users/_search
{
"query": {
"range": {
"id": {
"lte": 20
}} },
"sort": [
{
"age": {
"order": "desc"
}}]}
در این کد، ما تمام آی دی های بیشتر از 200 یا مساوی 200 را گرفته ایم و آنها را بر اسا فیلد age از بزرگ به کوچک مرتب کرده ایم
desk در order به معنای از بزرگ به کوچک است و برعکس آن، asc است
و حالا sort در اگریگیشن:
POST /users/_search
{
"aggs": {
"citys": {
"terms": {
"field": "city",
"size": 20
},
"aggs": {
"pageination": {
"bucket_sort": {
"from": 10,
"size": 10
}}}}}}
فیلد های مجازی، فیلد هایی در داک ما هستند که واقعا وجود ندارند، این فیلد ها برای مرتب سازی، و... استفاده میشوند، فیلد های مجازی فقط در لحظه اجرای اسکریپت وجود دارند و مانند فیلد های عادی هستند، با این فرق که در doc ما ذخیره نمیشوند
در مبحث اسکریپت ها بیشتر فیلد های مجازی رو بررسی میکنیم، ولی فعلا اینجا میخوایم یک مثال ساده اش رو با هم توی اگریگیشن ببینیم
POST /users/_search
{
"aggs": {
"a1": {
"terms": {
"field": "age",
"order": {"_Sort": "desc"}
},
"aggs":{
"_Sort":{
"sum":{
"field":"age, age"
}}}}}}
ما اینجا sort را بر اساس فیلد _Sort گذاشته ایم، اما واقعا در doc مان فیلد _Sort نداریم و این یک فیلد مجازی هست.
البته شما در "field":"age, age" به جای , نقطه قرار دهید
فیلد های مجازی برای اگری ها، در یک اگری درونی دخیره میشود، آن هم یک اسم دلخواه میگیرد که ما نام آن را _Sort گذاشته ایم
بهتر است، اول اسم فیلد های مجازی، _ (underline) قرار دهیم تا با فیلد های عادی قاطی نشود
در این فیلد، ما یک عمل sum انجام داده ایم که بر روی فیلد های age, age انجام گرفته، یعنی این دو فیلد را با هم جمع کرده ایم تا یک فیلد مجازی بسازیم.
به جای استفاده از sum، میتوان از avg و max و min هم استفاده کرد، max به معنای هرکدام که بزرگ تر بود، min هر کدام کوچک تر بود و avg هم میانگین آن ها
GET /users/_search
{
"query": {
"match_phrase": {
"content": "Ali"
}
}
}
این جستجوی ساده، عبارت Ali را دقیقا در content جستجو میکند، یعنی کلمه Ali باید دقیقا در آن با فاصله باشد، مانند "word" در Google
GET /users/_search
{
"query": {
"match_phrase": {
"content": {
"query": "سبک زندگی اسلامی",
"boost": 10
}}}}
هنگام داشتن چند تا query، امتیاز هر کوئری 1 در نظر گرفته میشود، اگر در یک index، 2 کوئری درست شوند، امتیاز آن ایندکس 2 میشود، هر چند الاستیک سرچ دقیقا 1 نمیدهد و عدد ممیزی خاصی میدهد.
با Boost میتوانید حداکثر امتیاز را بیشتر کنید تا اولویت آن کوئری را بالا ببرید
POST qanonindex-v03/_search
{
"size": 4,
"from": 4,
"_source": ["username", "age"],
"query": {
"bool": {
"must_not": [
{
"term": {
"username": "Ali"
}
},
{
"match": {
"age": "23" } }]}}}
در پست قبل must را توضیح دادیم
اگر یادتان نیست باید بهتر میخواندید!
بهتر بود یادداشت هم بردارید
Must_not درست برعکس آن است، و به معنای این است که هردو شرط برقرار نباشند
جلسه ی بعد
❤️💬