Java 在apache lucene中删除具有完全匹配的文档
我想删除ApacheLucene中只有完全匹配的文档。例如,我有包含文本的文档: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
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”或者通过其他方式?