自定义代码,用于组合所有类型的lucene查询类型

时间:2017-06-05 21:27:42

标签: java lucene

我正在构建一个项目,可以生成用于搜索lucene索引的自定义查询。我做了一些研究,发现了许多查询lucene索引的方法,如:

  • 布尔搜索:field:white cloths AND field shoes
  • 术语查询搜索:字段:我是男孩
  • 邻近查询搜索:5/5 / 2016-10 / 6/2017 2017

令人困惑的是:QueryParser可以执行所有这些查询,还是必须编写一个方法来执行单独的查询,例如在Tutorialspoint查询编程中,他们提供了各种查询的示例以及如何实现它。

到目前为止,这是我的代码:

Unit

以下是使用不同查询类型的教程点示例:

/** Setting the searcher method to search the index passed **/
    private void indexSearch(String indexDir, String queryX, int repeat, int hitsPerPage, String field, boolean raw) throws Exception{
        /*** starting the method process ***/
        // Here we process the searcher data
        reader = DirectoryReader.open(FSDirectory.open(Paths.get(indexDir)));
        searcher = new IndexSearcher(reader);
        Analyzer analyzer = new StandardAnalyzer();
        // BufferedReader
        BufferedReader in = null;
        boolean checkQ=false;
        // Lets check if query is a file
        File cfile=new File(queryX);
        // Now lets check
        if(cfile.isFile()){
        // We process queryX as a file
        in = Files.newBufferedReader(Paths.get(queryX), StandardCharsets.UTF_8);
        checkQ=true;
        }
        else{
        checkQ=false;
        }

       /** We pass query in different query types **/
       parser = new QueryParser(field, analyzer);
       // Here we are going to select the data we use for line
       String line = checkQ != true ? queryX : in.readLine();
       // Now lets trim the line

          line = line.trim();

          /******* NOW LETS CALL FUNCTION TO PASS QUERY ******/
          search(line);

    }

  /** Making complex query priviledge to get data **/
    public TopDocs search( String searchQuery) throws Exception{
        // Lets pass query
        query = parser.parse(searchQuery);
        // Now lets return
        return searcher.search(query, 100);
        }

    public TopDocs search(Query query) throws IOException{
        return searcher.search(query, 100);
        }


  /**** Making the getDocument for the search ****/
    public Document getDocument(ScoreDoc scoreDoc) throws CorruptIndexException, IOException{
        return searcher.doc(scoreDoc.doc);
        }


  /** Simple command-line based search demo. */
  public void close() throws Exception {
  // Lets close reader
      reader.close();
  }

我希望能够组合所有lucene查询类型,以便我可以查询我的索引,如本教程中所述:http://www.javaranch.com/journal/2004/04/Lucene.html

我的项目从xml文件创建动态字段并使用它来存储索引,所以我知道字段,我也希望能够获得点击的字段。

1 个答案:

答案 0 :(得分:1)

如果我没错,似乎你想从文件中读取查询字符串然后执行它们。并且您希望能够在文件中编写各种查询。正确的吗?

有可能。虽然对查询进行编码可以提供灵活性,但所有查询都可以通过反复试验以文本格式编写。

我建议查看this。它是Lucene的Query Parser Syntax文档。

我还建议使用代码编写所有查询,并打印最终Query的String表示。这将使您深入了解如何以String格式编写查询。