Lucene ExtendableQueryParser工作示例

Lucene ExtendableQueryParser工作示例,lucene,Lucene,是否有人在Lucene中有ExtendableQueryParser的使用示例?我试过几种方法,但都不起作用。所以,我用Lucene 4.5.1编译了我的代码,效果很好 我一直在使用它将字段术语查询扩展为“span first”查询,如下所示: package test; import java.io.IOException; import java.io.StringReader; import java.util.LinkedList; import java.util.List; im

是否有人在Lucene中有
ExtendableQueryParser
的使用示例?我试过几种方法,但都不起作用。

所以,我用Lucene 4.5.1编译了我的代码,效果很好

我一直在使用它将字段术语查询扩展为“span first”查询,如下所示:

package test;

import java.io.IOException;
import java.io.StringReader;
import java.util.LinkedList;
import java.util.List;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;
import org.apache.lucene.index.Term;
import org.apache.lucene.queryparser.classic.ParseException;
import org.apache.lucene.queryparser.classic.QueryParser;
import org.apache.lucene.queryparser.ext.ExtendableQueryParser;
import org.apache.lucene.queryparser.ext.ExtensionQuery;
import org.apache.lucene.queryparser.ext.Extensions;
import org.apache.lucene.queryparser.ext.ParserExtension;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.spans.SpanFirstQuery;
import org.apache.lucene.search.spans.SpanNearQuery;
import org.apache.lucene.search.spans.SpanQuery;
import org.apache.lucene.search.spans.SpanTermQuery;
import org.apache.lucene.util.Version;

public class ExpandableQueryParserTest {

    private static Extensions createExtensions() {

        ParserExtension parserExtension = new ParserExtension() {

            @Override
            public Query parse(final ExtensionQuery query) throws ParseException {

                QueryParser parser = query.getTopLevelParser();
                // Although Analyzer implements java.io.Closeable, don't use it in try-with-resources.
                // Otherwise, it won't be able to parse the rest of the query...
                Analyzer analyzer = parser.getAnalyzer();
                String rawQueryString = query.getRawQueryString();

                List<SpanQuery> spans = new LinkedList<>();
                try (TokenStream stream = analyzer.tokenStream(query.getField(), new StringReader(rawQueryString))) {

                    stream.reset();

                    while (stream.incrementToken()) {
                        String term = stream.getAttribute(CharTermAttribute.class).toString();
                        spans.add(new SpanTermQuery(new Term(query.getField(), term)));
                    }

                    stream.close();

                } catch (IOException e) {
                    // Shouldn't happen as it's being read from RAM.
                    throw new ParseException(e.getMessage());
                }

                SpanQuery[] spansArray = spans.toArray(new SpanQuery[spans.size()]);
                SpanNearQuery spanNear = new SpanNearQuery(spansArray, 1, true, true);
                return new SpanFirstQuery(spanNear, 1);
            }
        };

        Extensions extensions = new Extensions('_');
        extensions.add("spanfirst", parserExtension);
        return extensions;
    }

    public static void main(String[] args) throws Exception {

        // Be careful: QueryParser is not thread-safe.
        QueryParser queryParser = new ExtendableQueryParser(Version.LUCENE_45, "", new StandardAnalyzer(Version.LUCENE_45), createExtensions());
        Query query = queryParser.parse("_spanfirst:hello");

        // prints "spanFirst(spanNear([hello], 1, true), 1)"
        System.out.println(query); 

        queryParser = new ExtendableQueryParser(Version.LUCENE_45, "text", new StandardAnalyzer(Version.LUCENE_45), createExtensions());
        query = queryParser.parse("_spanfirst:hello");

        // prints "spanFirst(spanNear([text:hello], 1, true), 1)"
        System.out.println(query);

        queryParser = new ExtendableQueryParser(Version.LUCENE_45, "text", new StandardAnalyzer(Version.LUCENE_45), createExtensions());
        query = queryParser.parse("hello");

        // prints "text:hello"
        System.out.println(query);

    }
}
封装测试;
导入java.io.IOException;
导入java.io.StringReader;
导入java.util.LinkedList;
导入java.util.List;
导入org.apache.lucene.analysis.Analyzer;
导入org.apache.lucene.analysis.TokenStream;
导入org.apache.lucene.analysis.standard.StandardAnalyzer;
导入org.apache.lucene.analysis.tokenattributes.CharterMatAttribute;
导入org.apache.lucene.index.Term;
导入org.apache.lucene.queryparser.classic.ParseException;
导入org.apache.lucene.queryparser.classic.queryparser;
导入org.apache.lucene.queryparser.ext.extendedablequeryparser;
导入org.apache.lucene.queryparser.ext.ExtensionQuery;
导入org.apache.lucene.queryparser.ext.Extensions;
导入org.apache.lucene.queryparser.ext.parsex;
导入org.apache.lucene.search.Query;
导入org.apache.lucene.search.span.SpanFirstQuery;
导入org.apache.lucene.search.span.span查询;
导入org.apache.lucene.search.span.span查询;
导入org.apache.lucene.search.span.SpanTermQuery;
导入org.apache.lucene.util.Version;
公共类可扩展QueryParserTest{
私有静态扩展createExtensions(){
ParserExtension ParserExtension=新ParserExtension(){
@凌驾
公共查询解析(最终扩展查询)引发ParseException{
QueryParser parser=query.getTopLevel parser();
//尽管Analyzer实现了java.io.Closeable,但不要在try with resources中使用它。
//否则,它将无法解析查询的其余部分。。。
Analyzer=parser.getAnalyzer();
字符串rawQueryString=query.getRawQueryString();
列表跨度=新建LinkedList();
try(TokenStream=analyzer.TokenStream(query.getField(),newstringreader(rawQueryString))){
stream.reset();
while(stream.incrementToken()){
String term=stream.getAttribute(charterMatAttribute.class).toString();
add(新的SpanTermQuery(新的术语(query.getField(),Term));
}
stream.close();
}捕获(IOE异常){
//不应该发生,因为它是从RAM读取的。
抛出新的ParseException(例如getMessage());
}
SpanQuery[]spansArray=span.toArray(新的SpanQuery[span.size()]);
span-arquery-span=新的span-arquery(spansArray,1,true,true);
返回新的SpanFirstQuery(SpanAr,1);
}
};
扩展名=新扩展名(“”);
扩展。添加(“spanfirst”,parsex张力);
返回扩展;
}
公共静态void main(字符串[]args)引发异常{
//小心:QueryParser不是线程安全的。
QueryParser QueryParser=new ExtendableQueryParser(Version.LUCENE_45,”,new StandardAnalyzer(Version.LUCENE_45),createExtensions();
Query=queryParser.parse(“\u spanfirst:hello”);
//打印“spanFirst(spanar([hello],1,true),1)”
System.out.println(查询);
queryParser=new ExtendableQueryParser(Version.LUCENE_45,“text”,new StandardAnalyzer(Version.LUCENE_45),createExtensions());
query=queryParser.parse(“\u spanfirst:hello”);
//打印“spanFirst(spanar([text:hello],1,true),1)”
System.out.println(查询);
queryParser=new ExtendableQueryParser(Version.LUCENE_45,“text”,new StandardAnalyzer(Version.LUCENE_45),createExtensions());
query=queryParser.parse(“hello”);
//打印“文本:你好”
System.out.println(查询);
}
}
当然,您可以根据需要扩展它


问候。

请发布您正在使用的Lucene版本。我使用的是4.5版atm