使用NEST搜索时出现JsonSerializationException

时间:2014-04-16 10:01:28

标签: c# json elasticsearch nest

我正在使用NEST在C#中搜索弹性搜索索引。
当我在Google Chrome扩展程序Sense中运行搜索查询时,它可以正常运行。
但是当我尝试从C#代码中搜索时,我得到以下异常:

An exception of type 'Newtonsoft.Json.JsonSerializationException' occurred in Newtonsoft.Json.dll but was not handled in user code

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


我首先尝试索引字典,但是给出了同样的例外 所以我尝试使用数组,但这也不起作用。
有人知道异常来自何处以及如何解决它?
谢谢你的时间,Corné

(编辑)这是我的ElasticSearch索引中的一个条目:

"_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",
                 ""
              ]
           ]
        }

2 个答案:

答案 0 :(得分:0)

感谢您发布索引中的示例项。如果要检索与该确切结构匹配的匹配,请将您的类更改为具有以下属性。

 [ElasticType(Index = FieldType.@object]
 public List<Dictionary<string,string>> ModelProperties { get; set; }

如果您正在寻找更多纯词典,请使用以下内容:

 [ElasticType(Index = FieldType.@object]
 public 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": ""
       }
    }

希望这会有所帮助......

答案 1 :(得分:0)

我无法解决这个问题。
所以我决定重新创造整个事物。

我的新模特看起来像这样:

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

    // Constructors and methods
}

我从属性中删除了所有数据anotations并重新创建了elasticsearch架构 接下来我将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);

Haven现在有一段时间没问题了。我希望这可能对某人有帮助。

相关问题