我有一个文件的文本:
war force
force war
我确实;"分割";并将单词保存在TextWord:中
TextWord[0]: war
TextWord[1]: force
TextWord[2]: force
TextWord[3]: war
我只想找到";战争力量";,但我的搜索也发现";武力战争";。我希望搜索考虑2条规则:
- 保持单词顺序。(如果我的str of query="war force",并且我只找到了索引0和1。这个";武力战争;将是错误的(
- 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
我无法重现这个问题。假设我的索引中有两个文档:
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个单词。