就搜索算法而言,沒有萬能的解決方案。 不同的算法在不同的場景下效果更好,有時需要算法的組合才能達(dá)到最好的效果。 在 Elasticsearch 中,一種流行的組合搜索算法的方法是使用混合搜索,將用于文本搜索的 BM25 算法與用于最近鄰搜索的 HNSW 算法相結(jié)合。 在這篇博文中,我們將探討 Elasticsearch 中混合搜索的優(yōu)勢、挑戰(zhàn)和用例。
BM25 是一種廣泛用于文本搜索的算法,它根據(jù)查詢中每個詞的詞頻(TF)和逆向文檔頻率(IDF)計算分?jǐn)?shù)。 正如我們在之前的博文中看到的,HNSW 是一種用于近似最近鄰搜索的算法,它構(gòu)建了一個由互連節(jié)點組成的小世界圖。 通過結(jié)合這兩種算法,我們可以執(zhí)行結(jié)合兩者優(yōu)勢的混合搜索。
混合搜索的最大挑戰(zhàn)之一是平衡兩種算法的權(quán)重。 換句話說,我們需要決定在組合它們時給 BM25 分?jǐn)?shù)和給 HNSW 分?jǐn)?shù)多少權(quán)重。 這可能很棘手,因為最佳權(quán)重可能會因數(shù)據(jù)和特定搜索場景而異。
但是,如果操作得當(dāng),混合搜索可以顯著提高搜索準(zhǔn)確性和效率。 例如,在電子商務(wù)應(yīng)用程序中,混合搜索可用于將文本搜索與視覺搜索相結(jié)合,使用戶能夠找到與其文本和視覺查詢相匹配的產(chǎn)品。 在科學(xué)應(yīng)用中,混合搜索可用于將文本搜索與高維數(shù)據(jù)的相似性搜索相結(jié)合,使研究人員能夠根據(jù)文本內(nèi)容和數(shù)據(jù)找到相關(guān)文檔。
讓我們看一個例子,看看如何在 Elasticsearch 中實現(xiàn)混合搜索。 首先,我們需要使用包含 BM25 和 HNSW 相似性算法的映射來索引我們的數(shù)據(jù):
PUT byte-image-index
{
"mappings": {
"properties": {
"byte-image-vector": {
"type": "dense_vector",
"element_type": "byte",
"dims": 2,
"index": true,
"similarity": "cosine"
},
"title": {
"type": "text"
},
"area": {
"type": "keyword"
}
}
}
}
在這里,我們定義了一個映射,其中包括用于 BM25 文本搜索的 title 字段和用于 HNSW 高維數(shù)據(jù)相似性搜索的 byte-image-vector 字段。我們索引一下數(shù)據(jù):
POST byte-image-index/_bulk?refresh=true
{ "index": { "_id": "1" } }
{ "byte-image-vector": [5, -20], "title": "moose family", "area": "Asia" }
{ "index": { "_id": "2" } }
{ "byte-image-vector": [8, -15], "title": "alpine lake", "area": "Europe" }
{ "index": { "_id": "3" } }
{ "byte-image-vector": [11, 23], "title": "full moon", "area": "Africa" }
接下來,我們可以使用文本和向量字段執(zhí)行搜索,如下所示:
POST byte-image-index/_search
{
"query": {
"match": {
"title": {
"query": "mountain lake",
"boost": 0.5
}
}
},
"knn": {
"field": "byte-image-vector",
"query_vector": [6, 10],
"k": 5,
"num_candidates": 50,
"boost": 0.5,
"filter": {
"term": {
"area": "Asia"
}
}
},
"size": 10
}
此搜索查詢結(jié)合了 title 字段上的 match 查詢和 image-vector 字段上的 knn 查詢,使用了我們之前定義的混合相似性算法。 在此示例中,我們?yōu)?BM25 和 HNSW 使用了 0.9?和 0.1 的權(quán)重,但你可以嘗試使用不同的權(quán)重來找到適合你的數(shù)據(jù)和搜索場景的最佳平衡點。 總之,Elasticsearch 中的混合搜索是一種強大的技術(shù),可以結(jié)合不同搜索算法的優(yōu)勢,以實現(xiàn)更好的搜索準(zhǔn)確性和效率。 通過將用于文本搜索的 BM25 算法與用于最近鄰搜索的 HNSW 算法相結(jié)合,用戶可以在其搜索和分析應(yīng)用程序中利用這兩種算法的強大功能。 通過仔細(xì)調(diào)整兩種算法的權(quán)重,混合搜索可以成為從電子商務(wù)到科學(xué)研究等廣泛應(yīng)用的強大工具。
上述搜索結(jié)果為:
{
"took": 10,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 3,
"relation": "eq"
},
"max_score": 0.9070214,
"hits": [
{
"_index": "byte-image-index",
"_id": "2",
"_score": 0.9070214,
"_source": {
"byte-image-vector": [
8,
-15
],
"title": "alpine lake"
}
},
{
"_index": "byte-image-index",
"_id": "3",
"_score": 0.09977779,
"_source": {
"byte-image-vector": [
11,
23
],
"title": "full moon"
}
},
{
"_index": "byte-image-index",
"_id": "1",
"_score": 0.014644662,
"_source": {
"byte-image-vector": [
5,
-20
],
"title": "moose family"
}
}
]
}
}
我們甚至可以針對 knn 搜索設(shè)置一下 filter 以限制他的搜索范圍,比如:文章來源:http://www.zghlxwxcb.cn/news/detail-459585.html
POST byte-image-index/_search
{
"query": {
"match": {
"title": {
"query": "mountain lake",
"boost": 0.5
}
}
},
"knn": {
"field": "byte-image-vector",
"query_vector": [6, 10],
"k": 5,
"num_candidates": 50,
"boost": 0.5,
"filter": {
"term": {
"area": "Asia"
}
}
},
"size": 10
}
在上面,我們使用 filter 來針對 area 來進(jìn)行過濾,從而加快搜索的速度。上面返回的結(jié)果為:文章來源地址http://www.zghlxwxcb.cn/news/detail-459585.html
{
"took": 1,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 2,
"relation": "eq"
},
"max_score": 0.49041456,
"hits": [
{
"_index": "byte-image-index",
"_id": "2",
"_score": 0.49041456,
"_source": {
"byte-image-vector": [
8,
-15
],
"title": "alpine lake",
"area": "Europe"
}
},
{
"_index": "byte-image-index",
"_id": "1",
"_score": 0.07322331,
"_source": {
"byte-image-vector": [
5,
-20
],
"title": "moose family",
"area": "Asia"
}
}
]
}
}
到了這里,關(guān)于Elasticsearch:結(jié)合兩全其美:Elasticsearch 與 BM25 和 HNSW 的混合搜索的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!