有 Java 编程相关的问题?

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

java Lucene复合查询搜索

我想在lucene索引中查询一些交叉点

数据:

字段1字段2字段3
行ID1值1值2
行ID2值3值4
行ID3值4值5
行ID3值6值5

查询: (字段2:VALUE4和字段3:VALUE5)(在字段1上相交)(字段2:VALUE4和字段3:VALUE5)

所以我的最终结果应该是ID3

任何意见都会大有裨益

提前谢谢


共 (2) 个答案

  1. # 1 楼答案

    让我在其中再添加一些数据

    PRODUCT_ID|HEADER_ID|HEADER_VALUE
    
    PRODUCT_01|HEADER_01|XYZ
    PRODUCT_02|HEADER_02|XYZ
    PRODUCT_02|HEADER_03|ABC
    PRODUCT_03|HEADER_03|ABC
    

    现在,假设我从UI中选择了如下标题:

    带有值XYZ的标题_02

    带有ABC值的标题_03

    理想情况下,我应该得到(标题_id 02,03与值XYZ,ABC匹配的预期产品)产品_02作为结果。我真的不知道查询中的产品

    如果我使用或查询,我将得到产品02以及产品03,这将是错误的。 如果我查询,我将一无所获,因为Lucene一次只做一个文档

    我希望这次我的问题是描述性的

    这是你的答复。:)

  2. # 2 楼答案

    我不明白你想做什么,那里没有交叉路口

    如果你想问我如何在lucene索引中进行复合搜索(AND),请参见下文

    TermQuery tq1= new TermQuery(new Term("VALUE4", FIELD2));
    TermQuery tq2= new TermQuery(new Term("VALUE5", FIELD3));
    // BooleanClauses Enum SHOULD says Use this operator for clauses that should appear in the matching documents.
    BooleanQuery bq = new BooleanQuery();
    bq.add(tq1,BooleanClause.Occur.SHOULD);
    bq.add(tq2,BooleanClause.Occur.SHOULD);
    IndexSearcher searcher = new IndexSearcher(index, true);
    TopScoreDocCollector collector = TopScoreDocCollector.create(10, true);
    //Iterate Collector hits
    //process HitCollector or whatever terms, results,etc
    

    编辑:

    //Parser meant for  using all the fields used for search
     MultiFieldQueryParser multiQueryParser = new MultiFieldQueryParser(
        searchFields, ANALYZER_NAME);
      multiQueryParser.setDefaultOperator(QueryParser.AND_OPERATOR);
    
     //You need to build something like this
    
     Query query1 = new TermQuery(HEADER,"HEADER_01");
     Query query2 = new TermQuery(XYZ_FIELD,"XYZ");
    
     Query query3 = new TermQuery(HEADER,"HEADER_02");
     Query query4 = new TermQuery(XYZ_FIELD,"ABC");
    
     BooleanQuery booleanQuery = new BooleanQuery();
    booleanQuery.add(query1, BooleanClause.Occur.MUST);
    booleanQuery.add(query2, BooleanClause.Occur.MUST);
    
     booleanQuery.add(query3, BooleanClause.Occur.MUST);
    booleanQuery.add(query4, BooleanClause.Occur.MUST);
    
     //Search the index