2014-11-15 4 views
0

У меня есть индекс базы данных человека с приведенным ниже отображением.elasticsearch фильтр поиска равен

{ 
    "person" : { 
       "sex"  : { "type" : "string" }, 
       "dob"  : { "type" : "string" },   
       "fname"  : { "type" : "string" }, 
       "lname"  : { "type" : "string" }, 
       "phone"  : { "type" : "string" } 
     } 
} 

Мне нужно найти все соответствующие записи с несколькими условными предложениями.

Добролюбов + телефон + секс (OR) Fname + LNAME + д.р.

Как создать запрос или фильтр (используя логическое значение) для приведенного выше условия. Также мне нужно запросить или фильтровать регистр без учета регистра.

Любые идеи?

Благодаря

ответ

1

Верстка два набора сусло запросы внутри должны запрос будет удовлетворять ваши требования, см. bool для получения дополнительной информации:

curl -XGET 'http://localhost:9200/people/person/_search?pretty' -d '{ 
    "query": { 
     "bool": { 
     "should": [ 
      {"bool": { 
       "must": [ 
        {"match": { "sex" : "male" }}, 
        {"match": { "dob" : "2000-11-14" }}, 
        {"match": { "phone" : "1234 67889" }} 
       ] 
       } 
      }, 
      {"bool": { 
       "must": [ 
        {"match": { "fname" : "bob" }}, 
        {"match": { "dob" : "2000-11-14" }}, 
        {"match": { "lname" : "smith" }} 
       ] 
       } 
      } 
      ] 
     } 
    } 
}' 

Также мне нужно запросить или фильтра нечувствительны к регистру.

стандартный анализатор проиндексирует данные в нижнем регистре - запрос match применит тот же анализатор к вашему поисковому запросу.

Также - было бы неплохо хранить ВАС как дату.

+0

Спасибо @olly. Я читаю фильтры быстрее, чем совпадение. Есть ли способ использовать фильтры? – user3658423

+0

Вы можете заменить «запрос» на «фильтр». Затем вам нужно будет заменить «match» на «term». Затем вам также потребуется создать пользовательский анализатор нижних регистров, который не будет маркировать данные и гарантировать, что значения, переданные вашему фильтру, всегда строчные. Функционально то, что вы делаете, это запрос - вам лучше с гибкостью, которую он предлагает. TL; DR: Придерживайтесь использования «запроса», вы, вероятно, не заметите разницу в производительности. –

0

Вы должны изменить свое отображение в вложенный объект, чем вы можете использовать вложенный фильтр или запрос. Поскольку вы хотите сделать это без учета регистра, вам понадобится запрос соответствия во вложенном запросе.

Более подробная информация о отображении: http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/mapping-nested-type.html#mapping-nested-type

{ 
    "type1" : { 
     "properties" : { 
      "person" : { 
       "type" : "nested", 
       "properties": { 
        "sex" : {"type": "string" }, 
        "dob" : {"type": "string" } 
       } 
      } 
     } 
    } 
} 

Затем создать вложенный запрос: http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/query-dsl-nested-query.html#query-dsl-nested-query

{ 
    "nested" : { 
     "path" : "person", 
     "query" : { 
      "bool" : { 
       "must" : [ 
        { 
         "match" : {"person.dob" : "xx"} 
        }, 
        { 
         "range" : {"person.sex" : "male"} 
        } 
       ] 
      } 
     } 
    } 
} 
Смежные вопросы