Pencarian teks lengkap dengan Solr

1. Ikhtisar

Pada artikel ini, kita akan menjelajahi konsep dasar di mesin pencari Apache Solr - pencarian teks lengkap.

Apache Solr adalah kerangka kerja sumber terbuka, dirancang untuk menangani jutaan dokumen. Kita akan membahas kapabilitas intinya dengan contoh menggunakan pustaka Java - SolrJ.

2. Konfigurasi Maven

Mengingat fakta bahwa Solr adalah open source - kita cukup mengunduh biner dan memulai server secara terpisah dari aplikasi kita.

Untuk berkomunikasi dengan server, kami akan menentukan ketergantungan Maven untuk klien SolrJ:

 org.apache.solr solr-solrj 6.4.2 

Anda dapat menemukan ketergantungan terbaru di sini.

3. Mengindeks Data

Untuk mengindeks dan mencari data, kita perlu membuat inti ; kami akan membuat satu item bernama untuk mengindeks data kami.

Sebelum melakukannya, kami membutuhkan data untuk diindeks di server, sehingga dapat dicari.

Ada banyak cara berbeda untuk mengindeks data. Kita dapat menggunakan penangan impor data untuk mengimpor data langsung dari database relasional, mengunggah data dengan Solr Cell menggunakan Apache Tika atau mengunggah data XML / XSLT, JSON dan CSV menggunakan penangan indeks.

3.1. Mengindeks Dokumen Solr

Kita dapat mengindeks data menjadi inti dengan membuat SolrInputDocument . Pertama, kita perlu mengisi dokumen dengan data kita dan kemudian hanya memanggil API SolrJ untuk mengindeks dokumen:

SolrInputDocument doc = new SolrInputDocument(); doc.addField("id", id); doc.addField("description", description); doc.addField("category", category); doc.addField("price", price); solrClient.add(doc); solrClient.commit();

Perhatikan bahwa id secara alami harus unik untuk item yang berbeda . Memiliki id dari dokumen yang sudah diindeks akan memperbarui dokumen itu.

3.2. Mengindeks Kacang

SolrJ menyediakan API untuk mengindeks kacang Java. Untuk mengindeks kacang, kita perlu membuat anotasi dengan anotasi @Field :

public class Item { @Field private String id; @Field private String description; @Field private String category; @Field private float price; }

Setelah kami memiliki kacang, pengindeksan langsung dilakukan:

solrClient.addBean(item); solrClient.commit();

4. Pertanyaan Solr

Pencarian adalah kemampuan Solr yang paling kuat. Setelah dokumen kami diindeks di repositori kami, kami dapat mencari kata kunci, frasa, rentang tanggal, dll. Hasilnya diurutkan berdasarkan relevansi (skor).

4.1. Kueri Dasar

Server mengekspos API untuk operasi pencarian. Kita bisa memanggil / memilih atau / query penangan permintaan.

Mari lakukan pencarian sederhana:

SolrQuery query = new SolrQuery(); query.setQuery("brand1"); query.setStart(0); query.setRows(10); QueryResponse response = solrClient.query(query); List items = response.getBeans(Item.class);

SolrJ secara internal akan menggunakan parameter kueri utama q dalam permintaannya ke server. Jumlah record yang dikembalikan adalah 10, diindeks dari nol saat mulai dan baris tidak ditentukan.

Kueri penelusuran di atas akan mencari dokumen apa pun yang berisi kata lengkap "brand1" di setiap bidang yang diindeks. Perhatikan bahwa pencarian sederhana tidak membedakan huruf besar / kecil.

Mari kita lihat contoh lainnya. Kami ingin mencari kata apapun yang mengandung “rand” , yang dimulai dengan sejumlah karakter dan diakhiri dengan hanya satu karakter. Kita dapat menggunakan karakter wildcard * dan ? dalam pertanyaan kami:

query.setQuery("*rand?");

Kueri Solr juga mendukung operator boolean seperti di SQL:

query.setQuery("brand1 AND (Washing OR Refrigerator)");

Semua operator boolean harus menggunakan huruf besar semua; yang didukung oleh parser kueri adalah DAN , ATAU, BUKAN , + dan -.

Terlebih lagi, jika kita ingin mencari di bidang tertentu dan bukan di semua bidang yang diindeks, kita dapat menentukan ini dalam kueri:

query.setQuery("description:Brand* AND category:*Washing*");

4.2. Pertanyaan Frase

Sampai saat ini, kode kami mencari kata kunci di bidang yang diindeks. Kami juga dapat melakukan pencarian frase di bidang yang diindeks:

query.setQuery("Washing Machine");

Ketika kita memiliki frase seperti " Mesin Cuci ", parser kueri standar Solr menguraikannya menjadi " Mesin ATAU Cuci ". Untuk mencari seluruh frase, kita hanya dapat menambahkan ekspresi di dalam tanda kutip ganda:

query.setQuery("\"Washing Machine\"");

Kami dapat menggunakan pencarian kedekatan untuk menemukan kata-kata dalam jarak tertentu . Jika kita ingin mencari kata yang setidaknya terpisah dua kata, kita bisa menggunakan query berikut:

query.setQuery("\"Washing equipment\"~2");

4.3. Pertanyaan Rentang

Kueri rentang memungkinkan mendapatkan dokumen yang bidangnya berada di antara rentang tertentu.

