2016-12-15 4 views
0

Я использую Searchblox для индексации и поиска файлов, которые сам вызывает ES 2.x для выполнения задания. Searchblox использует файл "mapping.json" для инициализации отображения при создании индекса. Вот link к этому файлу. Как «@Russ Cam» предложил here, я создал свой собственный контент класса с помощью следующего кода (так же, как он сделал с индексом «вопросы» и класс «Вопрос»):Невозможно получить какие-либо документы с помощью NEST от elasticsearch

public class Content 
{ 
    public string type { get; set; } 
    public Fields fields { get; set; } 
} 

public class Fields 
{ 
    public Content1 content { get; set; } 
    public Autocomplete autocomplete { get; set; } 
} 

public class Content1 
{ 
    public string type { get; set; } 
    public string store { get; set; } 
    public string index { get; set; } 
    public string analyzer { get; set; } 
    public string include_in_all { get; set; } 
    public string boost { get; set; } 
} //got this with paste special->json class 

Эти поля из класса контента (тип, магазин и т. д.) поступают из файла mapping.json, указанного выше. Теперь, когда я (так же, как ты показала мне) выполнить следующий код:

var searchResponse = highLevelclient.Search<Content>(s => s.Query(q => q 
     .Match(m => m.Field(f => f.fields.content) 
     .Query("service") 

Все я получаю в ответ на переменном searchResponse является:

Valid NEST response built from a successful low level call on POST: /idx014/content/_search 
Audit trail of this API call: 
-HealthyResponse: Node: http://localhost:9200/ Took: 00:00:00.7180404 
Request: 
{"query":{"match":{"fields.content":{"query":"service"}}}} 
Response: 
{"took":1,"timed_out":false,"_shards":{"total":5,"successful":5,"failed":0},"hits":{"total":0,"max_score":null,"hits":[]}} 
And no documents in searchResponse.Documents. Contradictorily, when I search for the "service" query on Searchblox or make an API call to localhost:9200 with the Sense extension of Google Chrome, I get 2 documents. (the documents that I was looking for) 

Короче говоря, все, что я хочу, чтобы быть в состоянии:

  1. получить все документы (нет критериев)
  2. получить все документы в пределах диапазона времени и на основе ключевых слов .. такие, как «сервис»

Что я делаю неправильно? Я могу предоставить дополнительную информацию, если это необходимо. Спасибо всем за подробные ответы.

+0

Я отлажена следующая строка: уага searchResponse = highLevelclient.Search (с => запрос (д => д .Match (т => m.Field (е => f.fields.content) .Query (» service ") И получил следующее: [error] (https://drive.google.com/open?id=0B1LnMWaj1afaQ0ltd0ExVGc3OTQ). Почему я получаю _ «Метод может быть вызван только для типа, для которого Type.IsGenericParameter является истинным». _ Ошибка? Эта ошибка должна что-то делать со мной gettin ** 0 ** документов? – cemowski23

+0

Возможно, вам лучше использовать Apache Searchblox, чтобы получить документы в формате json или xml. – user7313404

+0

Также проверьте базовые учетные данные для доступа к elasticsearch @ 9200, так как Searchblox предоставляет уровень безопасности перед доступом к данным. – user7313404

ответ

1

Ваш C# POCO неверен в отношении вашего картографирования; ваш тип документа - "sdoc", и каждое из свойств объекта "properties" является полем этого типа документа; Эти поля отображаются в свойствах вашего C# POCO.

В качестве примера, чтобы вы начали

public class Document 
{ 
    [String(Name = "uid")] 
    public string UId { get; set; } 

    public string Content { get; set; } 
} 

NEST по умолчанию будет ГорбатыйРегистром POCO имен свойств, так "content" будет случай правильно в соответствии с вашим отображением, однако, мы используем отображение атрибутов для "uid" поля чтобы назвать его в соответствии с сопоставлением (мы можем пойти дальше здесь и установить дополнительные значения свойств атрибута, чтобы полностью соответствовать отображению; see the automapping documentation).

Теперь искать с документом, давайте создадим настройку подключения и клиент для использования

void Main() 
{ 
    var pool = new SingleNodeConnectionPool(new Uri("http://localhost:9200")); 
    var connectionSettings = new ConnectionSettings(pool) 
      .InferMappingFor<Document>(t => t 
       // change the index name to the name of your index :) 
       .IndexName("index-name") 
       .TypeName("sdoc") 
       .IdProperty(p => p.UId) 
      ); 

    var client = new ElasticClient(connectionSettings); 

    // do something with the response 
    var searchResponse = client.Search<Document>(s => s 
     .Query(q => q 
      .Match(m => m 
       .Field(f => f.Content) 
       .Query("service") 
      ) 
     ) 
    ); 
} 

Мы установили клиент с некоторыми правилами вывода для Document типа, которые будут использоваться при взаимодействии с Elasticsearch. Выше запрос выдает следующий запрос JSON

{ 
    "query": { 
    "match": { 
     "content": { 
     "query": "service" 
     } 
    } 
    } 
} 

Как и в сторону, я заметил, что отображение содержит multi_field типа; multi_field types were removed in Elasticsearch 1.0 (все поля по-прежнему существуют, только фактического типа нет), поэтому убедитесь, что вы на самом деле запускаете Elasticsearch 2.x на Searchblox, поскольку NEST 2.x поддерживается только с Elasticsearch 2.x.

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