Lucene用短语命令slop和OR子句查询

时间:2014-11-08 10:18:29

标签: java lucene

我需要构建一个lucene查询,使其适用于"将int转换为字符串"和"将整数转换为字符串"。此外,在匹配的结果中,术语之间可能会有更多的单词。例如"我如何将正确的int转换为格式良好的字符串"。我尝试了以下方法:

Query query = new SpanNearQuery(new SpanQuery[] {
                new SpanTermQuery(new Term("title", "convert")),
                new SpanTermQuery(new Term("title", "int")),
                new SpanTermQuery(new Term("title", "string"))
              },
              50,
              true);        
    return query;

以及以下内容:

MultiPhraseQuery mpq = new MultiPhraseQuery();
    mpq.setSlop(50);
    mpq.add(new Term("title","convert"));       
    mpq.add(new Term[]{new Term("title","int"),new Term("title", "integer")});        
    mpq.add(new Term("title","string"));            
    return mpq;

以及以下内容:

BooleanQuery bq = new BooleanQuery();           
    bq.add(new TermQuery(new Term("title","convert")), Occur.MUST);
    BooleanQuery idFilter = new BooleanQuery();
    idFilter.setMinimumNumberShouldMatch(1);
    idFilter.add(new TermQuery(new Term("title", "int")), BooleanClause.Occur.SHOULD);
    idFilter.add(new TermQuery(new Term("title", "integer")), BooleanClause.Occur.SHOULD);          
    bq.add(idFilter, BooleanClause.Occur.MUST);
    bq.add(new TermQuery(new Term("title","string")), Occur.MUST);
    return bq;

他们似乎都没有做我需要的事情。有人可以帮我写一个有效的查询,其中包括术语的顺序,也允许指定" OR"条件?感谢。

1 个答案:

答案 0 :(得分:0)

您的第一次尝试最接近商标。绊脚石是如何处理int与整数。

我想到了两种方法。最好的方法可能是将SynonymFilter合并到您的分析仪中。这将允许您设置在索引时自动将integer转换为int的同义词,从而减少了提出更复杂的查询逻辑的需要。

至于在查询构造中严格设置,我不知道将布尔查询包装到span查询中的方法,但是通配符,或者更确切地说,前缀查询似乎是这样的将这个目的用于SpanNearQuery,将其包装在SpanMultiTermQueryWrapper中,例如:

Query query = new SpanNearQuery(new SpanQuery[] {
         new SpanTermQuery(new Term("title", "convert")),
         new SpanMultiTermQueryWrapper(new PrefixQuery(new Term("title", "int"))),
         new SpanTermQuery(new Term("title", "string"))
     },
     50,
     true);
return query;

int*可能与int OR integer不完全相同,但希望它足够接近。