2015-11-30 110 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時什麼都不返回。當我索引我的對象時,是否應該將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) 

我做了雙重查詢字符串:

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