2010-03-13 14 views
13

Nie użyłem lucenu. Ostatni raz pytam (wiele miesięcy temu, może rok) ludzie zasugerowali lucene. Jeśli nie powinienem używać lucenu, co powinienem użyć? Jako am przykład powiedzieć, że są elementy oznaczone jak tegoJak zaimplementować wyszukiwanie znaczników? z lucenem?

  1. jabłka marchew
  2. jabłka
  3. marchew
  4. banan

Jeśli użytkownik jabłek wyszukiwania dont care jeśli istnieje preferencja z 1,2 i 4. Jednak widziałem wiele forów, które robią NIENAWIDZI, gdy użytkownik przeszukuje Apple Marchew 2 i 3, ma wysokie wyniki, a 1 jest trudny do znalezienia, mimo że pasuje do moich poszukiwań bliżej.

Chciałbym również możliwość przeszukiwania marchwi - takich, które tylko dostanę. 3. Nie jestem pewien, co powinienem zrobić, jeśli przeszukuję banan marchewki, ale tak długo, jak długo więcej przedmiotów oznaczonych 2 i 3 wynikami jest niższe ranking 1, kiedy przeszukuję jabłka marchewki, będę szczęśliwy.

Czy Lucene może to zrobić? i gdzie mam zacząć? Próbowałem to sprawdzić i kiedy widzę dużo zajęć, zobaczę tutoriale omawiające dokumenty, strony internetowe, ale żadne nie było jasne, co robić, gdy chcę coś oznaczyć. Jeśli nie lucen, co powinienem użyć do oznaczania?

+2

Lucene jest bardzo narzędziem do robienia tego. Jeśli chcesz dopasować jabłko i jabłka (liczba mnoga), po prostu musisz być ostrożny przy używaniu odpowiedniego narzędzia do sprawdzania języka podczas indeksowania i sprawdzania indeksu. – Photodeus

+1

Ranking 1,2 i 4 na słowie kluczowym apple (załóżmy, że użyjemy łodygi do obsługi liczby mnogiej) różni się, ponieważ algorytm rankingowy oblicza względną wagę terminu w polu. W przypadku 2 masz 1 trafienie i długość pola = 1. W przypadkach 1 i 4 masz 1 trafienie w polu 2-dniowym. Z grubsza rzecz biorąc, waga tych trafień różni się o czynnik 2. – Yaroslav

Odpowiedz

14

Lucene dla .net wydaje się być dojrzały. Nie ma potrzeby korzystania Java lub SOLR

Standard query language for Lucene pozwala równie rankingu wyszukiwanych haseł i negacja

Więc jeśli indeks Lucene miał pole „tag” zapytanie będzie

tag:apple* OR tag: carrot* 

co dałoby równy Ranking do każdego słowa, a więcej rankingu wagi udokumentować zarówno tagów

zanegować takie stosowanie etykietę

tag:carrot* NOT tag:apple* 

Prosty przykład pokazania indeksowania i zapytania za pomocą Lucene here

+0

Dzięki :). Mam nadzieję, że więcej osób będzie to robić (naprawdę potrzebuję pomocy!) –

+1

ten samouczek wygląda dobrze i link zapytania wygląda na użyteczny. Podejrzewam, że zetknę z tym przed końcem dnia. –

+0

Ważna rzecz (u mnie) byłaby wtedy, gdy istnieje relacja wiele do wielu z tagami. tzn. pojedynczy element może mieć wiele pól "tagów". To właśnie tam moc tagowania pochodzi od IMHO. Nie chciałbym przechowywać tagów jako ciągów pojedynczych słów, tj. "" Jeden dwa trzy "i trzeba wyszukiwać" "*** dwa ***" ". – synthesizerpatel

17

Edytuj: Możesz użyć Lucene. Oto wyjaśnienie, jak to zrobić w Lucene.net. Niektóre podstawy Lucene:

  • Dokument - to jednostka pamięci w Lucene. Jest to trochę analogiczne do rekordu bazy danych.
  • Pole - wyszukiwarka w Lucene. Analogiczne do kolumny bazy danych. Lucene wyszukuje tekst, wykonując zapytanie i dopasowując je do pól. Pole powinno zostać zaindeksowane, aby umożliwić wyszukiwanie.
  • Token - atom wyszukiwania w Lucene. Zwykle słowo, czasem fraza, litera lub cyfra.
  • Analizator - część Lucene, która przekształca pole w żetony.

Proszę przeczytać this blog post o tworzeniu i używaniu indeksu Lucene.net.

Zakładam, że tagujesz posty na blogu. Jeśli całkowicie się mylę, proszę powiedz to. Aby wyszukać znaczniki, musisz je przedstawić jako obiekty Lucene, a mianowicie jako tokeny w polu "znaczniki".

Jednym ze sposobów jest przypisywanie dokumentu Lucene do każdego posta na blogu. Dokument będzie zawierał co najmniej następujące pola:

  • id: unikalny identyfikator wpisu na blogu.
  • Treść: tekst posta na blogu.
  • tagi: lista tagów.

Indeksowanie: za każdym razem, gdy dodasz tag do postu, usuwasz go lub edytujesz, musisz zindeksować wpis. Analizator przekształci pola w ich reprezentację symboliczną.

Document doc = new Document(); 
doc.Add(new Field("id", i.ToString(), Field.Store.YES, Field.Index.NO)); 
doc.Add(new Field("content", text, Field.Store.YES, Field.Index.TOKENIZED)); 
doc.Add(new Field("tags", tags, Field.Store.YES, Field.Index.TOKENIZED)); 
writer.AddDocument(doc); 

Pozostała część to pobranie. W tym celu trzeba stworzyć QueryParser i przekazać go ciąg kwerendy tak:

QueryParser qp = new QueryParser(); 
Query q = qp.Parse(s); 
Hits = Searcher.Search(q); 

składnia trzeba dla s będą:

tags: apples tags: carrots 

Aby wyszukać jabłek lub marchwi

tags: carrots NOT tags: apples 

Aby uzyskać szczegółowe informacje na temat konstruowania s, zobacz Lucene Query Parser Syntax.

+0

Świetna odpowiedź. Szkoda, że ​​zaspałem i nie poszedłem do SO aż do zakończenia nagrody. Dodanie wyszukiwania nie wydaje się tak złe, jak początkowo sądziłem. –

+0

Dobra odpowiedź - właściwy sposób implementacji "tagów" jest ważnym pytaniem - ponieważ jest tak wiele (błędnie? Boleśnie wolno?) Sposobów, że można to zrobić, a idea tagów/folksonomii pozostaje tutaj (na korzyść hierarchiczne taksonomie, to jest) – Bobby