2013-03-20 12 views
11

Mam dobre wyniki uzyskiwania wyników wyszukiwania przy użyciu poniższej składni, ale mam problem z dodaniem warunku boolowskiego.Jak wyszukać termin i dopasować warunek boolowski?

http://localhost:9200/index_name/type_name/_search?q=test 

Moje dokumenty wyglądać następująco:

{ 
    "isbn":"9780307414922", 
    "name":"Dark of the Night", 
    "adult":false 
} 

Oto mój najlepszy przypuszczenie, jak osiągnąć to, co usiłuję zrobić.

{ 
    "query_string": { 
     "default_field": "_all", 
     "query": "test" 
    }, 
    "from": 0, 
    "size": 20, 
    "terms": { 
     "adult": true 
    } 
} 

jednak skutkuje to "Analizować Wada [No parser dla elementu [query_string]]];}]"

Używam elastyczną przeszukiwanie 0.20.5.

W jaki sposób mogę dopasować dokumenty zawierające wyszukiwane hasło tak, jak "?

Z góry dziękuję.

Odpowiedz

11

Twój adult == true klauzula musi być częścią query - nie można przejść w term klauzuli jako parametr poziomu górnego do search.

więc można go dodać do zapytania w formie klauzuli zapytań, w takim przypadku trzeba dołączyć obie klauzule kwerendy przy użyciu bool zapytanie, co następuje:

curl -XGET 'http://127.0.0.1:9200/_all/_search?pretty=1' -d ' 
{ 
    "query" : { 
     "bool" : { 
     "must" : [ 
      { 
       "query_string" : { 
        "query" : "test" 
       } 
      }, 
      { 
       "term" : { 
        "adult" : true 
       } 
      } 
     ] 
     } 
    }, 
    "from" : 0, 
    "size" : 20 
} 
' 

naprawdę jednak klauzule zapytania powinny być wykorzystywane do:

  • full text search
  • klauzul, które mają wpływ na trafność zdobyć

Jednak twoja klauzula adult == true nie jest używana do zmiany trafności i nie obejmuje wyszukiwania pełnotekstowego. Jest to raczej odpowiedź typu "tak/nie", innymi słowy jest lepiej stosowana jako klauzula filtru.

To oznacza, że ​​trzeba owinąć pełnej kwerendy tekstowej (_all zawiera test) w klauzuli zapytań który akceptuje zarówno kwerendy i filtr: the filtered zapytanie:

curl -XGET 'http://127.0.0.1:9200/_all/_search?pretty=1' -d ' 
{ 
    "query" : { 
     "filtered" : { 
     "filter" : { 
      "term" : { 
       "adult" : true 
      } 
     }, 
     "query" : { 
      "query_string" : { 
       "query" : "test" 
      } 
     } 
     } 
    }, 
    "from" : 0, 
    "size" : 20 
} 
' 

Filtry są zwykle szybsze, ponieważ:

  • nie mają zdobyć dokumenty, wystarczy włączyć lub wyłączyć je
  • mogą być buforowane i ponownie
+0

Ponieważ wydaje się, że jest to najlepszy wynik wyszukiwania google, po prostu zaktualizuję, że wydaje się, że właściwym sposobem na to teraz jest zapytanie 'bool'. Następnie użyj "musi" dla kwerendy i "filtru" dla filtra. – BLam85

Powiązane problemy