ElasticSearch/Elastica: поиск точного термина, который включает и/или другие стоп-слова

Я пытаюсь заставить ES QueryString соответствовать поисковому запросу, который включает в себя «и», но все, что я пробовал до сих пор (испытание разных анализаторов, токензиеров, фильтров), не сработало. В терминах MySQL я хочу:

WHERE field LIKE '%abbot and costello%'

Я пробовал различные конфигурации, это то, что я сейчас использую (небольшое улучшение в том, что оно соответствует «аббату» (с завершающим пробелом), но все еще не соответствует чему-либо с «и» в нем:

$eI->create(array(
    'analysis' => array(
        'analyzer' => array(
            'indexAnalyzer' => array(
                'type' => 'custom',
                'tokenizer' => 'SQLedgeNGram',
                'filter' => array(
                    'lowercase',
                ),
            ),
            'searchAnalyzer' => array(
                'type' => 'custom',
                'tokenizer' => 'SQLedgeNGram',
                'filter' => array(
                    'lowercase', 
                ),
            )
        ),
        'tokenizer' => array(
            'SQLedgeNGram' => array(
                'type' => 'edgeNGram',
                'min_gram' => 2,
                'max_gram' => 35,
                'side' => 'front'   
            ),
            'standardNoStop' => array(
                'type' => 'standard',
                'stopwords' => ''   
            )   
        )
    )
), true
);

Вот мое значение поля тестового примера:

Abbott and Costello - Funniest Routines, Vol. 

Пробуя различные анализаторы, я просто не могу найти совпадения с чем-либо, включающим "и".

Полученные результаты:

searching [abbot] 
 @       searchAnalyzer          total results: 1
 @       standard                total results: 1
 @       simple                  total results: 1
 @       whitespace              total results: 1
 @       keyword                 total results: 1


searching [abbot ] 
 @       searchAnalyzer          total results: 1
 @       standard                total results: 1
 @       simple                  total results: 1
 @       whitespace              total results: 1
 @       keyword                 total results: 1


searching [abbot and c] 
     searchAnalyzer          total results: 0
     standard                total results: 0
     simple                  total results: 0
     whitespace              total results: 0
     keyword                 total results: 0


searching [abbot and cost] 
     searchAnalyzer          total results: 0
     standard                total results: 0
     simple                  total results: 0
     whitespace              total results: 0
     keyword                 total results: 0


searching [abbot and costello] 
     searchAnalyzer          total results: 0
     standard                total results: 0
     simple                  total results: 0
     whitespace              total results: 0
     keyword                 total results: 0


searching [abbot costello] 
     searchAnalyzer          total results: 0
     standard                total results: 0
     simple                  total results: 0
     whitespace              total results: 0
     keyword                 total results: 0

person Eva    schedule 15.04.2013    source источник


Ответы (1)


У вас опечатка в запросе (отсутствует вторая буква t в слове abbott). Вам также не нужно запускать поиск через ngrams. Токенизатор поиска может быть ключевым словом, и он все равно будет работать для фраз короче 35 символов. И, кстати, edgeNGram выдаст вам только конечные подстановочные знаки. Для начальных и конечных подстановочных знаков вам необходимо использовать фильтр nGram.

person imotov    schedule 16.04.2013
comment
Я знаю, что это был простой ответ, но спасибо, что нашли время, чтобы указать на проблему, это причинило мне много горя ... проверил все, кроме самого очевидного :( - person Eva; 17.04.2013