我需要通过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个表:post,location和post_category 我的数据库关系:1)帖子与位置一对一, 2)post_category的帖子是一对多的。
post_category表,这个表只有两列:post_id和post_category_name列,当这个表中的post_id按距离变化时,我需要通过这个post_category_name进行搜索。
我按位置过滤这样的查询,它的工作正常:
select *, geodist(48.712002, 2.677411, latitude, longitude) dist from serv1 where match('searchText*') and dist < 20 ;
在我的select查询之后,我希望在结果中包含这样的列:
| id |纬度|经度| post_category_name | DIST
并按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");
请帮助我。
答案 0 :(得分:0)
由于您每个帖子(可能)有多个类别,因此必须选择如何编制索引。 1)可以像现在一样保留它,并且每个帖子都有sphinx文档,然后post_category_name将实际包含多个值,如果在多个类别中发布。
...或2)每个帖子和类别可以有一个文档。因此,如果文档属于多个类别,则可能会有多个结果。
选项1更简单,但2最终会更灵活(可以搜索组合与否,但您的sphinx查询可能需要GROUP BY,以便每个帖子获得一个结果)
但是现在选项1 ......
sig_of_sig2
...将类别视为字符串属性(用于检索)和字段(用于匹配)
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
虽然您可以在WHERE中使用post_category_name属性,但如果可能的话,其通常更好地使用全文查询(字段)进行过滤。