2012-08-03 13 views
10

czy istnieje możliwość zaktualizowania nowego pola do istniejącego dokumentu? Na przykład: Istnieje dokument z kilkoma polami, np.Zaktualizuj nowe pole do istniejącego dokumentu

ID=99999 
Field1:text 
Field2:text 

Niniejszy dokument jest już w indeksie, teraz chcę, aby wstawić nowe pole do tego dokumentu bez starych danych:

ID=99999 
Field3:text 

Na razie, stary dokument zostanie usunięty, a nowy dokument z identyfikatorem zostanie utworzony. Więc jeśli teraz szukać ID 99999 wynik będzie:

ID=99999 
Field3:text 

czytałem to w Solr Wiki

Jak mogę zaktualizować konkretnego pola istniejącego dokumentu?

Chcę zaktualizować określone pole w dokumencie, czy to możliwe? Potrzebuję tylko indeksować jedno pole dla> określonego dokumentu. Czy muszę zindeksować cały dokument w tym celu?

Nie, tylko jeden dokument. Załóżmy, że masz CMS i edytujesz jeden dokument. Będziesz musiał ponownie indeksować ten dokument tylko za pomocą instrukcji add solr dla całego dokumentu (nie tylko dla jednego pola).

W Lucene, aby zaktualizować dokument, operacja jest naprawdę kasowana, a następnie dodawana. Będziesz potrzebował>, aby dodać kompletny dokument, ponieważ nie ma takiej semantyki "zaktualizuj tylko pole" w Lucene.

Czy istnieje rozwiązanie tego problemu? Czy ta funkcja zostanie zaimplementowana w kolejnej wersji (obecnie korzystam z wersji 3.6.0). W celu obejścia tego problemu pomyślałem o napisaniu skryptu lub aplikacji, która będzie zbierała istniejące pola, dodaje nowe pole i aktualizuje cały dokument. Ale myślę, że to będzie kosztować wydajność. Czy masz jakieś inne pomysły?

poważaniem

Odpowiedz

10

mam dla Panstwa 2 odpowiedzi (zarówno mniej lub bardziej złe):

  1. Aby zaktualizować złożony w terminie dokumentów Solr trzeba reindex cały dokument (do aktualizacji Field3 ciągu ID dokumentu : 99999 musisz ponownie zindeksować ten dokument z wartościami dla wszystkich pól)
  2. W Solr 4 zaimplementowano taką funkcję, ale mają one warunek: wszystkie pola muszą być przechowywane, a nie tylko indeksowane. Dzieje się tak, że używają zapisanych wartości i ponownie indeksują dokument w tle. Jeśli jesteś zainteresowany, jest fajny artykuł na ten temat: http://solr.pl/en/2012/07/09/solr-4-0-partial-documents-update/ To rozwiązanie ma oczywistą wadę i jest to rozmiar indeksu, gdy przechowujesz wszystkie pola.

Mam nadzieję, że pomoże to Państwu w rozwiązaniu problemu. Jeśli masz więcej pytań, zapytaj:

+0

Dzięki wielkie! Twoja pierwsza odpowiedź jest po prostu tym, o czym myślałem. Czy sądzisz, że to bardzo ucierpi na wydajności? W przypadku odpowiedzi 2: Czy możesz podać oficjalny link do tego dziennika zmian? Nie mogłem znaleźć tej funkcji. Dobry link :-) –

+0

Zależy od tego, jak często wprowadzasz zmiany, jak duży jest twój indeks, jak duże są dokumenty, jakiego sprzętu używasz. Jakakolwiek zmiana kosztuje IO, procesor itp., Musiałbyś eksperymentować ile w twoim przypadku. W drugiej części nie mogę znaleźć tego w dzienniku: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/CHANGES.txt?view=markup jednak Yonik Seeley potwierdza to w http: // grokbase.com/t/lucene/solr-user/127bc3svh7/updating-documents – Fuxi

+0

Mój indeks zawiera około 1,8 mln dokumentów, każdy dokument ma około 10-30 pól wielowartościowych. Problem polega na tym, że rozwój aplikacji będzie kosztować zbyt dużo czasu, jeśli nie będę mógł jej użyć z powodu dużej utraty wydajności. Czy zaleca się zmianę wersji na wersję 4.0 alpha? Czy masz jakieś doświadczenie? Wielkie dzięki :-) –

6

Jest to możliwe w Solr 4. E.g.Rozważmy następujący dokument

{ 
"id": "book123", 
"name" : "Solr Rocks" 
} 

Aby dodać pole autorowi dokumentu wartość pola będzie obiekt JSON z „set” atrybut i wartość pola

$ curl http://localhost:8983/solr/update -H 'Content-type:application/json' -d ' 
[ 
{"id"  : "book123", 
    "author" : {"set":"The Community"} 
} 
]' 

nowego dokumentu

$ curl http://localhost:8983/solr/get?id=book123 

będzie

{ 
"doc" : { 
    "id" : "book123", 
    "name" : "Solr Rocks" 
    "author": "The Community" 
} 
} 

Zestaw doda lub zastąp pole autora. Wraz z zestawem masz również opcję zwiększania (inc) i dodawania (dodawania)

+0

Chcę zaktualizować dokument w polu autora bez użycia pola ID. Jak mogę to zrobić? – iNikkz

0

Od wersji Solr 4 możesz zaktualizować pole w solr .... nie ma potrzeby ponownego indeksowania wszystkich indeksów .... różnych modyfikatorów są obsługiwane jak ....

zestaw - zestaw lub wymienić konkretną wartość lub usunąć wartość NULL, jeśli jest określony jako nową wartość add - dodaje dodatkową wartość do listy remove - usuwa wartość (lub lista wartości) z listy removeregex - usuwa z listy, która pasuje do podanego wyrażenia regularnego Java inc - zwiększa wartość numeryczną o określoną wartość (użyj wartości ujemnej do zmniejszenia)

przykład:

dokument

{ 
"id": "1", 
"name" : "Solr" 
"views" : "2" 
} 

teraz aktualizować z

$ curl http://localhost:8983/solr/demo/update -d ' 
[ 
{"id"   : "1", 
    "author" : {"set":"Neal Stephenson"}, 
    "views" : {"inc":3}, 
    } 
]' 

doprowadzi do

{ 
"id": "1", 
"name" : "Solr" 
"views" : "5" 
"author" : "Neal Stephenson" 
} 
Powiązane problemy