2016-03-02 2 views
0

Я использую ElasticSearch в 1 из моих Ruby on Rails проект. Для ElasticSearch, я сильно используя query_stringElasticsearch query_string многозначные поля

Ниже приведены мои настройки проекта:

рубин 2.2.4, Rails-4.2.0, ElasticSearch-Model-0.1.8

I Вы уже проиндексировали данные. Использование Article.import

Теперь в консоли, я выборка для все опубликованного подсчета статьи, я использую:

Article.search(query: { query_string: { query: {"status:1"} } }) 

Это прекрасно работает! Теперь я хотел бы найти статьи user_ids

SQL for above работает как шарм!

SELECT * FROM articles WHERE articles.user_id IN (5, 10) 

Но, когда я пытаюсь использовать ту же концепцию для query_string, он не работает !!

Article.search(query: { query_string: { query: "status:1 AND user_id:[5, 10]" } }) 

Это дает мне результат:

Elasticsearch::Transport::Transport::Errors::BadRequest: [400] {"error":"SearchPhaseExecutionException[Failed to execute phase [query], all shards failed; shardFailures {[mUk_rhx-RP6G5sJRMpfDwg][articles][0]: SearchParseException[[articles][0]: from[-1],size[-1]: Parse Failure [Failed to parse source [{\"query\":{\"query_string\":{\"query\":\"status:1 AND user_id:[5,10]\"}}}]]]; nested: QueryParsingException[[articles] Failed to parse query [status:1 AND user_id:[5,10]]]; nested: ParseException[Cannot parse 'status:1 AND user_id:[5,10]': Encountered \" \"]\" \"] \"\" at line 1, column 98.\nWas expecting one of:\n \"TO\" ...\n <RANGE_QUOTED> ...\n <RANGE_GOOP> ...\n ]; 

Пожалуйста, помогите мне понять, что именно мне нужно сделать, чтобы сделать эту работу! Я гугл много на этом нашло несколько вариантов, как ассортимент, и т.д., но это не один :(

Надежды услышать от вас скоро!

ответ

2

Вы не должны использовать query_string в этом случае. Используйте terms query вместо этого. Чтобы объединить несколько запросов использовать bool

{ 
"query": { 
    "bool": { 
    "must": [ 
     { 
      "term": { 
       "status": 1 
      } 
     }, 
     { 
      "terms": { 
       "user_id": [ 
       5, 
       10 
       ] 
      } 
     } 
     ] 
    } 
    } 
    } 
+0

Спасибо за быстрый ответ @richa я чувствую, есть ограничение в использовании 'терминов query', потому что я готовлю некоторые динамический запрос с использованием' query_string' Так, например:. прямо сейчас, Я строю запрос на основе 'status и user_id', и я ожидаю, что к этому запросу будут добавлены дополнительные атрибуты_ строка, поскольку поиск становится уже. Я новичок в elasticsearch, так что, можно ли использовать как query_string, так и термины в один единственный запрос? –

+0

Обновлен мой ответ. использовали запрос 'term' для статуса вместо' query_string' – Richa

+0

Спасибо @richa, ваш ответ сработал для меня! Только для моей информации я использовал множество сложных запросов, используя 'query_string'. Я использовал почти все, что' query_string' обеспечивает, например. 'LIKE, GTE, LTE', но' [] 'еще не поддерживается' query_string'? –

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