2013-03-18 15 views
10

Próbuję wykonać proste zapytanie dla dwóch określonych pól, a instrukcja i Google okazują się mało przydatne. Poniższy przykład powinien jasno określić, co chcę zrobić.Proste zapytanie z Elasticsearch

{ 
    "query": { 
     "and": { 
     "term": { 
      "name.family_name": "daniel", 
      "name.given_name": "tyrone" 
     } 
     } 
    } 
} 

jako pytanie bonusowej, dlaczego go znaleźć „Daniel Tyrone” z „Daniel”, ale jeśli nie mogę szukać „Daniel”. Zachowuje się jak prawdziwa dziwna wyszukiwarka uwzględniająca wielkość liter.

Odpowiedz

9

Edytuj: Zaktualizowano, przepraszam. Potrzebny jest oddzielny Term obiektu dla każdego pola, wewnątrz zapytania Bool: Zapytania

{ 
    "query": { 
    "bool": { 
     "must" : [ 
      { 
      "term": { 
      "name.family_name": "daniel" 
      } 
     }, 
     { 
      "term": { 
      "name.given_name": "tyrone" 
      } 
     } 
     ] 
    } 
    } 
} 

termin nie są analizowane przez ElasticSearch, co czyni je wielkość liter. Zapytanie terminowe mówi do ES "szukaj tego dokładnego tokena wewnątrz indeksu, w tym przypadku i interpunkcji".

Jeśli chcesz, aby wielkość liter była niewystarczająca, możesz dodać do analizatora słowo kluczowe i małe litery. Możesz również użyć zapytania analizującego tekst w czasie zapytania (np. Zapytanie Match)

Edycja2: Można również użyć filtrów AND lub Bool.

+0

Ty niezrozumiany moją wrażliwą case pytanie, mówię, że zachowuje się jak wrażliwej sprawy INVERSE wyszukiwania, to nie znajdzie " Daniel "kiedy szukam z" Daniel " –

+0

Podany przykład zapytania daje mi błąd> http://pastium.org/view/c0efa58b6b7689bfff5a9f480c01ed01 –

+0

Gah, przepraszam za to. Nigdy nie powinienem odpowiadać na pytania dotyczące SO przed kawą. Myślałem o filtrze I, gdy w rzeczywistości ES ma tylko zapytanie Bool. Możesz również użyć filtru Bool lub I w zależności od przypadku użycia. – Zach

2

znalazłem rozwiązanie przynajmniej wielokrotnych porównań tekstowych na tym samym polu:

{ 
    "query": { 
    "match": { 
     "name.given_name": { 
     "query": "daniel tyrone", 
     "operator": "and" 
     } 
    } 
    } 

I znalazłem to dla wielu dziedzinach, jest to właściwy sposób?

{ 
    "query": { 
    "bool": { 
     "must": [   
     { 
      "match": { 
      "name.formatted": { 
       "query": "daniel tyrone", 
       "operator": "and" 
      } 
      } 
     }, 
     { 
      "match": { 
      "display_name": "tyrone" 
      } 
     } 
     ] 
    } 
    } 
} 
+1

Tak, twoje drugie zapytanie zadziała (zakładając, że chcesz, aby "daniel tyrone" był analizowany przez analizatory ustawione w polu dokumentu). – Zach

+0

Jeśli nie masz pewności co do odpowiedzi, nie powinieneś publikować jej jako odpowiedzi, zawsze możesz dodać ją jako komentarz do początkowego pytania. – tugcem

+0

Wreszcie znalazłem to!Co robi operator w pierwszym zapytaniu? Czy mam rację, że spróbuje znaleźć kombinację słów dla given_name? Innymi słowy given_name powinno wyglądać jak "daniel tyrone" nie tylko daniel czy tyrone? –

0

Jeśli komponujesz json z PHP, te 2 przykłady zadziałały dla mnie.

$ activeFilters jest tylko oddzielone przecinkami ciąg jak: „atrakcje, Limpopo”

$articles = Article::searchByQuery(array(
     'match' => array(
      'cf_categories' => array(
       'query' => $activeFilters, 
       'operator' =>'and' 
      ) 
     ) 
    )); 

    // The below code is also working 100% 
    // Using Query String https://www.elastic.co/guide/en/elasticsearch/reference/1.4/query-dsl-query-filter.html 
    // https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-query-string-query.html 
    /* $articles = Article::searchByQuery(array(
     'query_string' => array(
      'query' => 'cf_categories:attractions AND cf_categories:limpopo' 
     ) 
    )); */ 
Powiązane problemy