1. Идеи для поиска содержимого статьи
В предыдущей статье говорилось о том, как интегрировать ES 5 в Spring Boot 2.0. В этой статье рассказывается о конкретных практических мерах. Давайте кратко поговорим о том, как реализовать конкретную реализацию статей, вопросов и ответов. Идея реализации очень проста:
Если вы звоните по поиску непосредственно здесь, вы можете легко найти неудовлетворительные вещи. Потому что поиск контента фокусируется на подключении контента. Таким образом, метод обработки здесь относительно низок, и я надеюсь достичь лучшего метода поиска с большей общением. Это должно получить много фраз через причастие слова, а затем использовать фразы, чтобы точно соответствовать фразам.
ES Установка плагина IK Word Segmenter очень проста. Первым шагом является загрузка соответствующей версии https://github.com/medcl/elasticsearch-analysis-ik/releases. Второй шаг-создать новую папку IK в каталоге Elasticsearch-5.5.3/Plugins, а также копировать неразличимый файл Elasticsearch-Analysis-IIK-55.3.3.zip в каталог Elasticsearch-5.1.1/Plugins/IK. Наконец -то перезапустите ES.
2. Причастие в контенте поиска
Установить IK, как это называть?
Первым шагом является то, что когда я ищу здесь контент, я передам его сплайсингом запятых. Так что запятые будут разделены первыми
Второй шаг - добавить себя в поисковые термины, потому что некоторые слова исчезли после причастия IK ... это ошибка
Третий шаг состоит в том, чтобы использовать объект AnalyzereQuestBuilder для получения списка объектов возврата значения после причастия IK
Шаг 4: Оптимизируйте слово «причастие». Например, если все являются словами, то сохраните все; Если есть слова и слова, то сохраните слова; Если есть только слова, то сохраните слова.
Основной код реализации заключается в следующем:
/ *** Причастие в контенте поиска*/ Защищенный список <string> handlingsearchContent (String searchContent) {list <string> SearchTermResultist = new ArrayList <> (); // разделить запятыми, чтобы получить список списков поиска <string> searchTermlist = arrays.aslist (searchContent.split (searchConstant.string_token_split)); // Если поисковый термин превышает 1 слово, причастие IK Word будет получено путем получения списка результатов причастия слова SearchTermlist.foreach (SearchTerm -> {// Поиск тега термина Добавить сам список поисковых терминов и решить проблему Will SearchTersultList.Add (SearchTerm); // Получить поисковый термин ik SiepTermResultList. return Searchtresultist; } / *** Вызовите ES, чтобы получить результат после IK причастия* / Защищенный список <string> getikanalyzesearchterms (String SearchContent) {analyzerequestbuilder ikrequest = new Analyzerequestbuilder (ElasticSearchTemptAte.getClient (), анализ. ikrequest.settokenizer (search constant.tokenizer_ik_max); List <AnalizeSponse.analyzetoken> iktokenlist = ikrequest.execute (). Actionget (). GetTokens (); // Список назначений цикла <string> SearchTers = new ArrayList <> (); iktokenlist.foreach (iktoken -> {searchtermist.add (iktoken.getterm ());}); return haylingikresultterms (SearchTermlist); } / ** * Если Результат причастию слова: шампунь (шампунь, волосы, шампунь, волосы, вода) * - все слова, сохраняют * - слова + слова, только слова * - все слова, сохраняют слова * / private <sring> handleIkResultterms (list <string> search -termlist) {boolean isphrase = false; Логический isword = false; for (строковый термин: SearchTermlist) {if (term.length ()> searchConstant.search_terma_length) {isphrase = true; } else {isword = true; }} if (isword & isphrase) {list <string> phraselist = new ArrayList <> (); SearchTermlist.foreach (term -> {if (term.length ()> searchConstant.search_term_length) {phraselist.add (term);}}); вернуть фразелист; } return SearchTermlist; }3. Поиск оператора запроса
Создайте объект перечисления контента и перечислите поля, которые необходимо искать. Код ContentsearchEnmenum выглядит следующим образом:
Импорт lombok.allargsconstructor; @allargscstrontruppublic enum contentsearchenum {// заголовок заголовка ("title"), // content content ("content"); / *** Поле поиска*/ private String name; public String getName () {return name; } public void setName (string name) {this.name = name; }}Целью поля поиска «совпадение поиска телефона» и установите минимальное значение веса на 1. Код ядра выглядит следующим образом:
/ *** Условия запроса конструкции*/ private void buildmatchquery (boolquerybuilder QueryBuilder, List <string> SearchTermlist) {for (String SearchTerm: SearchTermlist) {for (contentSearchEnmenum searchTermenum: contentSearchenum.values ()) {for (contentSearchEnmenum: contentsearchenum.values ()) QueryBuilder.Stould (QueryBuilders.matchPhraseQuery (SearchTermenum.getName (), SearchTerm)); }} QueryBuilder.minimumShouldMatch (searchConstant.minimum_should_match); }4. Условия фильтра
Есть многое, чем одна вещь, чтобы искать, и иногда спрос такой. Вам необходимо искать в определенной категории, такой как электронная коммерция, чтобы искать продукты под определенным брендом. Затем вам нужно построить некоторые фитлеры для фильтрации. Соответствует операторам SQL, или и, под каждым туда. Используйте метод фильтра для добавления фильтрации в ES. Код заключается в следующем:
/ *** Строительные фильтры*/ private void buildfilterquery (boolquerybuilder boolquerybuilder, целое число, категория строки) {// Фильтр типа содержимого if (type! = Null) {boolquerybuilder typefilterbuilder = QueryBuilders.boolquery (); TypeFilterBuilder.should (QueryBuilders.matchquery (search constant.type_name, type) .lenient (true)); BoolqueryBuilder.filter (TypeFilterBuilder); } // Фильтр категории контента if (! StringUtils.isempty (Category)) {BoolqueryBuilder CategoryFilterBuilder = QueryBuilders.boolquery (); CategoryFilterBuilder.should (QueryBuilders.matchquery (searchConstant.category_Name, категория) .lenient (true)); BoolqueryBuilder.filter (CategoryFilterBuilder); }}Тип - это большой класс, а категория - это небольшой класс, так что он может поддерживать размер и фильтрацию класса. Но что, если вам нужно искать в типе = 1 или тип = 2? Конкретный код реализации очень прост:
TypeFilterBuilder. Should (QueryBuilders.matchQuery (searchConstant.type_Name, 1). Should (QueryBuilders.matchquery (search constant.type_name, 2) .lenient (true));
Благодаря выражениям цепи два должны реализовать или, то есть оператор, соответствующий SQL. Реализация и оператора, соответствующего SQL, достигается через двух BoolqueryBuilders.
5. Условия пейджинг и сортировки
Код сортировки под пейджинг очень прост:
@Override publicbebean searchContent (contentsearchbean contentsearchbean) {integer pageNumber = contentsearchbean.getPageNumber (); Integer pagesize = contentsearchbean.getPagesize (); PageBean <Cetteneentity> resultPagebean = new PageBean <> (); ResultPagebean.SetPageNumber (PageNumber); resultPagebean.SetPagesize (PageSize); // Создание поисковой фразы string searchContent = contentsearchbean.getSearchContent (); List <string> SearchTermlist = handlingsearchContent (SearchContent); // Условия запроса BuolqueryBuilder BoolqueryBuilder = QueryBuilders.boolquery (); BuildMatchQuery (BoolqueryBuilder, SearchTermlist); // Условия фильтра BuildFilterQuery (BoolqueryBuilder, contentsearchbean.gettype (), contentsearchbean.getcategory ()); // Создание условий пейджинга и сортировки Пэг. if (! stringutils.isempty (contentsearchbean.getordername ())) {pagable = pagerequest.of (pageNumber, pageSize, sort.direction.desc, contentsearchbean.getordername ()); } Searchquery searchquery = new ContivensearchQueryBuilder (). WithPagable (Pagable) .withquery (boolquerybuilder) .build (); // search logger.info (" /n contentserviceimpl.searchContent () [" + searchContent + "] /n dsl = /n" + searchquery.getQuery (). ToString ()); Page <bettleentity> contentPage = contentRepository.search (searchQuery); resultPageBean.SetResult (contentPage.getContent ()); resultPagebean.SetTotalCount ((int) contentPage.getTotalelements ()); resultPageBean.SetTotalPage ((int) contentPage.getTotalelements ()); resultPageBean.SetTotalPage ((int) contentPage.getTotalelements () / resultPagebean.getPagesize () + 1); вернуть результатпаджбан; }Используйте тряпкий объект для построения параметров пейджинга и укажите соответствующие поля сортировки и порядок сортировки (DESC ASC).
6. Резюме
Эта идея относительно проста. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать wulin.com больше.