Lucene如何添加QueryParser parameter InOrder=true



我有一个文件的文本:

war force
force war

我确实;"分割";并将单词保存在TextWord:中

TextWord[0]: war
TextWord[1]: force
TextWord[2]: force
TextWord[3]: war

我只想找到";战争力量";,但我的搜索也发现";武力战争";。我希望搜索考虑2条规则:

  1. 保持单词顺序。(如果我的str of query="war force",并且我只找到了索引0和1。这个";武力战争;将是错误的(
  2. Slop=0(因此,在"战争"one_answers"武力"之间没有单词,正确的是"战争力量",但这种"战争SOMEWORD力量"是错误的(

我试试这个:

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( ";武力战争";。我不知道如何确保我只有这样的结果:;战争力量";。告诉我怎么做?我是不是错过了什么?


如果我使用荧光笔,我会得到结果:

?<b>war</b> <b>force</b> bookcase bookcase1
force war

我的代码与荧光笔:

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");
}

但如果我用荧光笔,我就找不到单词了。

要排除术语或短语,可以使用-运算符("禁止"运算符(:

"war force" -"force war"

因此,在Java中,这将是:

Query query = parser.parse(""war force" -"force war""); 

您也可以使用AND NOT:

"war force" AND NOT "force war"

您可以在经典的查询解析器语法文档中看到更多详细信息。


更新

自从你第一次问这个问题以来,这个问题已经改变了很多!

现在有两个新问题:

  1. 您的查询似乎正在检索不应该检索的文档。

  2. 您无法获得匹配条款的位置。

问题1

我无法重现这个问题。假设我的索引中有两个文档:

Doc 1: State WEAPONRY war force word1 And force war Book WEAPONRY
Doc 2: State WEAPONRY war force 123 War WORD1 Force And war Book WEAPONRY

当我使用以下查询时:

"war force" AND NOT "force war"

我找到了Doc 2,但没有找到Doc 1——这是正确的。

我不知道你为什么看到不正确/出乎意料的结果。我想这可能是因为您的索引包含意外的数据,或者可能使用了意外的索引方法。这个问题没有任何帮助来解释这一点。

问题2

现在,你的问题包含两个使用荧光笔的例子:

  • 快速矢量荧光笔
  • 标准荧光笔

但是,您的两个代码片段都不会报告匹配令牌的位置。要做到这一点,你可以使用这个答案中显示的方法:

Lucene如何获取查询结果的位置?

当我使用这种方法,并使用如上所示的相同数据和查询时,我得到以下结果:

Found term: war
Position:   3
Found term: force
Position:   4

同样,这是正确的:匹配的术语是找到的文档中的第3个和第4个单词。

相关内容

最新更新