Java 带有短语顺序slop和OR子句的Lucene查询
我需要构建一个lucene查询,这样它既可以用于“将int转换为string”也可以用于“将integer转换为string”。此外,在匹配的结果中,术语之间可能有更多的单词。例如“如何将正确的int转换为格式良好的字符串”。我尝试了以下方法: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")),
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”。在第二次尝试中,顺序被忽略了。我明白了,我误解了这个问题。是的,在第二种情况下,由于斜率,顺序被忽略。