带过滤功能的 Spinx 搜索查询

Spinx search query with filtering

我需要通过 post_category_name(String value) 列在 Spinx 查询中添加额外的过滤, 我当前的索引:

  source min
    {
        type = mysql
        sql_host = localhost
        sql_user = root
        sql_pass =
        sql_db = test
        sql_query = select  p.id,  p.title, p.description, l.Latitude, l.Longitude FROM post p join location l on l.id = p.location_id
       // here I need filter by category name with post_id the same as 
       // p.id in table post
        sql_attr_float = Latitude
        sql_attr_float = Longitude
    }

我有 3 个 table:post、位置和 post_category 我的数据库 relation:1) post 位置一一对应, 2) post 和 post_category 是一对多。

post_category table,此 table 只有两列:post_id 和 post_category_name 列,我需要通过此 [=32] 进行搜索=] when post_id in this table mutch by distance.

我使用此类查询按位置进行过滤,效果很好:

select *, geodist(48.712002, 2.677411, latitude, longitude) dist from serv1  where match('searchText*') and dist < 20 ;

在我的 select 查询之后,我希望在结果中包含这样的列:

|编号 |纬度 |经度 | post_category_name |距离

并按 post_category_name.

过滤

所以当我搜索时,我需要这样的东西:

 select *, geodist(48.712002, 2.677411, latitude, longitude) dist from serv1  where match('searchText*') and dist < 20 and post_category_name in ("All", "Shop");

请帮帮我

由于每个 post 有(可能)多个类别,因此必须选择索引方式。 1) 可以像现在一样保持它,并且每个 post 都有 sphinx 文档,然后 post_category_name 将实际上包含多个值,如果 post 在多个类别中。

... 或 2) 可以改为每个 post&类别有一个文档。因此,如果文档属于多个类别,则可能会有多个结果。


选项 1 更简单,但选项 2 最终会更灵活(可以组合搜索或不组合搜索,但您的 sphinx 查询可能需要一个 GROUP BY,以便每个 post 获得一个结果)

但是现在选项 1...

sql_query = SELECT p.id, p.title, p.description, l.Latitude, l.Longitude, 
     GROUP_CONCAT(c.category_name) AS post_category_name \
  FROM post p  \
  INNER JOIN location l ON (l.id = p.location_id) \
  LEFT JOIN category c ON (c.post_id = p.id) \
  GROUP BY p.id \
  ORDER BY NULL

sql_field_string = post_category_name 

... 将类别同时作为字符串属性(用于检索)和字段(用于匹配)

select id, post_category_name , geodist(48.712002, 2.677411, latitude, longitude) dist 
  from serv1 
  where match('searchText* @post_category_name All|Shop') and dist < 20;

虽然您可以在 WHERE 中使用 post_category_name 属性,但如果可能的话 通常 更好地使用 full-text 查询(字段)进行过滤。