2010-01-12 76 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