2013-04-30 34 views
0

可以在sphinx api中設置一個過濾器/條件來向配置選擇添加一個'AND'條件? (或者表現得像'AND'條件)?SphinxSearch - setFilter使用sql_attr_multi

SetFilter並不像我想象的那樣工作,因爲我使用的是sql_attr_multi,它創建了一個包含匹配的數組... ...並且排序定義的屬性被最新的屬性覆蓋。

如果我在配置中設置'AND條件'選擇它可以正常工作,但我需要使用它dinamically。

或者也許使用sql_query在PHP中設置條件dinamically?

OR setSelect( 「*和條件」)

編輯

我有3個表

-companies table 
-projects table 
-companies_projects table (company id, project_id, company_package) 

同一家公司可能會在多個項目。

公司包可能在每個項目上都不同(用於分類)。

sql_attr_multi = uint project from query; SELECT company_id, project_id FROM companies_projects 

它找到合適的公司,但如果公司在多個項目上,項目attr變成(8,10)。

關於項目編號。 8 - 包是2,
在項目沒有。 10 - 包裝爲1

我應用過濾器

$sphinxClient->setFilter('project', array(8)); 

的問題是,company_package由最後一個條目(在數據庫中)覆蓋,我不`噸知道爲什麼。

所以company_package項目沒有。 8應該是2,我會得到1,女巫是項目編號的包。 10.

如果我添加WHERE project_id = '8'sql_query工作正常,但我需要一個動態的解決方案,所以我不`噸需要創建一個配置文件,爲每個項目

編輯:

sql_query = \ 
    SELECT \ 
    id, company, \ 
    company_package, UNIX_TIMESTAMP(date) AS date \ 
    FROM companies AS c \ 
    INNER JOIN companies_projects AS cp ON c.id = cp.company_id 

公司表格:id,company

companies_projects:project_id,company_id,company_package,date

編輯

[1] => Array 
      (
       [weight] => 1 
       [attrs] => Array 
        (
         [company_package] => 2 
         [date] => 1367224201 
         [project] => Array 
          (
           [0] => 8 
          ) 
        ) 
      ) 
[2] => Array 
      (
       [weight] => 1 
       [attrs] => Array 
        (
         **[company_package] => 1** it should be 2 
         [date] => 1367224202 
         [project] => Array 
          (
           [0] => 8 
           [0] => 10 
          ) 
        ) 
      ) 

我atached一個例子。它找到合適的公司。

第一個關鍵是好的,因爲公司沒有。 1只是項目編號。8

第二個關鍵不好,因爲公司沒有。 2在兩個沒有。圖8個10個項目是這樣的:

公司1,項目8,包= 2

公司2,項目8,包= 2

公司2,項目10,包= 1

所以,公司是好的,但包是從公司覆蓋2,項目10,包= 1 如果我刪除此記錄...或者如果我添加AND project_id = 8一切正常

+0

這是回答yuor問題嗎? http://stackoverflow.com/questions/10090158/and-multiple-values-of-a-filter-in-sphinx/10093811#10093811 – barryhunter 2013-04-30 10:11:55

+0

感謝您的快速回答,但不是我渴望的做。 我會用詳細的解釋來更新初始描述。 – 2013-04-30 11:40:11

+0

什麼是你的sql_query?因爲我沒有看到company_package被索引在哪裏... – barryhunter 2013-04-30 12:57:06

回答

0

啊,你每家公司只獲得一份文件。

你可以認爲sql_queryGROUP BY id結尾。 (它並沒有真正的,但獅身人面像將只爲每個ID創建一個文檔)

MVA的作品,因爲它沒有它的GROUP BY。

我懷疑最簡單的辦法是每個公司/項目組合有一個獅身人面像文件。即你實際上直接索引companies_projects,而不是公司表本身。

sql_query_pre = SET @id=1 
sql_query = SELECT @id:[email protected]+1, company_id, project_id, company, \ 
    company_package, UNIX_TIMESTAMP(date) AS date \ 
    FROM companies_projects AS cp \ 
    INNER JOIN companies AS c ON (c.id = cp.company_id) 
sql_attr_unit = company_id 
sql_attr_unit = project_id 

(無需對MVA)

然後你就可以在PROJECT_ID(或COMPANY_ID)使用setfilter並得到正確的company_package。

(這包括僞造文件ID - 因爲您沒有可以使用的companies_projects上的簡單密鑰)

+0

感謝您的回答。我用查詢摘錄更新了描述,因此您可以看到問題。 – 2013-04-30 15:13:31

+0

是的。這個答案告訴你如何解決這個問題。你可能誤解獅身人面像是如何工作的。它(well indexer)運行你的sql_query,併爲輸出建立索引。這是指數中包含的所有內容。所以你需要確保索引包含正確的數據。沒有重複的文件。 – barryhunter 2013-04-30 16:13:22