1. أفكار للبحث في محتوى المقالة
تحدثت المقالة السابقة عن كيفية دمج ES 5 في Spring Boot 2.0. تتحدث هذه المقالة عن التدابير العملية المحددة. دعنا نتحدث بإيجاز عن كيفية تنفيذ التنفيذ المحدد للمقالات والأسئلة والأجوبة. فكرة التنفيذ بسيطة للغاية:
إذا اتصلت بالبحث مباشرة هنا ، يمكنك بسهولة العثور على أشياء غير مرضية. لأن بحث المحتوى يركز على اتصال المحتوى. لذا فإن طريقة المعالجة هنا منخفضة نسبيًا ، وآمل أن تحقق طريقة بحث أفضل مع المزيد من التواصل. إنه للحصول على العديد من العبارات من خلال Word Gollle ، ثم استخدام العبارات لمطابقة العبارات بدقة.
ES تثبيت المكون الإضافي لقطاع Word IK بسيط للغاية. الخطوة الأولى هي تنزيل الإصدار المقابل https://github.com/medcl/elasticsearch-analysis-ik/release. والخطوة الثانية هي إنشاء مجلد جديد IK في دليل Elasticsearch -5.5.3/Plugins ، ونسخ الملف غير المدمج من Elasticsearch-Analysis-IK-5.5.3.sip إلى دليل Elasticsearch-5.1.1/Plugins/IK. وأخيرا أعد تشغيل es.
2. البحث عن محتوى البحث
تثبيت IK ، كيف تسميها؟
الخطوة الأولى هي أنه عندما أبحث عن محتوى هنا ، سأمرره مع الربط الفاصلة. لذلك سيتم تقسيم الفواصل أولاً
الخطوة الثانية هي إضافة نفسك إلى مصطلحات البحث ، لأن بعض الكلمات قد اختفت بعد IK Golles ... هذا خطأ
الخطوة الثالثة هي استخدام كائن AnalyzErequestBuilder للحصول على قائمة كائن قيمة الإرجاع بعد النعت IK
الخطوة 4: تحسين نتائج النعت. على سبيل المثال ، إذا كانت كلها عبارة ، فاحتفظ بكل شيء ؛ إذا كانت هناك كلمات وكلمات ، فاحفظ الكلمات ؛ إذا كانت هناك كلمات فقط ، فاحفظ الكلمات.
رمز التنفيذ الأساسي كما يلي:
/ *: // split by possas للحصول على قائمة قائمة مدة البحث <String> searchtermlist = arrays.aslist (searchContent.split (searchConstant.string_token_split)) ؛ // إذا كان مصطلح البحث أكبر من كلمة واحدة ، فسيتم الحصول على كلمة IK Word Soldle عن طريق الحصول على Word Result Rist SearchermList.foreach (> {// Term Search TARM ADD ALD LIST WISLE WIST WILLESTERS WILLE SERECTURTULLISTERMALLISTERMSERMSERMARMESTERMS. إرجاع البحث } / *** Call ES للحصول على النتيجة بعد IK Golles* / قائمة محمية <string> getikanalyzeseSearchTerms (سلسلة SearchContent) {AnalyzErequestBuilder IkRequest = new AnalyzErequestBuilder (elasticsearchtemplate.getClient () ، ancyzeAction.instance ، searchConstant.index ، ikrequest.settokenizer (SearchConstant.tokenizer_ik_max) ؛ قائمة <Allezeresponse.analyzetoken> iktokenlist = ikrequest.execute (). Actionget (). getTokens () ؛ // loop issignment list <string> searchtermlist = new ArrayList <> () ؛ iktokenlist.foreach (iktoken -> {searchRethList.add (iktoken.getterm ()) ؛}) ؛ Return HandlingIkResultterms (SearchTermList) ؛ } / ** * إذا كانت كلمة مشاركة النتيجة: شامبو (شامبو ، شعر ، شامبو ، شعر ، ماء) * - كل الكلمات ، احتفظ * - الكلمات + الكلمات ، فقط الكلمات * - كل الكلمات ، احتفظ بالكلمات * / القائمة الخاصة <String> HandleiKResultterMs (قائمة <Tring> searchtermlist) {boolean isphrase = false ؛ Boolean Isword = false ؛ لـ (سلسلة السلسلة: SearchTermList) {if (term.length ()> searchConstant.search_term_length) {iSphRase = true ؛ } آخر {isword = true ؛ }} if (iSword & Isphrase) {list <string> phraselist = new ArrayList <> () ؛ SearchRetherList.foreach (term -> {if (term.length ()> searchConstant.search_term_length) {phraselist.add (term) ؛}}) ؛ إرجاع phraselist. } return searchtermlist ؛ }3. بيان البحث عن استعلام
قم ببناء كائن تعداد المحتوى وسرد الحقول التي تحتاج إلى البحث. رمز ContentSearchTermenum كما يلي:
استيراد lombok.allargsconstructor ؛ allargSconstructorpublic enum ContentSearchTermenum {// title title ("title") ، // content content ("content") ؛ / *** حقل البحث*/ اسم السلسلة الخاصة ؛ السلسلة العامة getName () {return name ؛ } public void setName (اسم السلسلة) {this.name = name ؛ }}حلقة حقل البحث "Monder Search Match" وضبط الحد الأدنى لقيمة الوزن على 1. الرمز الأساسي هو كما يلي:
/ *** إنشاء شروط الاستعلام*/ private void buildmatchquery (boolqueryBuilder QueryBuilder ، قائمة <String> searchtermlist) {for (searchtermer string: searchtermlist) {for (contentSearchTermenum: ContentSearchTermenum.Values ()) { QueryBuilder.should (QueryBuilders.MatchPhraseQuery (SearcherMenum.getName () ، Searchterm)) ؛ }} QueryBuilder.MinimShouldMatch (SearchConstant.minimum_Should_Match) ؛ }4. مرشح شروط
هناك أكثر من شيء واحد للبحث عنه ، وأحيانًا يكون الطلب هكذا. تحتاج إلى البحث تحت فئة معينة ، مثل التجارة الإلكترونية يحتاج إلى البحث عن المنتجات تحت علامة تجارية معينة. ثم تحتاج إلى بناء بعض fitlers للتصفية. المقابلة لبيانات SQL ، أو وتحت أين. استخدم طريقة التصفية لإضافة التصفية في ES. الرمز كما يلي:
/ *** build filters*/ private void buildfilterquery (boolquerybuilder boolquerybuilder ، نوع عدد صحيح ، فئة سلسلة) {// content type filter if (type! = null) KypfilterBuilder.should (querybuilders.matchquery (searchConstant.type_name ، type) .Lenient (true)) ؛ boolquerybuilder.filter (KypeFilterBuilder) ؛ } // مرشح فئة المحتوى if (! stringUtils.isempty (الفئة)) {boolqueryBuilder CatevoryFilterBuilder = QueryBuilders.boolquery () ؛ CategoryFilterBuilder.should (QueryBuilders.Matchquery (SearchConstant.category_name ، الفئة) .Lenient (true)) ؛ boolquerybuilder.filter (categoryfilterbuilder) ؛ }}النوع هو فئة كبيرة وفئة هي فئة صغيرة ، بحيث يمكن أن تدعم الحجم وتصفية الفئة. ولكن ماذا لو كنت بحاجة إلى البحث في النوع = 1 أو الكتابة = 2؟ رمز التنفيذ المحدد بسيط للغاية:
KypfilterBuilder .should (querybuilders.matchquery (searchConstant.type_name ، 1). يجب أن يكون (querybuilders.matchquery (searchConstant.type_name ، 2) .lenient (true)) ؛
من خلال تعبيرات السلسلة ، يجب على اثنين تنفيذ أو ، أي أو البيان المقابل لـ SQL. يتم تحقيق تنفيذ وبيان المقابل لـ SQL من خلال اثنين من البناء.
5. الظروف الترحيل والفرز
رمز فرز الترحيل بسيط للغاية:
Override Public PageBean SearchContent (ContentSearchBean ContentSearchBean) {Integer Pagenumber = ContentSearchBean.getPagenumber () ؛ integer pagesize = contentSearchBean.getPagesize () ؛ pageBean <Contententity> resultPagebean = new PageBean <> () ؛ resultpagebean.setpagenumber (pagenumber) ؛ resultpagebean.setpagesize (pagesize) ؛ // بناء عبارة Search prase searchContent = ContentSearchBean.getSearchContent () ؛ قائمة <Tring> SearchRuteList = HandlingsearchContent (SearchContent) ؛ // بناء ظروف الاستعلام boolquerybuilder boolquerybuilder = querybuilders.boolquery () ؛ BuildMatchquery (BoolqueryBuilder ، SearchTermList) ؛ // شروط مرشح البناء buildfilterquery (boolquerybuilder ، contentsearchbean.gettype () ، contentsearchbean.getCategory ()) ؛ // بناء ظروف الترحيل والفرز القابلة للبطيئة = pagerequest.of (pagenumber ، pagesize) ؛ if (! stringUtils.isempty (contentSearchBean.getOrderName ())) {pageable = pagerequest.of (pagenumber ، pagesize ، sort.direction.desc ، contentsearchbean.getordername ()) ؛ } searchquery searchquery = new NativeSearchQueryBuilder (). withpageable (قابلة للحياة). // search logger.info (" /n contentServiceImpl.SearchContent () [" + searchContent + "] /n dsl = /n" + searchquery.getQuery (). toString ()) ؛ page <bortententity> contentPage = contentRepository.Search (SearchQuery) ؛ resultpagebean.setResult (contentPage.getContent ()) ؛ resultpagebean.settotalcount ((int) contentPage.getTotalElements ()) ؛ resultpagebean.settotalpage ((int) contentPage.getTotalEments ()) ؛ resultpagebean.settotalpage ((int) contentPage.getTotalElements () / resultpagebean.getPagesize () + 1) ؛ إرجاع النتيجة PageBean ؛ }استخدم الكائن القابل للباحة لإنشاء معلمات الترحيل وتحديد حقول الفرز المقابلة وترتيب الفرز (DESC ASC).
6. ملخص
هذه الفكرة بسيطة نسبيا. آمل أن يكون ذلك مفيدًا لتعلم الجميع ، وآمل أن يدعم الجميع wulin.com أكثر.