带过滤的Spinx搜索查询

时间:2018-04-03 07:36:11

标签: java mysql sphinx

我需要通过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");

请帮助我。

1 个答案:

答案 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属性,但如果可能的话,其通常更好地使用全文查询(字段)进行过滤。