Твиты в индексе могут иметь такую ​​структуру (не строгий JSON, просто пытаясь передать структуру :)

{
  text: string
  created_at: DateTime
  mention: [
    {
      name: string
      screen_name: string
      start: int
      end: int
    }
  ],
  hashtag: [
    // multiple string/int props similar to mention
  ],
  link: [
    // multiple string/int props similar to mention
  ],
  user: {
    name: string
    screen_name: string
    profile_image_url: string
  }
}

Я получаю ожидаемые совпадения при использовании клиента NEST, но у меня сложилось впечатление, что я могу сопоставить POCO, чтобы привязать результаты, чтобы получить более сильный ввод, например.

public class TweetDocument
{
  public string text { get; set; }
  public DateTime created_at { get; set; }
  public List<Mention> mention { get; set; }
  public List<Hashtag> hashtag { get; set; }
  public List<Link> link { get; set; }
  public User user { get; set; }
}

public class Mention
{
  public string name { get; set; }
  public string screen_name { get; set; }
  public int start { get; set; }
  public int end { get; set; }
}

// ... other POCO's for Hashtag, Link and User

Строковое свойство text и свойство DateTime created_at связываются нормально, но свойства mention, hashtag и link все имеют значение NULL, когда я смотрю на совпадения ответа, например.

var response = client.Search<TweetDocument>(q);
var firstHit = response.Hits.Hits.FirstOrDefault();
// firstHit.Fields.hashtag, .mention, .link and .user are all null

Я видел некоторые атрибуты, но толком не понял, как их использовать, например. ElasticProperty и ElasticType. Как мне заполнить эти коллекции из моего индекса, включая дочернее свойство .User, не являющееся коллекцией?

0
David Fox 12 Фев 2014 в 18:26

1 ответ

Лучший ответ

Вы должны полностью связать их.

Если только вы не укажете свойство .Fields() в своем .Search()

Что происходит, так это то, что ваш документ будет находиться в _source, если вы не укажете Fields, обращения будут возвращать _source, если вы укажете поля, он вернет поля в виде массива, т.е.

 fields: {
    mention.name: ["name1", "name2"]
 }

Который в основном представляет собой плоский вид вашего исходного документа _source.

Было бы полезно, если бы вы могли вставить result.ConnectionStatus.Result, чтобы увидеть, как выглядят ваши результаты.

1
Martijn Laarman 12 Фев 2014 в 21:17
Я указывал неправильные поля, например. mention.name в запросе вместо просто mention. Мне также нужно было украсить POCO с помощью ElasticType(Name="whatever")], но я заставил его работать.
 – 
David Fox
13 Фев 2014 в 00:25
1
Вы можете использовать .SetPropertyNameInferrer(p=>p.ToPythonCase()) на ConnectionSettings, чтобы глобально указать, как выглядят имена свойств. NEST по умолчанию - имена свойств camelCase. Это помогает избежать необходимости повсюду оштукатурить атрибуты.
 – 
Martijn Laarman
13 Фев 2014 в 01:03