带过滤功能的 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 查询(字段)进行过滤。
我需要通过 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 查询(字段)进行过滤。