স্থিতিস্থাপক অনুসন্ধান কোয়ের মিশ্রণ অবশ্যই OR এর সাথে করা উচিত


181

আমি বর্তমানে সোলার-ভিত্তিক অ্যাপ্লিকেশনটিকে স্থিতিস্থাপক অনুসন্ধানে স্থানান্তরিত করার চেষ্টা করছি।

আমার এই লুসিন কোয়েরি আছে

(( 
    name:(+foo +bar) 
    OR info:(+foo +bar) 
)) AND state:(1) AND (has_image:(0) OR has_image:(1)^100)

আমি যতদূর বুঝতে পারি এটি হ'ল বুলিয়ান বা:

"নামে থাকা সমস্ত দস্তাবেজ (নামে foo এবং বার) বা (ফুও এবং তথ্য বার) পান that এর পরে শর্ত অনুযায়ী রাজ্যগুলি ফলাফল = 1 এবং ইমেজযুক্ত নথিগুলিকে বুস্ট করুন" "

আমি আবশ্যক সঙ্গে একটি বুল কোয়েরি ব্যবহার করার চেষ্টা করা হয়েছে কিন্তু আমি বুলিয়ান বা অবশ্যই অনুচ্ছেদ পেতে ব্যর্থ হয়। আমার যা আছে তা এখানে:

GET /test/object/_search
{
  "from": 0,
  "size": 20,
  "sort": {
    "_score": "desc"
  },
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "name": "foo"
          }
        },
        {
          "match": {
            "name": "bar"
          }
        }
      ],
      "must_not": [],
      "should": [
        {
          "match": {
            "has_image": {
              "query": 1,
              "boost": 100
            }
          }
        }
      ]
    }
  }
}

আপনি দেখতে পাচ্ছেন যে, "তথ্য" এর জন্য আবশ্যক শর্তগুলি অনুপস্থিত।

কারো কাছে কি কোন সমাধান আছে?

তোমাকে অনেক ধন্যবাদ.

** হালনাগাদ **

আমি আমার ইলাস্টিক অনুসন্ধান অনুসন্ধান আপডেট করেছি এবং সেই ফাংশন স্কোর থেকে মুক্তি পেয়েছি। আমার বেস সমস্যা এখনও বিদ্যমান।


1
এখানে ইলাস্টিক অনুসন্ধান অনুসন্ধানগুলি একত্রিত করার জন্য একটি ভাল ডকুমেন্টেশন রয়েছে: elastic.co/guide/en/elasticsearch/guide/current/…
মিঃ কফি

উত্তর:


426
  • অথবা বানান করা উচিত is
  • এবং অবশ্যই বানান করা আবশ্যক
  • NOR বানান করা উচিত_না

উদাহরণ:

আপনি (গোলাকার এবং (লাল বা নীল)) সমস্ত আইটেম দেখতে চান:

{
    "query": {
        "bool": {
            "must": [
                {
                    "term": {"shape": "round"}
                },
                {
                    "bool": {
                        "should": [
                            {"term": {"color": "red"}},
                            {"term": {"color": "blue"}}
                        ]
                    }
                }
            ]
        }
    }
}

আপনি ও এর আরও জটিল সংস্করণগুলিও করতে পারেন, উদাহরণস্বরূপ আপনি যদি 5 টির মধ্যে কমপক্ষে 3 টির সাথে মিল রাখতে চান তবে আপনি "should" এর অধীনে 5 টি বিকল্প নির্দিষ্ট করতে পারেন এবং 3 এর একটি "সর্বনিম্ন_সোল্ড" সেট করতে পারেন।

আমার বাসা বাঁধার আগে ঠিক কোথায় ছিল না তা সন্ধানের জন্য গ্লেন থম্পসন এবং সেবাস্তিয়ালসনোকে ধন্যবাদ জানাই।

ইলাস্টিক অনুসন্ধান 6-এ "পদ" "ম্যাচ" হয়ে যায় তা নির্দেশ করার জন্য ফাতমাজককেও ধন্যবাদ জানাই।


2
shouldউপরের স্তরে টানতে boolএবং কোনও minimum_should_match: 1কাজ সহ ?
সিড

18
আমি এই উদাহরণটি চেষ্টা করার পরে আমি ফিরে পেতে [term] malformed query, expected [END_OBJECT] but found [FIELD_NAME]। এটি কি কোনওভাবে নির্ভরশীল সংস্করণ?
ড্যানজেজে

26
তারা ডক্সে এ জাতীয় সরল উদাহরণ এবং ব্যাখ্যা জুড়ে না কেন! ডকুমেন্টেশন থেকে উদাহরণ খুব বিভ্রান্তিকর।
নিখিল ওওয়ালেকার

21
6 মাস পরে সমস্ত ইলাস্টিক ডকুমেন্টেশন পড়ার পরে, এই প্রথমবারের মতো আমি সম্পূর্ণরূপে বুঝতে পারি কীভাবে বুলিয়ান যুক্তি প্রয়োগ করা যায়। অফিসিয়াল ডকুমেন্টেশনে আমার মতে স্পষ্টতা নেই।
সেবাস্তিয়ালসনো

