Stories

Detail Return Return

PHP網站平替ES的搜索引擎來了,更輕量更方便! - Stories Detail

Windsearch

windsearch,PHP原生實現的全文檢索引擎,無任何複雜的安裝配置,開箱即用,可承受百萬至千萬的數據。零安裝配置、零心智負擔,擁有強大的算法,包含多種檢索模式,集成到PHP項目後,無需維護,一勞永逸

本搜索引擎適合外貿獨立站、垂直社區、區域性電商、cms系統、PHP開發工作室、服務器配置一般的網站、需要快速搭建搜索的網站、個人博客等。

github地址:https://github.com/rock365/windsearch

在線文檔:https://rock365.github.io/ 偶爾無法訪問,多刷新幾次就行

它的優勢是什麼?

易用性:完全零配置(你沒有聽錯),沒有任何繁雜臃腫的安裝設置,一行代碼就能搭建完成;完全接口化操作;文檔詳細,複製粘貼就能實現各種搜索場景。

安全:完全本地化部署,所有代碼完全有您掌握;

PHP原生友好:windsearch是純PHP開發的,能跟PHP項目無縫集成,不會產生跨語言調用的性能損耗;

零運維成本:不會產生任何維護調優的成本,只要網站正常運行,搜索引擎就能一直運行,永不宕機;

性能強悍:百萬級數據毫秒級響應,千萬級數據面不改色,且擁有多種搜索模式;

極高性價比:磁盤式搜索引擎,對服務器內存資源佔用極小,可大幅降低服務器成本;

PHP環境要求:

  • UTF-8編碼
  • PHP ≥7.3
  • mbstring Extension
  • PDO Extension
  • SQLite Extension

多種搜索模式

match 單字段檢索

multi_match 多字段檢索

match_fuzzy 模糊搜索

match_prefix 前綴匹配

match_suffix 後綴匹配

match_prefix_suffix 前後綴混合匹配

match_phrase 短語搜索

match_terms 精確搜索

match_bool 布爾搜索(無限嵌套)

match_range 範圍查詢

match_all 查詢所有數據

match_rand 隨機獲取數據

match_primarykey 根據主鍵查詢數據

match_geo 地理空間搜索

match_auto_completion 自動補全

其它功能

aggs 聚合查詢:分組聚合、指標聚合、分組嵌套聚合;

搜索統計:可對前台用户的搜索數據進行保存統計,可按年、按月、按日來查看搜索詞語的頻率統計數據;

敏感詞檢測:包括一鍵導入所有敏感詞,檢測字符串是否存在敏感詞、檢測並替換敏感詞、返回所有包含的敏感詞;

亮點介紹

操作完全接口化;

原生支持中文分詞;

支持配置同義詞;

支持自定義分詞插件;

支持精細化搜索設置;(結果高亮、自定義返回字段、字段權重、minimum_should_match、結果按字段值排序、數據脱敏返回等)

支持生成增量索引併合併到主索引;

支持實時索引;

支持搜索結果filter過濾;

支持搜索結果按字段值排序;(按某個字段值排序、按距離排序(如果存在經緯度字段))

更合理的排序:

綜合排序時,命中的詞語之間越緊密,排序越靠前,例如:

1,xxxx明天xxxx會xxxxxxx更好

2,xxx明天會更好xxxxxxx

排序後,2會在1前面

支持int遞增主鍵、uuid主鍵;

多字段檢索語法示例

// 搜索多個字段
$query = [
    'multi_match' => [
        'field' => [
            [
                'name' => 'title',
                'query' => $query,//搜索內容
                'analyzer' => 'segment', // 詞典分詞模式 complete/not,代表整體匹配; segment 中文分詞; 
                'highlight' => [ // 結果高亮
                    'is_cut' => true, // 是否將未匹配的地方截取掉
                    'fixed_length' => '', // 保留多少字符,若為空,則保持原長度
                ],
            ],
            [
                'name' => 'tags',
                'query' => '蔬菜',
            ]

        ],
        // 結果排序 為空時,自動按命中個數倒排
        'sort' => [
            'time' => 'asc' //asc 按字段值正序 desc 按字段值倒序
        ],
        'list_rows' => $listRows, // 每頁多少條數據
        'page' => $page, // 第幾頁

    ]
];

// 搜索接口
$res = $Wind->search($query);
// $res 返回的最終結果,可直接渲染到前台頁面
// ...

地理空間檢索語法示例

// 地理空間搜索
$query = [
    'match_geo' => [
        'field' => [
            'name' => 'location', // 要進行搜索的字段,類型必須為geo_point
            'geo_point' => [
                'lat' => '30.621900130545825', //緯度
                'lon' => '114.28891807367313', //經度
            ],
            // 'distance' => '10000m', // 10公里範圍內
            'distance' => ['10km', '20km'], // 1公里到10公里範圍內
        ],
        // 結果排序
        'sort' => [
            'geo_distance' => 'asc' //asc 按距離升序 desc 按距離降序
        ],
        '_source' => ['title', 'descr'],//自定義返回字段
        'list_rows' => $listRows, //每頁多少條數據
        'page' => $page, //第幾頁
    ]
];

// 搜索接口
$res = $Wind->search($query);
// $res 返回的最終結果,可直接渲染到前台頁面
// ...

搜索過濾語法示例

搜索可以添加強大的filter過濾功能,可以過濾geo距離,數值,關鍵詞,日期。

// 搜索單個字段
$query = [
    'match' => [
        'field' => [
           // 此處為搜索字段信息...
        ],
        
        //篩選過濾
        'filter' => [
            'conditions' => [
                //地理位置過濾
                'location' => [
                    // 過濾條件...
                ],
                
                // 數值過濾
                'score' => [
                    // gt、gte、lt、lte
                    
                ],
                
                // 主鍵過濾
                // ...
                
                // 時間字段過濾
                'time' => [
                    // 支持時間戳、字符串
                    'gte' => '2024-03-10',
                    'lt' => '2024-03-15',
                ],
                
                //字符串過濾
                'area'=>[
                    // 支持完全匹配、前綴匹配、後綴匹配
                    'match' => ['中國','澳大*']
                ]

            ],
        ],
        
        
        // 結果排序 為空時,自動按命中個數倒排
        'sort' => [
            'time' => 'desc' //asc 按字段值正序 desc 按字段值倒序
        ],
        'list_rows' => $listRows, //每頁多少條數據
        'page' => $page, //第幾頁

    ]

];

// 搜索接口
$res = $Wind->search($query, $page, $listRows);
// 返回的最終結果,可直接渲染到前台頁面
$resArr = $res['result'];

檢索引擎的使用不應該佔據開發人員太多時間,windsearch所有的操作都已經接口化,照着文檔填寫調用即可,簡單到不能再簡單。引擎內部包含多種數據結構跟算法,但你無需關注任何東西,直接使用它就行。

所有的搜索語法跟ES大差不差,但更清晰簡潔。對網站配置幾乎沒有什麼要求(畢竟內存的成本還是挺高的),無需配置任何東西,導入即可使用,無需維護,能跟PHP項目完美融合。

user avatar zero_dev Avatar yanwushu Avatar rui_sen Avatar crmeb Avatar 0xboo Avatar tangzhangming Avatar guangmingleiluodebaomihua Avatar niewj Avatar junxiudetuoba Avatar wangjingyu_5f58472234cff Avatar jkdataapi Avatar zuiyuesi Avatar
Favorites 18 users favorite the story!
Favorites

Add a new Comments

Some HTML is okay.