2010-01-12 113 views
2

我想創建一個「高級搜索」,我可以讓用戶只搜索索引的特定字段。對於這一點,我使用的是布爾查詢:在Zend Lucene中,我如何更改查詢搜索的字段?

$sq1 = Zend_Search_Lucene_Search_QueryParser::parse($field1); // <- provided by user 
$sq2 = Zend_Search_Lucene_Search_QueryParser::parse($field2); // <- provided by user 

$query = new Zend_Search_Lucene_Search_Query_Boolean(); 
$query->addSubquery($sq1, true); 
$query->addSubquery($sq2, true); 

$index->find($query); 

如何指定指定SQ1將搜索領域的「富」,和SQ2將搜索領域「酒吧」?

我覺得我應該有不同的解析查詢的效果(因爲用戶可能輸入一個字段名),但該文檔只提的QueryParser與API查詢加入用戶輸入查詢。

回答

1

看來要做到這一點最簡單的方式就是捏造用戶輸入:

$sq1 = Zend_Search_Lucene_Search_QueryParser::parse("foo:($field1)"); 
$sq2 = Zend_Search_Lucene_Search_QueryParser::parse("bar:($field2)"); 

$ FIELD1和$ FIELD2應該被剝奪括號和事先冒號,以避免「搜索注射液」。

+0

像魔術一樣工作! – Randell 2010-12-27 09:20:59

0

你想要什麼是查詢構造API:http://www.zendframework.com/manual/en/zend.search.lucene.query-api.html#zend.search.lucene.queries.multiterm-query

不過,我建議你乾脆放棄在Zend_Search_Lucene。 Java實現非常棒,但PHP實現非常糟糕。關於你正在做的事情,它的行爲非常錯誤,見問題1508748.它也非常非常緩慢。

+0

問題是,API不能解釋如何做到這一點。如何獲得用戶輸入並將其轉換爲多條查詢而無需手動進行標記化處理? 我意識到一個PHP搜索引擎不是一個好主意,但我現在正在尋求易於實現的方式,如果稍後它會成爲問題,我將進行遷移。 – 2010-01-14 11:54:44

+0

在這種情況下,您似乎別無選擇,只能使用Ilia Jerebtsov提供的解決方案。再次,請注意,PHP實現非常緩慢。您仍然可以選擇使用其他搜索框架。我強烈建議你這樣做。 – 2010-01-16 16:58:37