Java 在apache lucene中删除具有完全匹配的文档

Java 在apache lucene中删除具有完全匹配的文档,java,lucene,Java,Lucene,我想删除ApacheLucene中只有完全匹配的文档。例如,我有包含文本的文档: Document1: Bilal Document2: Bilal Ahmed Doucument3: Bilal Ahmed - 54 当尝试删除带有查询“Bilal”的文档时,它会删除所有这三个文档,而只删除第一个完全匹配的文档 我使用的代码如下: String query = "bilal"; String field = "userNames"; Term term

我想删除ApacheLucene中只有完全匹配的文档。例如,我有包含文本的文档:

  Document1: Bilal
  Document2: Bilal Ahmed
  Doucument3: Bilal Ahmed - 54
当尝试删除带有查询“Bilal”的文档时,它会删除所有这三个文档,而只删除第一个完全匹配的文档

我使用的代码如下:

    String query = "bilal";
    String field = "userNames";

    Term term = new Term(field, query);

    IndexWriter indexWriter = null;

    File indexDir = new File(idexedDirectory);
    Directory directory = FSDirectory.open(indexDir);

    Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_46);
    IndexWriterConfig iwc = new IndexWriterConfig(Version.LUCENE_46, analyzer);

    indexWriter = new IndexWriter(directory, iwc);        

    indexWriter.deleteDocuments(term);
    indexWriter.close();    
以下是我为文档编制索引的方式:

    File indexDir = new File("C:\\Local DB\\TextFiled");
    Directory directory = FSDirectory.open(indexDir);

    Analyzer  analyzer = new StandardAnalyzer(Version.LUCENE_46);
    IndexWriterConfig iwc = new IndexWriterConfig(Version.LUCENE_46, analyzer);              

   //Thirdly We tell the Index Writer that which document to index
   indexWriter = new IndexWriter(directory, iwc);

    int i = 0;

    try (DataSource db = DataSource.getInstance()) {

        PreparedStatement ps = db.getPreparedStatement(
                "SELECT user_id, username FROM " + TABLE_NAME + " as au" + User_CONDITION);

        try (ResultSet resultSet = ps.executeQuery()) {

            while (resultSet.next()) {
                i++;
                doc = new Document();

                text = resultSet.getString("username");                    
                doc.add(new StringField("userNames", text, Field.Store.YES));

                indexWriter.addDocument(doc);
                System.out.println("User Name : " + text + " : " + userID);
            }
        }

您没有提供如何为这些文档编制索引。如果它们是使用
StandardAnalyzer
索引的,并且标记化处于启用状态,则可以理解您会得到这些结果-这是因为
StandardAnalyzer
标记每个单词的文本,并且由于您的每个文档都包含
Bilal
,因此您会命中所有这些文档

一般建议是,您应该始终添加一个唯一的id字段,并根据该id字段进行查询/删除


如果你不能做到这一点——将同一文本作为单独的字段编制索引——而不进行标记化——并使用短语查询来查找精确的匹配项,但这听起来像是一个可怕的黑客行为。

谢谢你的建议。我试试这个,如果有任何进一步的问题,我会告诉你。感谢againI,我还提到了如何为我的文档编制索引。我还有一个问题,如果我使用您的第二个选项,即在文档中添加了一个整数字段,例如userID,如:document doc=new document();doc.add(doc.add(new IntField(“userID”,userID,Field.Store.YES));现在,如果我想搜索id为1000的文档,那么我将如何进行查询?String query=“1000”或其他任何方式?查询将是
userID:1000
类似于String query=“userID:1000”?我还有一个问题,在一个文档中,我添加了一个整数字段,例如userID,比如:document doc=new document();doc.add(doc.add(new IntField(“userID”,userID,field.Store.YES));现在,如果我想搜索id为1000的文档,那么我将如何进行查询?String query=“1000”或者通过其他方式?