有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Lucene如何添加QueryParser参数InOrder=true?

我有一个文本文件:

war force

force war

我进行“拆分”并将word保存在TextWord中:

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

我只想找到“武力”,但我的搜索也找到了“武力战争”。 我希望搜索时考虑2条规则:

  1. 保持语序。(如果我的str of query=“war force”并且我只找到了索引0和1,那么这个“force war”就错了)
  2. 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) 个答案

  1. # 1 楼答案

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

    "war force" -"force war"
    

    因此,在Java中,这将是:

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

    你也可以使用AND NOT

    "war force" AND NOT "force war"
    

    您可以在经典查询解析器syntax documentation中看到更多详细信息


    更新

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

    现在有两个新问题:

    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"
    

    我找到了文件2,但不是文件1——这是正确的

    我不知道你为什么会看到不正确/意外的结果。我猜这可能是因为您的索引包含意外数据,或者可能使用了意外的索引方法。这个问题中没有任何东西可以解释这一点

    问题2

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

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

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

    Lucene how can I get position of found query?

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

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

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