Elastic Nest Query возвращает точное соответствие с условиями - PullRequest
0 голосов
/ 08 сентября 2018

У меня есть индекс для примера аэропорта:

public class FlightIndex
{
    public int Id { get; set; }
    [keyword]
    public string Destination { get; set; }
}

В поле Destination хранятся такие данные, как «Лондонский аэропорт»: Лондонский аэропорт (XYZ) и «Лондонский аэропорт (ABC)».

Я бы хотел найти и вернуть точное совпадение на Destination.

В приведенном ниже запросе я хочу получить список рейсов, пункт назначения которых соответствует указанному списку пунктов назначения:

q.Terms(m => m.Field(f => f.Destination).Terms(parameters.Destinations
.Select(_ => _.ToLower()).ToList()));

Например, если parameters.Destinations содержит «Лондонский аэропорт (ABC)», то ничего не возвращается, но если он имеет «Лондонский аэропорт», он возвращает те, которые имеют «Лондонский аэропорт».

Кажется, он не работает с скобками.

Я не уверен, что нужно / можно сбежать.

1 Ответ

0 голосов
/ 08 сентября 2018

Звучит очень похоже на Destination, который не индексируется как тип данных keyword; если бы это было так, запрос terms вернул бы совпадения для входных значений дословно. Кроме того, круглые скобки не будут иметь значения, индексированное значение будет либо точно соответствовать, либо нет.

Я бы проверил отображение в целевом индексе с помощью Get Mapping API .

Вот пример, демонстрирующий его работу

var client = new ElasticClient(settings);

if (client.IndexExists("example").Exists)
{
    client.DeleteIndex("example");
}

client.CreateIndex("example", c => c
    .Mappings(m => m
        .Map<FlightIndex>(mm => mm
            .AutoMap()
        )
    )
);

client.Index(new FlightIndex { Id = 1, Destination = "London Airport (XYZ)" }, i => i
    .Index("example")
    .Refresh(Refresh.WaitFor)
);

client.Search<FlightIndex>(s => s
    .Index("example")
    .Query(q => q
        .Terms(t => t
            .Field(f => f.Destination)
            .Terms("London Airport (XYZ)")
        )
    )
);

отправляет следующие запросы и получает ответы

HEAD http://localhost:9200/example?pretty=true

Status: 200

------------------------------

PUT http://localhost:9200/example?pretty=true 
{
  "mappings": {
    "flightindex": {
      "properties": {
        "id": {
          "type": "integer"
        },
        "destination": {
          "type": "keyword"
        }
      }
    }
  }
}

Status: 200

{
  "acknowledged" : true,
  "shards_acknowledged" : true,
  "index" : "example"
}

------------------------------

PUT http://localhost:9200/example/flightindex/1?pretty=true&refresh=wait_for 
{
  "id": 1,
  "destination": "London Airport (XYZ)"
}

Status: 201

{
  "_index" : "example",
  "_type" : "flightindex",
  "_id" : "1",
  "_version" : 1,
  "result" : "created",
  "_shards" : {
    "total" : 2,
    "successful" : 1,
    "failed" : 0
  },
  "_seq_no" : 0,
  "_primary_term" : 1
}

------------------------------

POST http://localhost:9200/example/flightindex/_search?pretty=true&typed_keys=true 
{
  "query": {
    "terms": {
      "destination": [
        "London Airport (XYZ)"
      ]
    }
  }
}

Status: 200

{
  "took" : 13,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : 1,
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "example",
        "_type" : "flightindex",
        "_id" : "1",
        "_score" : 1.0,
        "_source" : {
          "id" : 1,
          "destination" : "London Airport (XYZ)"
        }
      }
    ]
  }
}

------------------------------
...