🔗Elasticsearch 6.4.3 Ссылка для скачивания
для удобства,Экологическое использованиеWindows
🍑После декомпрессии Конфигурация
elasticsearch.yml
ik
токенизатор(Загруженная версия должна соответствовать Es.
)
Как показано ниже,После декомпрессиитокенизаторнадевать
plugins
в каталоге,ik
Каталог необходимо создать самостоятельно.
Windows
среда,оказатьсяbinкаталогelasticsearch.bat
Просто дважды щелкните。SpringBoot 2.1.5.RELEASE
,Выберите версию в соответствии с реальной ситуацией. <!--elasticsearch-->
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-elasticsearch</artifactId>
<version>2.1.6.RELEASE</version>
</dependency>
yaml
Конфигурацияproperties
Конфигурацияspring.data.elasticsearch.cluster-name=community
spring.data.elasticsearch.cluster-nodes=127.0.0.1:9300
Решение:
Видеоруководство по интеграции SpringBoot с Elasticsearch
import lombok.Data;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;
// Укажите Эс индекс тип Шардинг резервное копирование
@Document(indexName = "discusspost", type = "_doc", shards = 6, replicas = 3)
@Data
public class DiscussPost implements Serializable {
private static final long serialVersionUID = 114809849189593294L;
// Определите первичный ключ
@Id
private Integer id;
// Соответствующий тип документа
@Field(type = FieldType.Integer)
private Integer userId;
/**
* type тип
* analyzer парсер хранилища
* searchAnalyzer парсер запросов
*/
@Field(type = FieldType.Text, analyzer = "ik_max_word", searchAnalyzer = "ik_smart")
private String title;
@Field(type = FieldType.Text, analyzer = "ik_max_word", searchAnalyzer = "ik_smart")
private String content;
}
ElasticsearchRepository
В нем много распространенных методов@Repository
public interface DiscussPostRepository extends ElasticsearchRepository<DiscussPost, Integer> {
}
/**
* @author : look-word
* 2022-11-03 18:56
**/
@SpringBootTest
@RunWith(SpringRunner.class)
public class ElasticSearchTest {
@Resource
private DiscussPostRepository discussPostRepository;
@Resource
private DiscussPostMapper discussPostMapper;
@Resource
private ElasticsearchTemplate elasticsearchTemplate;
@Test
public void testInsert() {
// Синхронизируйте результаты запроса с Es
discussPostRepository.save(discussPostMapper.selectDiscussPostById(241));
}
@Test
public void testInsertAll() {
// Пакетный импорт discussPostRepository.saveAll()
discussPostRepository.saveAll(discussPostMapper.selectDiscussPosts(101, 0, 100));
}
/**
* тествозобновлять */
@Test
public void testUpdate() {
DiscussPost discussPost = discussPostMapper.selectDiscussPostById(241);
обсудитьPost.setContent("Я люблю Китайскую Народную Республику, я китаец");
discussPostRepository.save(discussPost);
}
/**
* тест модифицировать
*/
@Test
public void testDelete() {
discussPostRepository.deleteById(241);
}
/**
* тестовый запрос
*/
@Test
public void testSelect() {
// Создание условий запроса
SearchQuery searchQuery = new NativeSearchQueryBuilder()
// (значение запроса, поле запроса 1, поле запроса 1) Соответствует заголовку или содержит ли заголовок Интернет Bitter Winter
.withQuery(QueryBuilders.multiMatchQuery("Интернет-магазин", "title", "title"))
.withSort(SortBuilders.fieldSort("type").order(SortOrder.DESC)) // сортировать
.withSort(SortBuilders.fieldSort("score").order(SortOrder.DESC))
.withSort(SortBuilders.fieldSort("createTime").order(SortOrder.DESC))
.withPageable(PageRequest.of(0, 10)) // Пагинация
.withHighlightFields(
new HighlightBuilder.Field("title").preTags("<em>").postTags("</em>"),
new HighlightBuilder.Field("content").preTags("<em>").postTags("</em>")
).build(); //Выделять
Page<DiscussPost> page = discussPostRepository.search(searchQuery);
page.get().forEach(System.out::println);
}
/**
* тестовый запрос Выделить
*/
@Test
public void testSelectHighlight() {
// Создание условий запроса
SearchQuery searchQuery = new NativeSearchQueryBuilder()
.withQuery(QueryBuilders.multiMatchQuery("Интернет-магазин", "title", "content"))
.withSort(SortBuilders.fieldSort("type").order(SortOrder.DESC)) // сортировать
.withSort(SortBuilders.fieldSort("score").order(SortOrder.DESC))
.withSort(SortBuilders.fieldSort("createTime").order(SortOrder.DESC))
.withPageable(PageRequest.of(0, 10)) // Пагинация
.withHighlightFields(
new HighlightBuilder.Field("title").preTags("<em>").postTags("</em>"),
new HighlightBuilder.Field("content").preTags("<em>").postTags("</em>")
).build(); //Выделять
Page<DiscussPost> page = elasticsearchTemplate.queryForPage(searchQuery, DiscussPost.class, new SearchResultMapper() {
@Override
public <T> AggregatedPage<T> mapResults(SearchResponse response, Class<T> aClass, Pageable pageable) {
SearchHits hits = response.getHits();
if (hits.getTotalHits() <= 0) {
return null;
}
List<DiscussPost> list = new ArrayList<>();
for (SearchHit hit : hits) {
DiscussPost post = new DiscussPost();
String id = hit.getSourceAsMap().get("id").toString();
post.setId(Integer.parseInt(id));
String userId = hit.getSourceAsMap().get("userId").toString();
post.setUserId(Integer.parseInt(userId));
String title = hit.getSourceAsMap().get("title").toString();
post.setTitle(title);
String content = hit.getSourceAsMap().get("content").toString();
post.setContent(content);
String type = hit.getSourceAsMap().get("type").toString();
post.setType(Integer.parseInt(type));
String status = hit.getSourceAsMap().get("status").toString();
post.setStatus(Integer.parseInt(status));
String createTime = hit.getSourceAsMap().get("createTime").toString();
post.setCreateTime(new Date(Long.parseLong(createTime)));
String commentCount = hit.getSourceAsMap().get("commentCount").toString();
post.setCommentCount(Integer.parseInt(commentCount));
String score = hit.getSourceAsMap().get("score").toString();
post.setScore(Double.parseDouble(score));
// Обработка основных моментов
HighlightField titleField = hit.getHighlightFields().get("title");
// На странице несколько выделенных слов Показать только первый
if (titleField != null) {
post.setTitle(titleField.getFragments()[0].toString());
}
HighlightField contentField = hit.getHighlightFields().get("content");
if (contentField != null) {
post.setTitle(contentField.getFragments()[0].toString());
}
list.add(post);
}
return new AggregatedPageImpl(list, pageable, hits.getTotalHits(), response.getAggregations(), response.getScrollId(), hits.getMaxScore());
}
});
page.get().forEach(System.out::println);
}
}