2015-06-15 2 views
1

Я ищу по Event объектам в моем индексе elasticsearch, используя NEST. На базовом уровне, Event выглядит следующим образом:Эластичный поиск NEST-фасет - это токенизирующее поле, даже если атрибут NotAnalyzed определен в сопоставлении

public class Event 
{ 
    public int Id {get; set;} 
    [ElasticProperty(Index = FieldIndexOption.NotAnalyzed)] 
    public string EventType {get; set;} 
} 

Мой поиск выглядит следующим образом:

SearchDescriptor<Event> search = new SearchDescriptor<Event>() 
    .From(0) 
    .Take(10000) 
    .QueryRaw(@"{""match_all"": {} }") 
    .FacetTerm("my_facet", f => f.OnField("eventType")); 

var esResults = esClient.Search<Event>(search); 

В настоящее время, все мои документы в ЧС имеет eventType из Test type, но фаска вернули результаты для Test и type, вместо того, чтобы возвращать их вместе.

Я понимаю, что Index = FieldIndexOption.NotAnalyzed должен решить эту проблему, но я все еще вижу ее. Почему это происходит?

ответ

0

Вы точно знаете, что ваш индекс был создан с соответствующим картографированием?

Этот код

var indicesOperationResponse = client.CreateIndex(descriptor => descriptor 
    .Index(indexName) 
    .AddMapping<Event>(m => m 
     .MapFromAttributes())); 

создает индекс с последующим отображением

{ 
    "my_index" : { 
     "mappings" : { 
      "event" : { 
       "properties" : { 
        "eventType" : { 
         "type" : "string", 
         "index" : "not_analyzed" 
        }, 
        "id" : { 
         "type" : "integer" 
        } 
       } 
      } 
     } 
    } 
} 

Ваш запрос отлично работает и возвращает правильные грани:

{ 
    "took": 1, 
    "timed_out": false, 
    "_shards": {..}, 
    "hits": {..}, 
    "facets": { 
     "my_facet": { 
     "_type": "terms", 
     "missing": 0, 
     "total": 3, 
     "other": 0, 
     "terms": [ 
      { 
       "term": "Test type", 
       "count": 3 
      } 
     ] 
     } 
    } 
} 

Я тестировал против elasticsearch и НЕСТ 1.5 +0,0.

+0

Я не называл явным образом 'CreateIndex' в любой точке. Должно ли это сопоставление быть на месте во время создания индекса? – Jim

+0

Вы можете воспользоваться [put mapping api] (https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-put-mapping.html). Зависит от вашего прецедента, разместите более подробную информацию, так что, возможно, я смогу рассказать что-то умнее. – Rob

+0

У меня есть простой прототип для тестирования ES в продукте, который ранее использовался Solr. Я индексирую с помощью 'ElasticClient.IndexMany()', а затем я ищу, как описано в моем вопросе. – Jim

Смежные вопросы