3
@ আমির তোমার জন্য আমি কী কী ভুলত্রুটি পরিষ্কার করতে পারি? উপরে দেখানো প্রসঙ্গে, ডিফল্টটি minimum_should1 হয় এবং মোড়কের boolফলে সেই গ্রুপটির ফলস্বরূপ সত্য হয় যদি কমপক্ষে একটি আইটেম মেলে তবে কোনওটি না মিলে মিথ্যা। এই উত্তরটি তৈরি করার জন্য আমার অনুপ্রেরণা ছিল যে আমি ঠিক এই ধরণের সমস্যার সমাধান করছিলাম এবং উপলভ্য ডকুমেন্টেশন এবং এমনকি এই জাতীয় সাইটগুলিতে আমি যে উত্তরগুলি পেয়েছি তা নিখরচায় অস্বাস্থ্যকর ছিল, সুতরাং আমি যতক্ষণ না অনুভব করি যে আমি একটি বেশ শক্ত আঁকড়ে ধরেছি ততক্ষণ গবেষণা চালিয়ে যাচ্ছি যা চলছে তার। আমি উত্তরকে কীভাবে আরও উন্নত করতে পারি সে সম্পর্কে কোনও গঠনমূলক পয়েন্টারকে সানন্দে স্বাগত জানাই।
ড্যানিয়েল ফ্যাকরেল

69

অবশেষে আমি একটি ক্যোয়ারী তৈরি করতে পেরেছি যা আমার কাছে যা চেয়েছিল ঠিক তা করে:

একটি ফিল্টার নেস্টেড বুলিয়ান ক্যোয়ারী। কেন এটি নথিভুক্ত নয় তা আমি নিশ্চিত নই। এখানে কেউ আমাকে বলতে পারেন?

কোয়েরিটি এখানে:

GET /test/object/_search
{
  "from": 0,
  "size": 20,
  "sort": {
    "_score": "desc"
  },
  "query": {
    "filtered": {
      "filter": {
        "bool": {
          "must": [
            {
              "term": {
                "state": 1
              }
            }
          ]
        }
      },
      "query": {
        "bool": {
          "should": [
            {
              "bool": {
                "must": [
                  {
                    "match": {
                      "name": "foo"
                    }
                  },
                  {
                    "match": {
                      "name": "bar"
                    }
                  }
                ],
                "should": [
                  {
                    "match": {
                      "has_image": {
                        "query": 1,
                        "boost": 100
                      }
                    }
                  }
                ]
              }
            },
            {
              "bool": {
                "must": [
                  {
                    "match": {
                      "info": "foo"
                    }
                  },
                  {
                    "match": {
                      "info": "bar"
                    }
                  }
                ],
                "should": [
                  {
                    "match": {
                      "has_image": {
                        "query": 1,
                        "boost": 100
                      }
                    }
                  }
                ]
              }
            }
          ],
          "minimum_should_match": 1
        }
      }    
    }
  }
}

সিউডো-এসকিউএল এ:

SELECT * FROM /test/object
WHERE 
    ((name=foo AND name=bar) OR (info=foo AND info=bar))
AND state=1

দয়া করে মনে রাখবেন যে এটি আপনার নথির ক্ষেত্র বিশ্লেষণ এবং নাম = ফু কীভাবে অভ্যন্তরীণভাবে পরিচালনা করা হয় তা ম্যাপিংয়ের উপর নির্ভর করে। এটি অস্পষ্ট থেকে কঠোর আচরণের ক্ষেত্রে পরিবর্তিত হতে পারে।

"ন্যূনতম_শাল্ড_ম্যাচ": 1 বলেছে যে কমপক্ষে একটির বক্তব্য অবশ্যই সত্য হওয়া উচিত।

এই বিবৃতিটির অর্থ হ'ল যখনই রেজাল্টটিতে কোনও ডকুমেন্ট থাকে যেখানে has_image: 1 রয়েছে এটি ফ্যাক্ট 100 দ্বারা বাড়ানো হয়। ফলাফলের ক্রম পরিবর্তন করে।

"should": [
  {
    "match": {
      "has_image": {
        "query": 1,
        "boost": 100
      }
    }
   }
 ]

মজা কর বন্ধুরা :)


28
পবিত্র জঞ্জাল। কারও কি এর চেয়ে ভাল সমাধান আছে? এটি পোস্ট করার জন্য ধন্যবাদ, তবে এটি কোনও জিজ্ঞাসায় লজিকাল ওআর অর্জনের জন্য একেবারে জটিলতা।
ন্যাকজিচোলসন

THNX, আপনি আমার দিনটি সংরক্ষণ করেছেন)
কিবিবিউ

3
এই কোয়েরিটি কেবল অযৌক্তিকভাবে দীর্ঘ নয়, এর অবচিত সিনট্যাক্স ব্যবহার করে। @ ড্যানিয়েল-ফ্যাকরেল উত্তরটি গ্রহণযোগ্য হওয়া উচিত।
এরিক অ্যালফোর্ড

