수색…


소개

전통적인 SQL 데이터베이스와 같이 문서에 기본 키 필드가 있으면 Lucene 색인에서 문서를 쉽게 삭제할 수 있습니다.

그러나 문서의 여러 필드를 기반으로 여러 문서를 삭제하는 것이 필요한 경우도 있습니다. Lucene API를 사용하면 삭제에 사용할 쿼리를 지정하여이 작업을 수행 할 수 있습니다.

이렇게하려면 올바른 분석기를 선택하고 쿼리를 작성한 다음 쿼리를 indexWriter에 전달하여 문서를 삭제하십시오.

통사론

  1. indexWriter.deleteDocuments (multiTermQuery);
  2. Query multiTermQuery = 새 QueryParser ( "", 분석기) .parse ( "field_name1 :"필드 값 1 "AND field_name2 :"필드 값 2 "");
  3. BooleanQuery multiTermQuery = 새 BooleanQuery (); multiTermQuery.add (new TermQuery (new Term ( "field_name1", "field value 1")), BooleanClause.Occur.MUST); multiTermQuery.add (new TermQuery (new Term ( "field_name2", "field value 2")), BooleanClause.Occur.MUST);

비고

분석기 선택의주의 사항

즉각적인 것은 아니지만 사용중인 분석기는 쿼리가 실행되는 방식에 큰 차이가 있습니다. StandardAnalyzer가 "the"및 "a"와 같은 일반적인 영어 단어를 걸러 내기 때문입니다. 다른 분석기 (예 : KeywordAnalyzer)를 선택하여 정확하게 일치시킬 수 있습니다. 이것은 명백하게 물론 Lucene의 응용 프로그램에 달려 있습니다.

분석기 선택

우선, 어떤 분석기를 사용하고 있는지주의하십시오. 나는 StandardAnalyzer가 'the'와 'a'와 같은 일반적인 단어를 걸러냅니다. 필드의 값이 'A'인 경우이 문제가 발생합니다. KeywordAnalyzer를 고려해 볼 수 있습니다.

분석기 주변의이 게시물을 참조하십시오.

// Create an analyzer:
// NOTE: We want the keyword analyzer so that it doesn't strip or alter any terms:
// In our example, the Standard Analyzer removes the term 'A' because it is a common English word.
// http://stackoverflow.com/a/9071806/231860
KeywordAnalyzer analyzer = new KeywordAnalyzer();

쿼리 파서

다음으로 QueryParser를 사용하여 쿼리를 만들 수 있습니다.

기본 연산자를 재정의하는 방법에 대해서는이 게시물을 참조하십시오.

// Create a query parser without a default field in this example (the first argument):
QueryParser queryParser = new QueryParser("", analyzer);

// Optionally, set the default operator to be AND (we leave it the default OR):
// http://stackoverflow.com/a/9084178/231860
// queryParser.setDefaultOperator(QueryParser.Operator.AND);

// Parse the query:
Query multiTermQuery = queryParser.parse("field_name1:\"field value 1\" AND field_name2:\"field value 2\"");

Query API

또는 API를 사용하여 직접 쿼리를 구성하여 동일한 결과를 얻을 수 있습니다.

BooleanQuery 작성에 대한 자습서를 참조하십시오.

BooleanQuery multiTermQuery = new BooleanQuery();
multiTermQuery.add(new TermQuery(new Term("field_name1", "field value 1")), BooleanClause.Occur.MUST);
multiTermQuery.add(new TermQuery(new Term("field_name2", "field value 2")), BooleanClause.Occur.MUST);

쿼리와 일치하는 문서 삭제

그런 다음 마지막으로 쿼리를 작성자에게 전달하여 쿼리와 일치하는 문서를 삭제합니다.

이 질문에 대한 답을보십시오.

여기 API를 참조하십시오.

// Remove the document by using a multi key query:
// http://www.avajava.com/tutorials/lessons/how-do-i-combine-queries-with-a-boolean-query.html
indexWriter.deleteDocuments(multiTermQuery);


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow