2015-11-30 4 views
2

У меня есть некоторые проблемы для фильтрации моих запросов в поле Guid. Вот пример моего кода. Что я упустил?Задачи NEST ElasticSearch Guid

public class myObject 
{ 
    public Guid Id {get;set} 
    public String Field1 { get; set; } 
    public String Field2 { get; set; } 
    public String Fieldn { get; set; } 
    public ReadingRightsEnum ReadingRights { get; set; } 
    public Guid UserId { get; set; } 
} 

// Index fct example 
public void IndexMyObject(obj) 
{ 
    var result = await myClient.IndexAsync(obj, i => i 
           .Index("myIndexName") 
           .Type("myObject") 
           .Id(obj.Id.ToString()) 
           .Refresh()); 
} 

// Index fct example 
public void SearchOnlyInMyUserObject(string userQuery, Guid userId) 
{ 
    var searchResult = await myClient.SearchAsync<myObject>(body => 
     body.Query(q => 
      q.QueryString(qs => qs.MinimumShouldMatchPercentage(100).Query(userQuery)) 
      && q.Term(i => i.UserId, userId)) 
     .Fields(f => f.Id) 
     .Size(200)); 
} 

// Index fct example with filter 
public void SearchOnlyInMyUserObject(string userQuery, Guid userId) 
{ 
    var filters = new List<FilterContainer> 
    { 
     new FilterDescriptor<myObject>().Bool(b => b.Must(m => m.Term(i => i.UserId, userId))); 
    }; 
    var searchResult = await myClient.SearchAsync<myObject>(body => 
     body 
     .Filter(f => f.And(filters.ToArray())) 
     .Query(q => 
      q.QueryString(qs => qs.MinimumShouldMatchPercentage(100).Query(userQuery))) 
     .Fields(f => f.Id) 
     .Size(200)); 
} 

Обе функции работают нормально, если я фильтрую другие параметры, но ничего не возвращаю при фильтрации по Guid. Должен ли конвертировать мой указатель в строку при индексировании моего объекта?

Если я делаю http://xxxxxxx:9200/_search?q=userId:e4aec7b4-c400-4660-a09e-a0ce064f612e, это прекрасно работает.

Любые идеи?

Спасибо по заранее

Редактировать 06/12 здесь образец myindex:

myIndexName":{ 
    "mappings":{ 
     "myObject":{ 
      "properties":{ 
       "readingrights":{ 
        "type":"integer" 
       }, 
       "id":{ 
        "type":"string" 
       }, 
       "field1":{ 
        "type":"string" 
       },  
       "field2":{ 
        "type":"string" 
       },     
       "userId":{ 
        "type":"string" 
       } 
      } 
     } 
    } 
} 
+0

Как выглядит отображение для индекса 'myIndexName' и типа' myObject'? –

ответ

0

Я не хорошо сейчас, почему Guid есть проблемы ... но я прекрасно плохой альтернативный способ для Сейчас: Вместо:

q.QueryString(qs => qs.MinimumShouldMatchPercentage(98).Query(userQuery)) 
&& q.Term(i => i.UserId, userId) 

я сделать двойной QueryString:

q.QueryString(qs => qs.MinimumShouldMatchPercentage(98).Query(userQuery)) 
&& q.QueryString(qs => qs.MinimumShouldMatchPercentage(100).Query(" \"" + userId+ "\"")) 
1

Поле GUID сложно в Elastic. Если вы используете функцию анализа эластичного клиента, он покажет вам, как он разбивает GUID. AnalyzeRequest obj = new AnalyzeRequest (_index, item); _client.Analyze (obj);

Когда вы создаете сущность, вам нужно определить guid как не анализируемый. [String (Index = FieldIndexOption.NotAnalyzed)] public Guid TextAssetId

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