2016-04-13 4 views
0

Ich benutze Elasticsearch zum ersten Mal und habe die Indexierung und grundlegende Suche nach unten, aber ich suche eine komplexe Suche.Wie funktioniert das Feldboosing im Elasticsearch PHP-Client?

Mit dem PHP-Client wie machen Sie Teilsuchen und Feldverstärkung/Relevanz? Letztendlich möchte ich mehrere Felder nach partiellen Übereinstimmungen, genauen Übereinstimmungen durchsuchen und einige Felder auffrischen.

Hier ist was ich bisher habe, aber ich kann es nicht funktionieren. Die Elasticsearch-Dokumentation ist nicht gut.

$show_params = [ 
    'index' => env('ES_INDEX'), 
    'type' => 'show', 
    'size' => 6, 
    'body' => [ 
     'query' => [ 
      'bool' => [ 
       'should' => [ 
        [ 
         'match' => [ 
          'title' => [ 
           'query' => '*' . $q . '*', 
           'boost' => 2 
          ] 
         ] 
        ], 
        [ 
         'match' => [ 
          'synopsis' => '*' . $q . '*' 
         ] 
        ] 
       ] 
      ] 
     ] 
    ] 
]; 

$client = \Elasticsearch\ClientBuilder::create()->build(); 

$show_raw_results = $client->search($show_params); 

Antwort

0

Der Grund match Abfrage unterstützen Platzhalter nicht, weshalb Ihre Anfragen nicht arbeiten (die Steigerung der Syntax ist jedoch korrekt).

Sie versuchen, die wildcard query verwenden können, aber es hat einige Einschränkungen (insbesondere, es ist eine not_analyzed Abfrage ist, die Ihr Eingabetext bedeutet, muss „voranalysierte“ sein):

$show_params = [ 
    'index' => env('ES_INDEX'), 
    'type' => 'show', 
    'size' => 6, 
    'body' => [ 
     'query' => [ 
      'bool' => [ 
       'should' => [ 
        [ 
         'wildcard' => [ 
          'title' => [ 
           'value' => '*' . $q . '*', 
           'boost' => 2 
          ] 
         ] 
        ], 
        [ 
         'wildcard' => [ 
          'synopsis' => '*' . $q . '*' 
         ] 
        ] 
       ] 
      ] 
     ] 
    ] 
]; 

$client = \Elasticsearch\ClientBuilder::create()->build(); 

$show_raw_results = $client->search($show_params); 

jedoch Dies ist nicht unbedingt der beste Ansatz. Wildcards sind langsamer und ziehen viele Dokumente zurück, die Ihre Benutzer frustrieren könnten (da es viele Treffer mit geringer Punktzahl und weniger Relevanz gibt).

Und am wichtigsten sind Platzhalter not_analyzed Abfragen, was bedeutet, dass der Abfragetext keine Analyse durchlaufen wird. Wenn Sie nach "quick brown fox" suchen, durchsucht die obige Abfrage Ihren Index nach "*quick brown fox*" genau so, als wäre es ein einzelnes Token, anstatt es in mehrere Tokens zu zerlegen (["quick","brown","fox"]) und mit diesen zu suchen.

Ich würde sehr empfehlen, lesen Sie den Abschnitt in der endgültigen Guide on Partial Matching, oder einfach am Anfang des Fulltext Search Kapitel beginnen und arbeiten Sie sich durch. Sie benötigen ein gutes Verständnis von Analyse und Tokenisierung, um mit partiellem/unscharfem Abgleich gute Ergebnisse zu erzielen.

Verwandte Themen