Анализатор / токенизатор elasticsearch ngram не работает?

кажется, что токенизатор ngram не работает или, возможно, я неправильно понимаю / использую его.

мой токенизатор делает минграм из 3 и maxgram из 5. Я ищу термин «мадонна», который определенно присутствует в моих документах в разделе Artist.name. Я могу найти термин с помощью других методов (с использованием простого анализатора и подобных), но не с помощью ngram.

то, что я пытаюсь достичь с помощью ngram, - это поиск имен и учет орфографических ошибок.

пожалуйста, просмотрите сокращенную версию моих сопоставлений, моих настроек и моего запроса, и если у вас есть какие-либо идеи, пожалуйста, дайте мне знать - это сводит меня с ума!

настройки...

{
   "myindex": {
      "settings": {
         "index": {
            "analysis": {
               "analyzer": {                  
                  "ngramAnalyzer": {
                     "type": "custom",
                     "filter": [
                        "lowercase"
                     ],
                     "tokenizer": "nGramTokenizer"
                  }  
               },
               "tokenizer": {
                  "nGramTokenizer": {
                     "type": "nGram",
                     "min_gram": "3",
                     "max_gram": "5"
                  }
               }
            },
            "number_of_shards": "5",
            "number_of_replicas": "1",
            "version": {
               "created": "1020199"
            },
            "uuid": "60ggSr6TREaDTItkaNUagg"
         }
      }
   }
}

сопоставления ...

{
   "myindex": {
      "mappings": {
         "mytype": {
            "properties": { 
               "artists.name": {
                  "type": "string",
                  "analyzer": "simple",
                  "fields": {
                     "ngram": {
                        "type": "string",
                        "analyzer": "ngramAnalyzer"
                     },
                     "raw": {
                        "type": "string",
                        "index": "not_analyzed"
                     }
                  }
               }
            }
         }
      }
   }
}

запрос ...

{"query": {"match": {"artists.name.ngram": "madonna"}}}

документ ...

{
   "_index": "myindex",
   "_type": "mytype",
   "_id": "602537592951",
   "_version": 1,
   "found": true,
   "_source": {
      "artists": [
         {
            "name": "Madonna",
            "id": "P    64565"
         }
      ]
   }
}

EDIT кстати, этот запрос работает (без ngram):

{"query": {"match": {"artists.name": "madonna"}}}

очевидно, это как-то связано с вложенным здесь объектом. Я, по-видимому, неправильно применяю ngram к вложенному объекту.

идеи?


person bigerock    schedule 18.06.2014    source источник


Ответы (1)


ок - разобрался. Я очень надеюсь, что это поможет кому-то, потому что это свело меня с ума.

вот как выглядело мое отображение:

{
   "myindex": {
      "mappings": {
         "mytype": {
            "properties": {               
               "artists": {
                  "properties": {
                     "id": {
                        "type": "string"
                     },
                     "name": {
                        "type": "string",
                        "analyzer": "ngramAnalyzer",
                        "fields": {
                           "raw": {
                              "type": "string",
                              "index": "not_analyzed"
                           }
                        }
                     }
                  }
               }
            }
        }
    }
}

и вот как я это сделал, используя синтаксис Nest ...

сначала у меня был подтип (класс) с именем Person, у которого есть имя и идентификатор, которые выглядят так (POCO) ...

[Serializable]
public class Person
{
    public string Name { get; set; }
    [ElasticProperty(Analyzer = "fullTerm", Index = FieldIndexOption.not_analyzed)]
    public string Id { get; set; }
}

а затем мое отображение выглядело примерно так ...

.AddMapping<MyIndex>(m => m
.MapFromAttributes()
.Properties(props =>
{
    props           
        .Object<Person>(x => x.Name("artists")
        .Properties(pp => pp
            .MultiField(
                mf => mf
                .Name(s => s.Name)
                .Fields(f => f
                    .String(s => s.Name(o => o.Name).Analyzer("ngramAnalyzer"))
                    .String(s => s.Name(o => o.Name.Suffix("raw")).Index(FieldIndexOption.not_analyzed))
                )
            )
        )
    )
)

Примечание: здесь объект Object, который указывает на то, что это еще один объект ниже моего типа «художники».

Спасибо !!!

edit: сопоставления curl могут быть примерно такими ...

curl-XPOST"http://localhost:9200/yourindex/_mappings"-H'Content-Type:application/json'-d'{"myindex":{"mappings":{"mytype":{"properties":{"artists":{"properties":{"id":{"type":"string"},"name":{"type":"string","analyzer":"ngramAnalyzer","fields":{"raw":{"type":"string","index":"not_analyzed"}}}}}}}}}}'
person bigerock    schedule 18.06.2014
comment
Можете ли вы сказать мне, как окончательное отображение и запрос должны быть в синтаксисе curl? - person Mr AJ; 29.04.2020