Java 带有短语顺序slop和OR子句的Lucene查询

Java 带有短语顺序slop和OR子句的Lucene查询,java,lucene,Java,Lucene,我需要构建一个lucene查询,这样它既可以用于“将int转换为string”也可以用于“将integer转换为string”。此外,在匹配的结果中,术语之间可能有更多的单词。例如“如何将正确的int转换为格式良好的字符串”。我尝试了以下方法: Query query = new SpanNearQuery(new SpanQuery[] { new SpanTermQuery(new Term("title", "convert")),

我需要构建一个lucene查询,这样它既可以用于“将int转换为string”也可以用于“将integer转换为string”。此外,在匹配的结果中,术语之间可能有更多的单词。例如“如何将正确的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;
以及以下各项:

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;
以及以下各项:

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;

他们似乎没有一个能满足我的需要。有人能帮我写一个有效的查询,其中既包括术语的顺序,也允许指定“或”条件吗?谢谢。

您的第一次尝试离目标最近。这里的绊脚石是如何处理int和integer

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

至于在查询构造中严格设置它,我不知道有什么方法可以将布尔查询包装成span查询,但通配符,或者更准确地说,前缀,查询似乎可以达到这个目的,可以通过将其包装成一个

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或integer
不完全相同,但希望它足够接近。

您的两次首次尝试看起来不错,应该已经成功了。但由于一切都取决于分析器,所以您应该使用打开索引以查看它是如何被分析的。在第一次尝试中,我没有看到一种方法可以在int/integer中提到“OR”。在第二次尝试中,顺序被忽略了。我明白了,我误解了这个问题。是的,在第二种情况下,由于斜率,顺序被忽略。