0

我正在做一个使用 Sphinx 搜索引擎的项目。但是 - 正如我意识到的那样 - Sphinx 文档很大但很难理解。

所以我找不到任何关于如何使用 WHERE 子句过滤 MATCH 语句后面的信息。我尝试过的是:

"SELECT *, country FROM all_gebrauchte_products WHERE MATCH('@searchtext (".$searchQuery.")') AND country='".$where."' ORDER BY WEIGHT() DESC LIMIT ".$page.", ".$limit." OPTION ranker=expr('sum(lcs)')"

如果我在没有 country=$where 子句的情况下使用它,我会返回许多来自不同国家的 GUID。所以我必须以某种方式过滤国家列;

如果我使用上面的语句,我会得到错误:

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42000]: Syntax error or access violation: 1064 index all_gebrauchte_products: parse error: unknown column: country'

但我这样设置索引:

sql_query_range = SELECT MIN(gebr_id), MAX(gebr_id) FROM all_gebrauchte_products
sql_range_step = 10000
sql_query = \
            SELECT a.gebr_id AS guid, 'products' AS data_type, a.gebr_products AS products, a.gebr_user AS username, a.gebr_date AS datadate, CONCAT(a.gebr_hersteller,' ', a.gebr_modell,' ', a.gebr_ukat,' ', a.gebr_kat,' ', a.gebr_bemerkung) AS searchtext, a.gebr_bild1 AS image1, a.gebr_bild2 AS image2, a.gebr_bild3 AS image3, a.gebr_bild4 AS image4, a.gebr_bild5 AS image5, b.h_land AS country, b.h_web AS weblink, b.h_firmenname AS company, b.h_strasse AS street, b.h_plz AS zipcode, b.h_ort AS city, a.gebr_aktiv AS active \
            FROM all_gebrauchte_products a, all_haendler b \
            WHERE a.gebr_user = b.h_loginname AND a.gebr_id>=$start AND a.gebr_id<=$end
sql_attr_uint = active

谁能告诉我出了什么问题?或者我如何过滤国家?

谢谢。提前为您提供帮助。

4

1 回答 1

1

您不创建属性的任何列sql_query都会自动成为字段(除了第一列始终是文档 ID)。

FIELD 是“全文”索引的,它们是您可以在查询中匹配的内容 - 即 MATCH(...) 子句。

属性是可以在 WHERE 中“过滤”、在 ORDER BY 中排序、在 GROUP BY 中分组或在 SELECT 中检索(甚至用于排名表达式)的内容。

所以你需要country成为一个属性才能在 WHERE 过滤器中使用它

你不说但猜它是一个字符串。sql_field_string如果您仍然对能够全文查询该列感兴趣,您可以使用该列同时成为字段和属性。

(也因为它是一个字符串,需要一个最新版本的 sphinx。Sphinx 最近才获得按字符串属性过滤的能力)

于 2015-11-27T09:23:57.433 回答