java Lucene如何添加QueryParser参数InOrder=true?
我有一个文本文件:
war force
force war
我进行“拆分”并将word保存在TextWord中:
TextWord[0]: war
TextWord[1]: force
TextWord[2]: force
TextWord[3]: war
我只想找到“武力”,但我的搜索也找到了“武力战争”。 我希望搜索时考虑2条规则:
- 保持语序。(如果我的str of query=“war force”并且我只找到了索引0和1,那么这个“force war”就错了)李>
- Slop=0(因此在单词“war”和“force”之间没有单词,正确的是“war force”,但是这个“war-SOMEWORD force”是错误的)
我试试这个:
Query query = parser.parse(" \"war force\"~0x ");
Query query = parser.parse(" \"war force\"~0 ");
Query query = parser.parse("war AND force");
Query query = parser.parse("war force");
但是这样的要求并没有达到预期的效果,请告诉我你是如何做到的
我的代码:
Analyzer customAnalyzer = CustomAnalyzer.builder()
.withTokenizer("standard")
.build();
QueryParser parser = new QueryParser("tags", customAnalyzer);
Query query = parser.parse("\"war force\" AND NOT \"force war\"");
IndexSearcher searcher = new IndexSearcher(reader);
TopDocs docs = searcher.search(query, 10);
System.out.println(" ");
FastVectorHighlighter highlighter = new FastVectorHighlighter();
FieldQuery fieldQuery = highlighter.getFieldQuery(query);
FieldTermStack stack = new FieldTermStack(reader, 0, "tags", fieldQuery);
TermInfo myTermInfo = stack.pop();
while(myTermInfo != null){
System.out.println("word[" + myTermInfo.getPosition() + "]: " + myTermInfo.getText());
myTermInfo = stack.pop();
}
我的输出:
word[0]: war
word[1]: force
word[4]: force
word[5]: war
我需要的结果是:
word[0]: war
word[1]: force
我看到了一份文件。如果我们有这样一个请求:“Word1 Word2”,并且在这些词之间没有运算符,那么默认情况下,OR运算符被放置。这意味着请求“战争力量”将等于请求“战争力量”,因此将发现:1)“战争力量”;2) “武力战争”。我不知道如何确保我只有这样的结果:“战争力量”。 告诉我怎么做?我错过什么了吗
如果我使用highlighter,我会得到以下结果:
?<b>war</b> <b>force</b> bookcase bookcase1
force war
我的highlighter代码:
Analyzer customAnalyzer = CustomAnalyzer.builder()
.withTokenizer("standard")
.build();
//... Above, create documents with two fields, one with term vectors (tv) and one without (notv)
IndexSearcher searcher = new IndexSearcher(reader);
QueryParser parser = new QueryParser("tags", customAnalyzer);
Query query = parser.parse(" \"war force\"~0 ");
//Query query = parser.parse("*Case");
//Query query = new PrefixQuery(new Term("tags", "book")); //Поиск чтобы слово начиналось на строку "book" - "bookcase"
TopDocs hits = searcher.search(query, 10);
SimpleHTMLFormatter htmlFormatter = new SimpleHTMLFormatter("<b>", "</b>");
Highlighter highlighter = new Highlighter(htmlFormatter, new QueryScorer(query));
for (int i = 0; i < hits.scoreDocs.length; i++) {
int id = hits.scoreDocs[i].doc;
Document doc = searcher.doc(id);
String text = doc.get("tags");
TokenStream tokenStream = TokenSources.getAnyTokenStream(searcher.getIndexReader(), id, "tags", customAnalyzer);
TextFragment[] frag = highlighter.getBestTextFragments(tokenStream, text, true, 100);//highlighter.getBestFragments(tokenStream, text, 3, "...");
for (int j = 0; j < frag.length; j++) {
if ((frag[j] != null) && (frag[j].getScore() > 0)) {
System.out.println((frag[j].toString()));
}
}
System.out.println("finish test");
}
但如果我用荧光笔,我就没有找到的单词
# 1 楼答案
要排除术语或短语,可以使用
-
运算符(“禁止”运算符):因此,在Java中,这将是:
你也可以使用
AND NOT
:您可以在经典查询解析器syntax documentation中看到更多详细信息
更新
自从你第一次问这个问题以来,这个问题已经改变了很多
现在有两个新问题:
您的查询似乎正在检索不应检索的文档
你无法得到匹配项的位置
问题1
我无法重现这个问题。假设我的索引中有两个文档:
当我使用以下查询时:
我找到了文件2,但不是文件1——这是正确的
我不知道你为什么会看到不正确/意外的结果。我猜这可能是因为您的索引包含意外数据,或者可能使用了意外的索引方法。这个问题中没有任何东西可以解释这一点
问题2
现在,你的问题包含两个使用荧光灯的例子:
但是,两个代码片段都不会报告匹配标记的位置。要做到这一点,您可以使用以下答案中所示的方法:
Lucene how can I get position of found query?
当我使用这种方法,并使用如上所示的相同数据和查询时,我会得到以下结果:
同样,这是正确的:匹配的术语是找到的文档中的第三个和第四个单词