2017-09-12 2 views
2

Ist es möglich, innerhalb der Ergebnisse zu suchen, die ich von elasticsearch bekomme?Suche in den Ergebnissen von elasticsearch

Um das zu erreichen, dass ich derzeit & warten auf zwei Suchen auf Elasticsearch ausgeführt werden müssen: die erste Suche

{ "match": { "title": "foo" } } 

It 5 Sekunden dauert, ist und gibt 500 Dokumente etc .. und dann eine zweite Suche

{ 
    "bool": { 
    "must": [ 
     { "match": { "title": "foo" } }, 
     { "match": { "title": "bar" } } 
    ] 
    } 
} 

Es dauert weitere 5 Sekunden und gibt 200 Dokumente zurück, was im Grunde nichts mit der ersten Suche aus elasticsearchs Perspektive zu tun hat.

Anstatt dies auf diese Weise zu tun, möchte ich meinen Benutzern eine Option "Suche weiter im Ergebnis" anbieten. Hoffentlich können Benutzer mit dieser Option eine Suche mit mehr Schlüsselwort basierend auf dem Ergebnis der ersten Suche durchführen.

Also mein Szenario ist, dass ein Benutzer eine erste Suche mit dem Keyword "foo", und 500 Ergebnisse auf der Webseite und wählt dann "Suche weiter innerhalb des Ergebnisses", um eine zweite Suche innerhalb der 500 Ergebnisse zu machen, und hoffe, dass wir einige raffinierte Ergebnisse wirklich schnell bekommen.

Wie kann ich es erreichen? Vielen Dank!

Antwort

1

Was Sie tun könnten, ist die IDS query verwenden. Sammeln Sie alle Dokument-IDs aus der ersten Anforderung, und buchen Sie sie anschließend mit einer neuen Bool-Abfrage, die eine IDS-Abfrage in einer must-Klausel neben der ursprünglichen query enthält. Sie können die IDs in der ersten Anfrage mithilfe der Scroll-API effizient erfassen. Da Sie das zweite Ergebnis trotzdem sortiert zurückgeben, ist es nicht sinnvoll, bei der ersten Anfrage eine Sortierung vorzunehmen, um die erste Anfrage zu beschleunigen.

Siehe:

+0

Das ist ein schöner Weg. Vielen Dank! –

+0

Gern geschehen. Dies funktioniert sehr gut in Bezug auf die Geschwindigkeit. Könnten Sie vielleicht meine Antwort akzeptieren? – drjz

+0

Ich akzeptiere es einfach. Vielen Dank! –

0

post filter ist eine Möglichkeit, in einer anderen Suche zu suchen.

In Ihrem Fall:

GET _search 
{ 
    "query": { 
    "match": { 
     "title": "foo" 
    } 
    }, 
    "post_filter": { 
    "match": { 
     "title": "bar" 
    } 
    } 
} 

post_filter wird auf das Abfrageergebnis ausgeführt werden.

+0

Ich glaube nicht, dass mein Szenario passt. Mein Szenario ist, dass ein Benutzer eine erste Suche mit dem Schlüsselwort "foo" durchführt, 500 Ergebnisse auf der Webseite erhält und dann "weiter im Ergebnis suchen" auswählt, um eine zweite Suche innerhalb der 500 Ergebnisse durchzuführen, und hofft, einige zu erhalten verfeinerte Ergebnisse wirklich schnell. –