我需要构建一个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"条件?感谢。
答案 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
不完全相同,但希望它足够接近。