有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Lucene:如何按特定术语进行搜索

我想用一个特定的字符串来搜索Lucene
例如:我有标签1-“Hello World”,2-“Hello,Steve”,3-“Helloween”,最后4-“Hello”如果我查找最后一个标签(Hello),Lucene会带上所有标签,因为它们在某个时候都有“Hello”。我需要一个运算符或逻辑,使搜索不带“like”

使用子句“must_not”(-operator)可以避免这种情况,查询将是: term:hello -term:world。但事实并非如此,因为我需要找到所有其他不应该搜索的单词

private <T> Query createQuery(final Class<T> clazz, String s, final String[] fields, final SearchFactory searchFactory, final Boolean allowLeadingWildcard) throws ParseException {
    final Analyzer analyzer = searchFactory.getAnalyzer(clazz);
    final QueryParser parser = new MultiFieldQueryParser(Version.LUCENE_36, fields, analyzer);
    Query query = null;
    try{
        query = parser.parse(s);
    } catch(...){...}
    return query;

我对Lucene的了解很短,所以我将放置一个SQL示例,看看是否更容易理解

/*This is what Lucene is doing. It will bring "HELLO", "HELLO WORLD", "Hello, Steve"...*/
WHERE table.tag LIKE "%HELLO%" 
/*This is what I want. Match exactly the term "HELLO" and nothing more*/
WHERE table.tag = "HELLO" 

我猜这就是应用程序中使用的分析仪:

public class AnalyserCustom extends Analyzer {

    @Override
    public TokenStream tokenStream(final String fieldName, final Reader reader) {
        final StandardTokenizer tokenizer = new StandardTokenizer(Version.LUCENE_36, reader);

        TokenStream stream = new StandardFilter(Version.LUCENE_36, tokenizer);
        stream = new LowerCaseFilter(Version.LUCENE_36, stream);
        return new ASCIIFoldingFilter(stream);
    }
}

属性标签是这样的:

...
@Field
private String tagname;
...

有什么建议吗
附:我是Lucene的新手


共 (1) 个答案

  1. # 1 楼答案

    您必须使用索引字段,这将为搜索的字符串生成一个特定的标记,请尝试使用关键字分析器