2014-04-16 2 views
1

CEST의 elasticsearch 인덱스를 검색하는 데 NEST를 사용하고 있습니다.
Google 크롬 확장 검색에서 검색 쿼리를 실행하면 작동합니다.
하지만 C# 코드에서 검색하려고 할 때 다음과 같은 예외가 얻을 :

An exception of type 'Newtonsoft.Json.JsonSerializationException' occurred in Newtonsoft.Json.dll but was not handled in user codeNEST로 검색하는 동안 JsonSerializationException이 발생했습니다.

Additional information: JsonConverter DictionaryKeysAreNotPropertyNamesJsonConverter on System.Collections.Generic.IDictionary2[System.String,System.Double] _IndicesBoost is not compatible with member type IDictionary2.

내 C# 클래스는 다음과 같습니다

[ElasticType(Name = "ElasticSearchModel")] 
public class ElasticSearchModel 
{ 
    [ElasticProperty(Type = FieldType.string_type)] 
    public string Id { get; private set; } 
    [ElasticProperty(Type = FieldType.string_type)] 
    public string Url { get; set; } 
    protected Dictionary<string, string> Properties { get; set; } 
    [ElasticProperty(Type = FieldType.nested)] 
    public Array ModelProperties 
    { 
     get 
     { 
      List<string[]> returnvalue = new List<string[]>(); 
      foreach (var keyvaluepair in Properties) 
      { 
       if (!string.IsNullOrEmpty(keyvaluepair.Key)) 
       { 
        string[] props = new string[2]; 
        props[0] = keyvaluepair.Key; 
        props[1] = keyvaluepair.Value; 
        returnvalue.Add(props); 
       } 
      } 

      return returnvalue.ToArray(); 
     } 
    } 

    public ElasticSearchModel(string id) 
    { 
     this.Id = id; 
     this.Properties = new Dictionary<string, string>(); 
    } 

    public void AddProperty(string key, string value) 
    { 
     Properties.Add(key, value); 
    } 
} 


그리고이 코드를 검색 결과를 얻는 데 사용됩니다.

var descriptor = new SearchDescriptor<ElasticSearchModel>().Indices(new string[] { "kickstartconcept" }); 
searchresult = ElasticClient.Search(descriptor.QueryString(terms)); //Where terms is a string with the content of the query 


사전에 색인을 처음 시도했지만 동일한 예외가있었습니다.
그래서 배열로 시도했지만 그 중 하나를 작동하지 않습니다.
누군가가 예외가 발생하는 곳과 해결 방법을 알고 있습니까? 이건 내 ElasticSearch 지수의 항목 당신의 시간을
감사합니다, Corné

(EDIT) : 색인에서 샘플 항목을 게시

"_source": { 
      "id": "1082", 
      "url": "/", 
      "modelProperties": [ 
       [ 
       "title", 
       "MyPageTitle" 
       ], 
       [ 
       "content", 
       "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec nec lacus luctus, pulvinar ante vitae, feugiat velit. In gravida, urna ac lacinia tincidunt, metus erat pellentesque sem, sed congue massa velit non enim. Suspendisse metus sapien, ornare vel lectus ut, pulvinar feugiat justo. In diam metus, ultricies id augue interdum, dapibus placerat est. Cras vel nulla sed arcu dictum molestie eu ut sem. Suspendisse potenti. Ut mattis odio a aliquam vehicula. Proin varius commodo quam, sed semper orci mattis et. Suspendisse lacinia purus quis arcu semper rhoncus. Integer ut quam ut elit pharetra malesuada." 
       ], 
       [ 
       "hideinnavigation", 
       "0" 
       ], 
       [ 
       "subtitle", 
       "" 
       ], 
       [ 
       "gridLayout", 
       "<content><area name=\"Body\"><block>1137</block><block>1139</block><block>1080</block></area><area name=\"Footer\"><block>1080</block></area></content>" 
       ], 
       [ 
       "searchpage", 
       "" 
       ] 
      ] 
     } 
+0

현재 Elasticsearch 색인에 저장된 항목의 예를 게시 할 수 있습니까? –

+0

방금 ​​내 게시물의 하단에 추가했습니다. – CHop

답변

0

이 문제를 해결할 수 없습니다.
그래서 나는 모든 것을 재창조하기로 결정했습니다.

내 새로운 모델은 다음과 같습니다 : 나는 속성에서 모든 데이터 anotations를 제거하고 elasticsearch 스키마를 다시

public class ElasticSearchDocument 
{ 
    public string Id { get; set; } 
    public Dictionary<string, string> Properties { get; private set; } 

    // Constructors and methods 
} 

.
다음 NEST를 버전 1.0 (PreRelease)으로 업데이트했습니다.

이제이 줄을 사용하여 검색 할 수 있습니다

SearchDescriptor<ElasticSearchDocument> descriptor = new SearchDescriptor<ElasticSearchDocument>(); 
descriptor.AllTypes(); 
descriptor.QueryString(term); 
descriptor.Size(20); 

// Search 
var results = c.Search<ElasticSearchDocument>(d => d = descriptor); 

지금 잠시 동안 문제가 없었어요. 어쩌면 이것이 누군가에게 도움이되기를 바랍니다.

0

감사합니다. 정확한 구조와 일치하는 히트를 검색하려면 클래스가 다음 속성을 갖도록 변경하십시오.

[ElasticType(Index = [email protected]] 
public Dictionary<string,string> ModelProperties { get; set; } 

하지만이를 수용하기 위해, 당신은 다음에 색인 항목을 변경해야합니다 :

다음을 사용하여 순수한 사전을 더 찾고 있다면

[ElasticType(Index = [email protected]] 
public List<Dictionary<string,string>> ModelProperties { get; set; } 

{ 
     "id": "1082", 
     "url": "/", 
     "modelProperties": { 
      "title": "MyPageTitle", 
      "content": "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec nec lacus luctus, pulvinar ante vitae, feugiat velit. In gravida, urna ac lacinia tincidunt, metus erat pellentesque sem, sed congue massa velit non enim. Suspendisse metus sapien, ornare vel lectus ut, pulvinar feugiat justo. In diam metus, ultricies id augue interdum, dapibus placerat est. Cras vel nulla sed arcu dictum molestie eu ut sem. Suspendisse potenti. Ut mattis odio a aliquam vehicula. Proin varius commodo quam, sed semper orci mattis et. Suspendisse lacinia purus quis arcu semper rhoncus. Integer ut quam ut elit pharetra malesuada.", 
      "hideinnavigation": "0", 
      "subtitle": "", 
      "gridLayout": "<content><area name=\"Body\"><block>1137</block><block>1139</block><block>1080</block></area><area name=\"Footer\"><block>1080</block></area></content>", 
      "searchpage": "" 
     } 
    } 

희망이 있습니다.

+0

답장을 보내 주셔서 감사합니다. 나는 이것을 시도했지만 이제는 얻는다 : 'Nest.ElasticTypeAttribute'는 'Index'에 대한 정의를 포함하지 않는다. [ElasticProperty (Type = FieldType. @ object)]을 시도하면 이전과 완전히 똑같은 예외가 발생합니다. Fyi NEST 릴리스 0.12.0을 사용하고 있습니다. – CHop

+0

ModelProperties 속성의 서명도 변경 했습니까? 이 작업을 수행하려면이 두 가지를 모두 변경해야합니다. 배열 유형은 현재 문서 구조에서 작동하지 않습니다. 또한 ModelProperties를 현재 인덱싱 된 문서 구조와 일치 시키면 Properties 속성을 제거 할 수 있다는 사실을 잊어 버렸습니다. –

관련 문제