本文介紹了帶過濾功能的Spinx搜索查詢的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!
問題描述
我需要按POST_CATEGORY_NAME(字符串值)列在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)可以保持現在的狀態,并且每個帖子都有獅身人面像文檔,如果帖子在多個類別中,那么POST_CATEGORY_NAME實際上將包含多個值。
.或者2)可以改為每個帖子類別有一個文檔。因此,如果一個文檔屬于多個類別,則可能會有多個結果。
選項1更簡單,但選項2最終會更靈活(可以組合搜索,也可以不組合搜索,但您的獅身人面像查詢可能需要一個GROUP BY TO,以獲得每個帖子一個結果)
但目前的選項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屬性,但如果可以使用全文查詢(字段)進行篩選,通常會更好。
這篇關于帶過濾功能的Spinx搜索查詢的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,