簡體   English   中英

調整Sphinx搜索以進行產品搜索

[英]Tuning Sphinx search for product search

我們有一個非常簡單的產品目錄,該產品目錄將產品存儲在mysql表中,我們需要對應該盡快運行(並且盡可能相關)的產品進行質量搜索。 產品數據庫將非常大(大約50萬個產品),這就是為什么不使用索引的使用“頂”的搜索非常慢的原因。 我們已經嘗試過使用mysql全文搜索,該搜索可以快速運行,但不能產生令人滿意的結果,尤其是對於使用數字的搜索(例如“ LR-41”,它是電池類型等)。

我們的產品目錄包括許多領域,但我們唯一需要搜索的領域是:

product_id = bigint
title = varchar(255)
description = text

經過許多建議,我們最終嘗試使用Sphinx搜索並進行如下配置:

source mysearch {
  type=mysql
  sql_host=...
  sql_user=...
  sql_pass=...
  sql_port=...
  sql_query_pre = SET NAMES utf8
  sql_query = SELECT product_id, title, description FROM products
  sql_query_info = SELECT * FROM products WHERE product_id=$id 
}

index fulltext { 
    source  = mysearch
    path = /var/lib/sphinxsearch/data/mysearch
    docinfo = extern
    mlock = 0
    morphology = stem_en, metaphone
    min_word_len = 1
    blend_chars = +, &, U+23, -
    blend_mode = trim_both
    html_strip = 1 
}

indexer {
    mem_limit = 256M 
}

searchd {
    listen = 9312 
    # everything else set to default
}

對於網站后端,我們使用PHP,並使用以下代碼:

<?php
$sphinx = new SphinxClient();
$sphinx->SetServer('localhost', 9312);
$sphinx->SetMatchMode(SPH_MATCH_EXTENDED);
$sphinx->setFieldWeights(array(
    'product_id' => 10,
    'title' => 7,
    'description' => 3
));
$sphinx->setLimits(0, 200, 1000, 5000);
$sphinx->SetRankingMode(SPH_RANK_PROXIMITY_BM25);
$sphinx->AddQuery($_GET['query'], "fulltext");
$results = $sphinx->RunQueries();
print_r($results);
?>

這只是一個用於測試搜索的演示腳本,但是無論我使用哪種查詢方式,它都會返回完全錯誤的結果-它與甚至不包含我要搜索的單詞(或子字符串)的產品匹配。

以下是我要實現的規則:

  • 如果查詢與“ product_id”匹配,則該產品應排在最高位置(一些經常使用的用戶知道product_id並希望通過它進行搜索)
  • 如果查詢為“ Meter XY-123”,則它應與同時包含這兩個詞或其中任何一個詞的所有產品匹配(自然,包含兩個字符串的產品應排名更高)
  • 如果在標題中找到查詢,則其排名應高於在說明中找到的查詢
  • 如果有人搜索“ XY-123”,則應產生與搜索“ XY123”或“ XY 123”相同的結果
  • 它也應該搜索子字符串-例如,如果產品的標題是“ Foobar 123”,則即使用戶搜索“ foo bar 123”,“ bar 123”,“ foobar 12”,“ foo”等也應返回。
  • 還應按某種相關性排序返回結果。例如,如果我有兩個產品“ foobar 123”和“ foobar 456”,並且用戶搜索“ foobar 4”,則應同時返回兩個產品(匹配任何單詞),但第二個產品應該比第一個(不包含數字4)排名更高(因為它也包含數字4)。
  • 產品還應該根據在哪個字段中找到該值進行排序。在這種情況下,product_id字段的權重大於標題的權重,而標題的權重也大於說明的權重。

因此,問題是-如何正確配置並使用sphinx + php生成符合上述條件的搜索結果?

謝謝!

這只是一個用於測試搜索的演示腳本,但是無論我使用哪種查詢,它都會返回完全錯誤的結果

建議從morphology刪除元metaphone 專門啟用“模糊”索引-有點像“聲音相似”。 但是,它與詞干(例如stem_en)結合使用時效果不佳-導致非常混亂的結果。

實際上,如果您設置前綴索引(請參見下文),則也許也可以刪除詞干-如果嘗試同時使用兩者,則很難檢測到邊緣情況。


如果查詢與“ product_id”匹配,則該產品應排在最高位置(一些經常使用的用戶知道product_id並希望通過它進行搜索)

Sphinx在“全文”索引中不包含產品ID。 您需要復制它。

sql_query = SELECT product_id as id, product_id, name,...  

如果查詢為“ Meter XY-123”,則它應與同時包含這兩個詞或其中任何一個詞的所有產品匹配(自然,包含兩個字符串的產品應排名更高)

這意味着您想進行“任意”搜索。 Sphinx默認為“全部”搜索。 更改為SPH_MATCH_ANY,或重寫查詢以使其變為“ ANY”(在單詞之間插入“ |”或使用定額)


如果有人搜索“ XY-123”,則應產生與搜索“ XY123”或“ XY 123”相同的結果

那很棘手。 您可以嘗試將-添加到blend_chars 這將工作。 但是輸入“ XY 123”將與“ XY123”的產品不匹配。 我不認為有一個簡單的解決方案。

有各種各樣的統計方法可以嘗試重寫查詢,但是從本質上講,它們是不精確的。


它也應該搜索子字符串-例如,如果產品的標題是“ Foobar 123”,則即使用戶搜索“ foo bar 123”,“ bar 123”,“ foobar 12”,“ foo”等也應返回。

需要使用min_prefix_len啟用前綴搜索,並設置enable_star = 0

但是enable_star=0已貶值,因此也許可以改用expand_keywords=1來自動為您添加星號。


結果也應按某種相關性排序返回

通常會發生這種情況。 但是如果需要,可以嘗試更改排名模式-有很多選項(但需要使用擴展匹配模式)


產品還應該根據找到該值的字段進行排名。

setFieldWeights來解決! (您已經知道了!)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM