Szukaj…


Wprowadzenie

Usuwanie dokumentów z indeksu Lucene jest łatwe, gdy w polu znajduje się pole klucza podstawowego (jak w tradycyjnych bazach danych SQL).

Czasem jednak potrzebne jest usunięcie wielu dokumentów opartych na wielu polach w dokumencie. Interfejs API Lucene pozwala to osiągnąć, określając zapytanie do usunięcia.

Aby to zrobić, wybierz odpowiedni Analizator, zbuduj zapytanie, przekaż zapytanie do indexWriter, aby usunąć dokumenty.

Składnia

  1. indexWriter.deleteDocuments (multiTermQuery);
  2. Zapytanie multiTermQuery = new QueryParser („”, analizator) .parse („nazwa_pola1:„ wartość 1 pola ”ORAZ nazwa_pola2:„ wartość pola 2 ””);
  3. BooleanQuery multiTermQuery = new BooleanQuery (); multiTermQuery.add (nowy TermQuery (nowy Termin („nazwa_pola1”, „wartość pola 1”)), BooleanClause.Occur.MUST); multiTermQuery.add (nowy TermQuery (nowy Termin („nazwa_pola2”, „wartość pola 2”)), BooleanClause.Occur.MUST);

Uwagi

Ostrzeżenia dotyczące wyboru analizatora

Nie jest to od razu oczywiste, ale używany analizator ma ogromny wpływ na sposób uruchamiania zapytania. Wynika to z faktu, że StandardAnalyzer odfiltrowuje typowe angielskie słowa, takie jak „the” i „a”. Możesz wybrać inny analizator (np. KeywordAnalyzer), aby pasował dokładnie. Oczywiście zależy to od zastosowania Lucene.

Wybór analizatora

Przede wszystkim uważaj, którego analizatora używasz. Przez chwilę byłem zaskoczony, ale zdałem sobie sprawę, że StandardAnalyzer odfiltrowuje popularne słowa, takie jak „a” i „a”. Jest to problem, gdy twoje pole ma wartość „A”. Możesz rozważyć KeywordAnalyzer:

Zobacz ten post wokół analizatora.

// 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();

Parser zapytań

Następnie możesz utworzyć zapytanie za pomocą QueryParser:

Zobacz ten post dotyczący zastępowania domyślnego operatora.

// 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\"");

API zapytań

Możesz to zrobić, samodzielnie konstruując zapytanie za pomocą ich interfejsu API:

Zobacz ten samouczek dotyczący tworzenia 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);

Usuń dokumenty pasujące do zapytania

Następnie w końcu przekazujemy kwerendę pisarzowi, aby usunąć dokumenty pasujące do zapytania:

Zobacz odpowiedź na to pytanie.

Zobacz API tutaj

// 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
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow