Saya menggunakan pegas ElasticsearchRepository untuk menanyakan Elasticsearch:

@Repository
public interface MyDocumentRepository extends ElasticsearchRepository<MyDocument, String>{

}

Saya berhasil menjalankan kueri penelusuran dan mengambil daftar hasil elasticsearch yang dipetakan di kacang MyDocument

private final MyDocumentRepository myDocumentRepository;

...

Pageable pageable = PageRequest.of(0, 10);
QueryBuilder query = QueryBuilders.boolQuery().must(queryStringQuery("my query"));
SearchQuery searchQuery = new NativeSearchQueryBuilder()
        .withQuery(query)
        .withPageable(pageable)
        .withHighlightFields(
                new HighlightBuilder.Field("field1"),
                new HighlightBuilder.Field("field2"))
                .build();

Iterable<MyDocument> = myDocumentRepository.search(searchQuery);

Meskipun kueri yang dikirim ke elasticsearch dan responsnya benar (saya dapat melihat blok sorotan di log debug) dan hasilnya juga sesuai, saya tidak tahu bagaimana cara mendapatkan informasi sorotan dalam kode Java saya.

Saya ingin tidak menggunakan ElasticsearchTemplate dan ResultExtractor untuk mendapatkan informasi sorotan.

Terima kasih sebelumnya!

2
ljmelgui 15 Januari 2020, 16:40

2 jawaban

Jawaban Terbaik

Mengembalikan informasi tambahan dalam SearchHit adalah fitur yang diimplementasikan di cabang master saat ini yang tersedia di versi snaphot. Ini akan dirilis dengan rilis berikutnya (4.0)

Ini bukan kelas SearchHit dari Elasticsearch tetapi kelas baru yang diperkenalkan di Spring Data Elasticsearch.

Dengan versi saat ini (3.2.x) ini hanya mungkin menggunakan hasil mapper kustom (yang tidak akan tersedia lagi di 4.0)

Sunting:

Adapun konfigurasi di versi 4 mendatang, periksa https://docs.spring.io/spring-data/elasticsearch/docs/current-SNAPSHOT/reference/html/#elasticsearch.clients.rest

Dengan konfigurasi ini, Anda kemudian dapat menyuntikkan instance ElasticsearchOperations ke dalam kode Anda, kacang ini didefinisikan dalam kelas AbstractElasticsearchConfiguration. Fragmen kode yang diperlukan:

@Autowired ElasticsearchOperations operations;

...

SearchHits<MyDocument> searchHits = operations.search(searchQuery,
                                        MyDocument.class,
                                        IndexCoordinates.of("index-name");

Untuk informasi lebih lanjut tentang data yang dikembalikan, periksa https://docs.spring.io/spring-data/elasticsearch/docs/current-SNAPSHOT/reference/html/#elasticsearch.operations.searchresulttypes

Kami tahu ada beberapa penghentian dan beberapa perubahan yang melanggar di versi 4.0, tetapi kami akan memiliki API yang lebih bersih dan kami akan memiliki kemungkinan untuk mengembalikan semua metadata hasil pencarian ini, ini tidak mungkin di 3.2

1
P.J.Meisch 15 Januari 2020, 21:44

Sebenarnya jika Anda mendapatkan respons ES, Anda akan memiliki Objek SearchHit. Objek SearchHit ini hanya mewakili Respons HTTP dari hasil ES.

Jika hasil Anda mengenai bidang yang disorot, SearchHit menyediakan Peta Map<String, HighlightField> tempat Anda dapat mengulangi dan memfilter teks dan atribut yang disorot.

1
P.J.Meisch 15 Januari 2020, 17:47