Misalkan kita ingin mencari barang yang harganya berkisar antara 100 sampai 300:

query.setQuery("price:[100 TO 300]");

Kueri di atas akan menemukan semua elemen yang harganya antara 100 hingga 300, inklusif. Kita bisa menggunakan " } " dan " { " untuk mengecualikan titik akhir:

query.setQuery("price:{100 TO 300]");

4.4. Filter Query

Kueri filter dapat digunakan untuk membatasi superset dari hasil yang dapat dikembalikan. Kueri filter tidak memengaruhi skor:

SolrQuery query = new SolrQuery(); query.setQuery("price:[100 TO 300]"); query.addFilterQuery("description:Brand1","category:Home Appliances");

Umumnya, kueri filter akan berisi kueri yang umum digunakan. Karena sering kali dapat digunakan kembali, mereka di-cache untuk membuat pencarian lebih efisien.

5. Pencarian Berfaset

Faceting helps to arrange search results into group counts. We can facet fields, query or ranges.

5.1. Field Faceting

For example, we want to get the aggregated counts of categories in the search result. We can add category field in our query:

query.addFacetField("category"); QueryResponse response = solrClient.query(query); List facetResults = response.getFacetField("category").getValues();

The facetResults will contain counts of each category in the results.

5.2. Query Faceting

Query faceting is very useful when we want to bring back counts of subqueries:

query.addFacetQuery("Washing OR Refrigerator"); query.addFacetQuery("Brand2"); QueryResponse response = solrClient.query(query); Map facetQueryMap = response.getFacetQuery();

As a result, the facetQueryMap will have counts of facet queries.

5.3. Range Faceting

Range faceting is used to get the range counts in the search results. The following query will return the counts of price ranges between 100 and 251, gapped by 25:

query.addNumericRangeFacet("price", 100, 275, 25); QueryResponse response = solrClient.query(query); List rangeFacets = response.getFacetRanges().get(0).getCounts();

Apart from numeric ranges, Solr also supports date ranges, interval faceting, and pivot faceting.

6. Hit Highlighting

We may want the keywords in our search query to be highlighted in the results. This will be very helpful to get a better picture of the results. Let's index some documents and define keywords to be highlighted:

itemSearchService.index("hm0001", "Brand1 Washing Machine", "Home Appliances", 100f); itemSearchService.index("hm0002", "Brand1 Refrigerator", "Home Appliances", 300f); itemSearchService.index("hm0003", "Brand2 Ceiling Fan", "Home Appliances", 200f); itemSearchService.index("hm0004", "Brand2 Dishwasher", "Washing equipments", 250f); SolrQuery query = new SolrQuery(); query.setQuery("Appliances"); query.setHighlight(true); query.addHighlightField("category"); QueryResponse response = solrClient.query(query); Map
    
     > hitHighlightedMap = response.getHighlighting(); Map
     
       highlightedFieldMap = hitHighlightedMap.get("hm0001"); List highlightedList = highlightedFieldMap.get("category"); String highLightedText = highlightedList.get(0);
     
    

We'll get the highLightedText as “Home Appliances. Please notice that the search keyword Appliances is tagged with . Default highlighting tag used by Solr is , but we can change this by setting the pre and post tags:

query.setHighlightSimplePre(""); query.setHighlightSimplePost("");

7. Search Suggestions

One of the important features that Solr supports are suggestions. If the keywords in the query contain spelling mistakes or if we want to suggest to autocomplete a search keyword, we can use the suggestion feature.

7.1. Spell Checking

The standard search handler does not include spell checking component; it has to be configured manually. There are three ways to do it. You can find the configuration details in the official wiki page. In our example, we'll use IndexBasedSpellChecker, which uses indexed data for keyword spell checking.

Let's search for a keyword with spelling mistake:

query.setQuery("hme"); query.set("spellcheck", "on"); QueryResponse response = solrClient.query(query); SpellCheckResponse spellCheckResponse = response.getSpellCheckResponse(); Suggestion suggestion = spellCheckResponse.getSuggestions().get(0); List alternatives = suggestion.getAlternatives(); String alternative = alternatives.get(0);

Expected alternative for our keyword “hme” should be “home” as our index contains the term “home”. Note that spellcheck has to be activated before executing the search.

7.2. Auto Suggesting Terms

We may want to get the suggestions of incomplete keywords to assist with the search. Solr's suggest component has to be configured manually. You can find the configuration details in its official wiki page.

We have configured a request handler named /suggest to handle suggestions. Let's get suggestions for keyword “Hom”:

SolrQuery query = new SolrQuery(); query.setRequestHandler("/suggest"); query.set("suggest", "true"); query.set("suggest.build", "true"); query.set("suggest.dictionary", "mySuggester"); query.set("suggest.q", "Hom"); QueryResponse response = solrClient.query(query); SuggesterResponse suggesterResponse = response.getSuggesterResponse(); Map
      
        suggestedTerms = suggesterResponse.getSuggestedTerms(); List suggestions = suggestedTerms.get("mySuggester");
      

The list suggestions should contain all words and phrases. Note that we have configured a suggester named mySuggester in our configuration.

8. Conclusion

This article is a quick intro to the search engine's capabilities and features of Solr.

We touched on many features, but these are of course just scratching the surface of what we can do with an advanced and mature search server such as Solr.

The examples used here are available as always, over on GitHub.