Yazı hakkında bir yorum bırakmak için tıklayın.
Bu yazıya sizde katkıda bulunabilirsiniz.
Bir ya da birden fazla alanda arama sonuçlardaki metinleri vurgulamak için kullanılan özelliktir. Bunun için Elasticsearch arka planda Lucene highlighter
, fast-vector-highlighter
veya postings-highlighter
kullanmaktadır. Daha iyi anlamanız için örneğin google.com üzeride bir arama yaptığınızda eşleşen kelimelerin arama sonuçlarında koyu renkli geldiğini görebilirsiniz. Elasticsearch Highlight özelliği bunu yapabilmenizi sağlamaktadır. Bu özellik ile ilgili bir arama örneği oluşturalım:
{
"query" : {...},
"highlight" : {
"fields" : {
"content" : {}
}
}
}
Yukarıdaki örnekte, content
alanı her bir arama için vurgulama yapılacak alandır. highlight
parametresi içerisinde belirttiğiniz taktirde bu herhangi başka bir alan da olabilir. Alan isimleri joker semboller ile de belirtilebilir. Örneğin comment_*
ile comment_
ile başlayan alanlar seçilmiş olacaktır. İstediğini kadar alanda vurgulama işlemi yapabilirsiniz. Ancak dikkat etmeniz gereken şey vurgulama yapma türünüze göre seçtiğiniz alanlarda doğru şekilde vurgulama yapabilirsiniz.
Varsayılan seçenek olarak plain
vurgulama türü kullanılmaktadır ve bu tür vurgulama tabanda Lucene Highlighter kullanılır. Diğer tür vurgulama algoritmalarına göre daha yavaş çalışır. Ekstra hiçbir konfigürasyon yapmazsanız bu tür vurgulama kullanılacaktır.
Eğer mapping oluşturulurken arama yapmak istediğiniz alanların index_options
parametresine offsets
değerini verirseniz varsayılanın yerine Posting
tipi vurgulama yöntemi kullanılacaktır. Plain
olana göre daha hızlıdır. Çünkü metni vurgulama işlemi sırasında tekrar analiz etmeniz gerekmez ve büyük dökümanlar için daha performanslıdır. Bir sonraki vurgulama tipi olan term_vector
‘a göre daha az alan(disk alanı) harcar. Doğal dillerde gerçekten iyidir ancak html içeren metinlerde o kadar da iyi değildir.
Mapping ayarlarını yaparken aşağıdaki gibi bir konfigürasyon yapabilirsiniz:
{
"type_name" : {
"content" : {"index_options" : "offsets"}
}
}
Eğer mapping oluşturulurken arama yapmak istediğiniz alanların term_vector
parametresine with_positions_offsets
verirseniz varsayılanın yerine Fast Vector
vurgulama yöntemi kullanılmaktadır. Özellikle büyük (> 1MB) alanlar için daha hızlıdır. Index boyutunu diğerlerine göre daha fazla büyütecektir. matched_fields
özelliği ile birden fazla alandaki eşleşen sonuçları birleştirebilmektedir. Aşağıda bir content
alanı için Fast Vector
vurgulama yöntemini uygulayalım:
{
"type_name" : {
"content" : {"term_vector" : "with_positions_offsets"}
}
}
Sorgulama yaparken vurgulama yapmak istediğiniz alan için vurgu türünü seçebilirsiniz. Örneğin:
{
"query" : {...},
"highlight" : {
"fields" : {
"content" : {"type" : "plain"}
}
}
}
Vurgulamak istediğiniz sonuçları belli bir html etiketleri arasında göstermek istiyorsak bunun için pre_tags
and post_tags
parametrelerini kullanabiliriz. Bunlar için varsayılan değerler <em>
ve </em>
dir. Farklı bir etiket vermenin örneği aşağıdaki gibidir:
{
"query" : {...},
"highlight" : {
"pre_tags" : ["<tag1>"],
"post_tags" : ["</tag1>"],
"fields" : {
"_all" : {}
}
}
}
Örnek Sorgu aşağıdaki gibidir ve vurgulama türü olarak fvh
kullanılmıştır.
GET test/type/_search
{
"query": {
"match": {
"text": "şarkı"
}
},
"highlight": {
"fields" : {
"pre_tags":["<em>"],
"post_tags":["<\/em>"],
"text" : {}
}
}
}
Sorgu sonucu olarak aşağıdaki gibi bir cevap alınacaktır:
{
"took": 47,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"failed": 0
},
"hits": {
"total": 1,
"max_score": 0.11506981,
"hits": [
{
"_index": "test",
"_type": "type",
"_id": "2",
"_score": 0.11506981,
"_source": {
"id": 2,
"text": "Güzel söyleri olan şarkılar gerçektende beni derinden etkiler"
},
"highlight": {
"text": [
"Güzel söyleri olan <em>şarkılar</em> gerçektende beni derinden etkiler"
]
}
}
]
}
}