Поиск / фильтрация Elasticsearch по вхождению или порядку в массиве - PullRequest
0 голосов
/ 10 марта 2020

В моем индексе есть поле data , в котором

Я хочу получить c 2 как результат, то есть логически где b предшествует a в поле данных массива.

do c 1:

data = ['a','b','t','k','p']

do c 2:

data = ['p','b','i','o','a']

В настоящее время я пытаюсь использовать термины на [a, b], а затем проверять порядок в другом фрагменте кода. Пожалуйста, предложите какой-нибудь лучший способ.

1 Ответ

1 голос
/ 11 марта 2020

Насколько я понимаю, единственный способ сделать это - использовать Span Queries , однако он не будет применим к массиву значений.

Вам необходимо объединить значения в одно поле text с whitespace в качестве разделителя, повторно обработать документы и использовать запрос Span Near для этого поля:

Найдите приведенное ниже сопоставление, образец документа, запрос и ответ:

Сопоставление:

PUT my_test_index
{
  "mappings": {
    "properties": {
      "data":{
        "type": "text"
      }
    }
  }
}

Образцы документов:

POST my_test_index/_doc/1
{
  "data": "a b"
}

POST my_test_index/_doc/2
{
  "data": "b a"
}

Запрос диапазона:

POST my_test_index/_search
{
    "query": {
        "span_near" : {
            "clauses" : [
                { "span_term" : { "data" : "a" } },
                { "span_term" : { "data" : "b" } }
            ],
            "slop" : 0,                  <--- This means only `a b` would return but `a c b` won't. 
            "in_order" : true            <--- This means a should come first and the b
        }
    }
}

Обратите внимание, что slop controls the maximum number of intervening unmatched positions permitted.

Ответ:

{
  "took" : 0,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 1,
      "relation" : "eq"
    },
    "max_score" : 0.36464313,
    "hits" : [
      {
        "_index" : "my_test_index",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 0.36464313,
        "_source" : {
          "data" : "a b"
        }
      }
    ]
  }
}

Дайте мне знать, если это поможет!

...