Rumah >Java >Bagaimana untuk mencari semua medan entiti yang diindeks dalam ElasticSeacrch menggunakan hibernateSearch 6

Bagaimana untuk mencari semua medan entiti yang diindeks dalam ElasticSeacrch menggunakan hibernateSearch 6

PHPz
PHPzke hadapan
2024-02-11 17:15:111227semak imbas

editor php Baicao memperkenalkan kaedah untuk menggunakan Hibernate Search 6 untuk mencari semua medan entiti indeks dalam Elasticsearch. Hibernate Search 6 ialah enjin carian teks penuh yang berkuasa yang menyepadukan dengan lancar dengan Elasticsearch. Dengan mengkonfigurasi dan menggunakan Hibernate Search 6, anda boleh mengindeks semua medan entiti dengan mudah ke dalam Elasticsearch dan melaksanakan keupayaan carian teks penuh yang cekap. Artikel ini akan memberi anda butiran tentang cara mengkonfigurasi dan menggunakan Carian Hibernate 6 untuk mencapai matlamat ini. Mengikuti langkah dalam artikel ini, anda akan dapat membina enjin carian teks penuh yang berkuasa dengan cepat dan meningkatkan keupayaan carian aplikasi anda.

Kandungan soalan

Saya mempunyai kaedah berikut untuk mencari dalam elasticsearch menggunakan api carian hibernate. Saya menghantar nilai rentetan pertanyaan sebagai "addresses.address_key:123" yang dicari dalam addresses.address_key seperti yang dinyatakan dalam medan(addresses.address_key).

Cara membuat kaedah ini menerima sebarang input dalam rentetan pertanyaan, contohnya: first_name:john dan buat ia mencari dalam semua medan teks penuh.

versi carian elastik: 8.10 versi hibernatesearch: 6.2.2

public page<employee> searchemployee(string querystring) {
       try {
            searchsession searchsession = search.session(entitymanager);

            searchresult<employee> searchresult = searchsession.search(employee.class)
                    .extension(elasticsearchextension.get())
                    .where(f -> f.simplequerystring().fields("addresses.address_key").matching(querystring))
                    .fetch(math.tointexact(page.getoffset()), page.getpagesize());

            page<employee> pageresult = new pageimpl<>(searchresult.hits(), page, searchresult.total().hitcount());
            return pageresult;
        } catch (searchexception pe) {
           throw pe;
        }
}

Kelas entiti diindeks:

@Indexed(index = "employee")
public class Employee {

  @FullTextField(name = "employee_key")
  private String employeeKey;

  @FullTextField(name = "first_name")
  private String firstName;
    
  @IndexedEmbedded(includeEmbeddedObjectId = true, includeDepth = 2)
  private Address addresses;
}

public class Address {
    
  @FullTextField(name = "address_key")
  private String addressKey;

  @FullTextField(name = "street_name")
  private String streetName;

}

Penyelesaian

Anda boleh sasarkan berbilang medan secara eksplisit apabila mentakrifkan predikat:

searchresult<employee> searchresult = searchsession.search(employee.class)
        .where(f -> f.simplequerystring()
                .fields("employee_key", "first_name", "addresses.address_key")
                .matching(querystring))
        .fetch(math.tointexact(page.getoffset()), page.getpagesize());

Tiada pilihan untuk menyasarkan hanya "semua medan teks" pada masa ini; lihat https://www.php.cn/link/0b36451530d9491114523d4b66253837.

Selain itu, untuk menjadi jelas, sintaks rentetan pertanyaan ringkas tidak menyokong rujukan eksplisit kepada medan dalam rentetan pertanyaan.

Dalam contoh ini:

f.simplequerystring().fields("addresses.address_key")
        .matching("addresses.address_key:123")

...Awalan "address.address_key:" ("addresses.address_key:123") dalam rentetan carian tidak mempunyai makna khusus dan hanya akan ditafsirkan sebagai istilah yang terdapat dalam dokumen.

Anda juga boleh menulis seperti ini:

f.simplequerystring().fields("addresses.address_key")
        .matching("addresses.address_key 123")

Tetapi sebenarnya, saya rasa apa yang anda mahukan ialah ini:

f.simpleQueryString().fields("addresses.address_key")
        .matching("123")

Atas ialah kandungan terperinci Bagaimana untuk mencari semua medan entiti yang diindeks dalam ElasticSeacrch menggunakan hibernateSearch 6. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam