Elasticsearch 2.4 фильтр поиска: смешать термин с регулярным выражением - PullRequest
0 голосов
/ 11 июня 2019

Я хочу сделать поиск, чтобы смешать термин и регулярное выражение.book_author - это термин поиска, который я хочу только для конкретного автора.Для book_name я хочу выполнить поиск по шаблону для поддержки функции опережающего ввода в моем пользовательском интерфейсе.Но все книги начинаются с «Мне нравится», термин «поиск» игнорируется.Можно ли смешивать термин с поиском регулярных выражений?Что я делаю неправильно?

{
"size": 0,
"query": {
    "constant_score": {
        "filter": [{
                "term": {
                    "book_author": "mike jones"
                }
            }, {
                "regexp": {
                    "book_name": "I like.*"
                }
            }
        ]
    }
},
"aggs": {
    "values": {
        "terms": {
            "field": "book_name",
            "size": 0
        }
    }
}

}

1 Ответ

2 голосов
/ 11 июня 2019

Я думаю, вам нужно использовать must, потому что вы хотите документы, которые соответствуют двум ключам. Например:

Я создал эти mapping и documents, чтобы показать вам, как вы можете извлекать только те документы, которые удовлетворяют совпадению, двумя ключами, которые вы используете для поиска.

   PUT so_test7
   {
     "mappings":{
       "_doc": {
          "properties":{
             "book_author":{"type": "keyword"},
             "book_name": {"type":"text"}
           }
         }
       }
    }

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

  POST /so_test7/_doc/1
  {
    "book_author": "mike jones",
    "book_name": "I like this"
  }

 POST /so_test7/_doc/2
 {
   "book_author": "some random",
   "book_name": "I like that"
 }

 POST /so_test7/_doc/3
 {
   "book_author": "new one",
   "book_name": "nope"
 }

 POST /so_test7/_doc/4
 {
   "book_author": "mike jones",
   "book_name": "not matching"
 }

и вот мой запрос

  GET /so_test7/_search
    { 
      "query":{
        "bool":{
          "must":[{
              "match":{"book_author":"mike jones"}
              },
              {
               "match":{"book_name":"I like.*"}
              }
             ]
          }
       }
     }

и вот ответ

 {
   "took" : 2,
   "timed_out" : false,
   "_shards" : {
   "total" : 5,
   "successful" : 5,
    "skipped" : 0,
    "failed" : 0
 },
 "hits" : {
    "total" : 1,
      "max_score" : 0.8630463,
        "hits" : [
            {
             "_index" : "so_test7",
             "_type" : "_doc",
             "_id" : "1",
             "_score" : 0.8630463,
             "_source" : {
             "book_author" : "mike jones",
             "book_name" : "I like this"
           }
          }
         ]
        }
       }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...