2016-08-17 23 views
5

Wydaje się to tak proste, że jestem przekonany, że muszę coś przeoczyć. Nie można ustalić, jak wykonać następujące czynności w Lucene:Wyszukiwane hasło Sitecore Lucene z dopasowaniem spacji to samo słowo bez przestrzeni

Problem

  • szukam nazw miejscowości.
  • Mam pole o nazwie Name
  • Jest za pomocą Lucene.Net.Analysis.Standard.StandardAnalyzer
  • Jest TOKENIZED
  • Wartość Name zawiera 1 miejsca w wartość: halong bay.
  • Wyszukiwane hasło może, ale nie musi, zawierać dodatkowe miejsce z powodu odmiennych kulturowo pisowni lub prawdziwych błędów w pisowni. Na przykład. ha long bay zamiast halong bay.
  • Jeśli użyję terminu halong bay, otrzymam trafienie.
  • Jeśli użyję terminu ha long bay, nie otrzymam trafienia.

Próba rozwiązania

Oto kod używam budować mój orzecznik przy użyciu LINQ do Lucene z Sitecore:

var searchContext = ContentSearchManager.GetIndex("my_index").CreateSearchContext(); 
var term = "ha long bay"; 
var predicate = PredicateBuilder.Create<MySearchResultItemClass>(sri => sri.Name == term); 
var results = searchContext.GetQueryable<MySearchResultItemClass>().Where(predicate); 

Próbowałem również rozmytej mecz używając rozszerzenia .Like():

var predicate = PredicateBuilder.Create<MySearchResultItemClass>(sri => sri.Like(term)); 

To również nie daje wyników dla ha long bay.

Jak skonfigurować Lucene w Sitecore wrócić trafienie dla obu halong bay i ha long bay wyszukiwanych haseł, najlepiej bez konieczności robić niczego wyjątkowego z terminem wejścia (np odpędzania przestrzeń, dodając symbole wieloznaczne, itp)?

Uwaga: zdaję sobie sprawę, że pozwoliłoby to na wygenerowanie trafienia o nazwie h a l o n g b a y, ale nie sądzę, że mam z tym problem.

+1

Dla pisowni zwrotów to często zamiast używać synonimy uzyskania logiki wyszukiwania do pokrycia wszystkich baz. Zajrzyj do tego wpisu, aby skonfigurować go w Sitecore. Może warto się zastanowić, jeśli masz więcej tego typu scenariuszy - http://firebreaksice.com/sitecore-synonym-search-with-lucene/ –

+0

Dzięki za informacje o synonimach. Mogę to zaimplementować dla innych typów wyszukiwań. Jednak moim zdaniem nie jest to synonim. Jest to to samo słowo, ale z dodanymi białymi znakami. Być może jestem pedantyczny, ale powodem, dla którego mam synonimy, jest określenie całkowicie różnych słów, które nie mają nic wspólnego matematycznie, chociaż mają to samo znaczenie np. "Szybki" i "szybki" mają zero wspólnych liter. – theyetiman

Odpowiedz

0

Coś takiego może załatwić sprawę:

var predicate = PredicateBuilder.False<MySearchResultItemClass>(); 
foreach (var t in term.Split(' ')) 
{ 
    var tempTerm = t; 
    predicate = predicate.Or(p => p.Name.Contains(tempTerm)); 
} 
var results = searchContext.GetQueryable<MySearchResultItemClass>().Where(predicate); 

Robi podzielić ciąg wejściowy, ale myślę, że nie jest „wyobraźnia”;)

+0

Jestem zaniepokojony, że to będzie pasować do czegokolwiek słowem "zatoka" lub "ha" lub "długa", co nie jest tym, za czym jestem. – theyetiman

3

TOKENIZED pola oznacza, że ​​wartość pola jest dzielony przez token (w tym przypadku miejsce), a wynikające z niego terminy są dodawane do słownika indeksu. Jeśli wskażesz "halong bay" w takim polu, stworzysz warunki "halong" i "bay".

To normalne, że wyszukiwarka nie może uzyskać tego wyniku dla zapytania "ha long", ponieważ nie zna żadnego wyniku z terminami "ha" lub "long".

Podejściem ręcznym byłoby zdefiniowanie wszystkich innych sposobów zapisu nazwy miejsca w innym wielowartościowym indeksie o nazwie AlternateNames. Następnie możesz wydać takie zapytanie: Name==query OR AlternateNames==query.

Automatyczne podejście polegałoby również na indeksowaniu nazw miejsc bez spacji w oddzielnym obliczonym polu indeksu o nazwie CompactName. Następnie można wydać tego rodzaju zapytania: Name==query OR CompactName==compactedQueryWithoutSpaces

Mam nadzieję, że to pomoże

Jeff

+0

Dzięki za odpowiedź. Zastanawiam się, czy zmiana na nieononimizowane pozwoliłaby na dopasowanie bez manipulowania wprowadzanym terminem? Staram się nie pisać osobnej listy alternatywnych nazw, aby uwzględnić białe spacje. – theyetiman

Powiązane problemy