4
@ এরিক অ্যালফোর্ড এই উত্তরটি ES এর পূর্ববর্তী সংস্করণে ভিত্তিক। একটি ভাল সমাধান প্রদান করতে নির্দ্বিধায়।
জেসি

1
আইডিয়া: ওভার / কাঁটাচামচ ইলাস্টিকস অনুসন্ধান করুন, এটি ব্যবহারকারী-বান্ধব উপায়ে পুনর্লিখন করুন, এতে সহজ ক্যোয়ারী ভাষা যুক্ত করুন, উইন! আমাদের শুধু তহবিল দরকার। আমি আছি! আর কে?
স্লিক

16

এইভাবে আপনি কিবানা ব্যবহার করে একটি বহির্মুখী কোলের একাধিক বুল ক্যোয়ারিতে বাসা বেঁধতে পারেন,

বুল ইঙ্গিত দেয় যে আমরা বুলিয়ান ব্যবহার করছি

অবশ্যই AND এর জন্য for

OR এর জন্য হওয়া উচিত

GET my_inedx/my_type/_search
{
    "query" : {
       "bool": {             //bool indicates we are using boolean operator
            "must" : [       //must is for **AND**
                 {
                   "match" : {
                         "description" : "some text"  
                     }
                 },
                 {
                    "match" :{
                          "type" : "some Type"
                     }
                 },
                 {
                    "bool" : {          //here its a nested boolean query
                          "should" : [  //should is for **OR**
                                 {
                                   "match" : {
                                       //ur query
                                  }
                                 },
                                 { 
                                    "match" : {} 
                                 }     
                               ]
                          }
                 }
             ]
        }
    }
}

এইভাবে আপনি ES এ কোনও কোয়েরি বাসাতে পারেন

"Bool" এর মতো আরও ধরণের রয়েছে -

  1. ছাঁকনি

  2. না অবশ্যই


আপনার উত্তর হুবহু সঠিক, তবে এটি কিছুটা আনাড়ি, এটি যদি আপনার পছন্দ হয় তবে এটি আপনার জন্য একটি ছোট্ট পরামর্শ - আপনাকে এটি সঠিকভাবে সম্পাদনা করতে হবে। সম্ভবত এটি আপনাকে এই উত্তরটিতে আরও পছন্দ দেয় :) আপনার দিনটি খুব সুন্দর হোক।
ধওয়ানিল প্যাটেল

6

আমাকে সম্প্রতি এই সমস্যাটিও সমাধান করতে হয়েছিল এবং প্রচুর বিচার এবং ত্রুটির পরেও আমি এটি নিয়ে এসেছি (পিএইচপিতে, তবে সরাসরি ডিএসএলে মানচিত্র):

'query' => [
    'bool' => [
        'should' => [
            ['prefix' => ['name_first' => $query]],
            ['prefix' => ['name_last' => $query]],
            ['prefix' => ['phone' => $query]],
            ['prefix' => ['email' => $query]],
            [
                'multi_match' => [
                    'query' => $query,
                    'type' => 'cross_fields',
                    'operator' => 'and',
                    'fields' => ['name_first', 'name_last']
                ]
            ]
        ],
        'minimum_should_match' => 1,
        'filter' => [
            ['term' => ['state' => 'active']],
            ['term' => ['company_id' => $companyId]]
        ]
    ]
]

এসকিউএল-তে এরকম কোনও কিসের মানচিত্র:

SELECT * from <index> 
WHERE (
    name_first LIKE '<query>%' OR
    name_last LIKE '<query>%' OR
    phone LIKE  '<query>%' OR
    email LIKE '<query>%'
)
AND state = 'active'
AND company_id = <query>

এই সমস্ত কি মূল minimum_should_matchসেটিংস। এটি ছাড়া filterসম্পূর্ণরূপে ওভাররাইডগুলি should

আশা করি এটি কাউকে সাহায্য করবে!


0
$filterQuery = $this->queryFactory->create(QueryInterface::TYPE_BOOL, ['must' => $queries,'should'=>$queriesGeo]);

ইন mustআপনি ক্যোয়ারী শর্ত অ্যারে যা আপনি সাথে কাজ করতে চান যুক্ত করতে হবে ANDএবং shouldআপনি ক্যোয়ারী অবস্থায় আপনার সাথে কাজ করতে চান যুক্ত করতে হবে OR

আপনি এটি পরীক্ষা করতে পারেন: https://github.com/Smile-SA/elasticsuite/issues/972


0

আপনি যদি সোলার ডিফল্ট বা লুসিন ক্যোয়ারী পার্সার ব্যবহার করে থাকেন তবে আপনি এটিকে সবসময় ক্যোয়ারী স্ট্রিং ক্যোয়ারিতে রাখতে পারেন:

POST test/_search
{
  "query": {
    "query_string": {
      "query": "(( name:(+foo +bar) OR info:(+foo +bar)  )) AND state:(1) AND (has_image:(0) OR has_image:(1)^100)"
    }
  }
}

এটি বলেছে, আপনি ইতিমধ্যে পোস্ট করেছেন এমন একটি, বা দুটির সংমিশ্রণের মতো বুলিয়ান ক্যোয়ারী ব্যবহার করতে পারেন ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.