这是可能的,但...
1) 首先,检查http://wiki.apache.org/solr/SurroundQueryParser ( http://searchhub.org/2009/02/22/exploring-query-parsers/ ) 是否有环绕查询解析器。这几乎正是您想要的。然而,人们声称(至少在某些地方)它支持短语查询,但事实并非如此(目前)。
2)所以你必须实现短语接近。一个(讨厌的)黑客是更新 DistanceQuery::getSpanNearQuery (在 lucene/queryparser/.../DistanceQuery.java 中的 solr 4.2.1 中的第 78 行)
while (sqi.hasNext()) {
SpanNearClauseFactory sncf = new SpanNearClauseFactory(reader, fieldName, qf);
// HACK starts here
DistanceSubQuery dsq = ((DistanceSubQuery)sqi.next());
try {
if ( ((SrndTermQuery)dsq).getTermText().contains( " " ) ) {
String term_text = ((SrndTermQuery)dsq).getTermText();
String[] tokens = term_text.split("\\s+");
SpanQuery[] span_queries = new SpanQuery[tokens.length];
for ( int i = 0; i < tokens.length; ++i ) {
span_queries[i] = new SpanTermQuery( new Term(fieldName, tokens[i]) );
}
spanClauses[qi] = new SpanNearQuery( span_queries, 0, true);
qi++;
continue;
}
}catch( Exception ex ){
}
// HACK ends here
dsq.addSpanQueries(sncf);
3) 请注意,没有对数据进行预处理,因此如果您使用词干提取,则必须搜索准确的单词,例如 select?q={!surround df=text}"we defin" 11w "descend" will match " "" 我们定义了一组按降序排列的单词 """