SphinxQL - 如何过滤后面的匹配

时间:2015-11-27 07:34:49

标签: sphinx sphinxql

我正在开发一个使用Sphinx searchengine的项目。但是 - 正如我所知 - 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

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

日Thnx。提前帮助你。

1 个答案:

答案 0 :(得分:1)

sql_query中您没有输入属性的任何列自动成为FIELD(除了第一列始终是document-id)。

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

ATTRIBUTES可以在WHERE中“过滤”,按ORDER BY排序,在GROUP BY中分组,或在SELECT中检索(或甚至在排名表达式中使用)。

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

你不说但猜猜它是一个字符串。如果您仍然希望能够对列进行全文查询,则可以使用sql_field_string将列设置为FIELD和ATTRIBUTE。

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