2013-07-12 20 views
5

Il mio problema è che ho n campi (dire circa 10) in Solr che sono ricercabili, sono tutti indicizzati e memorizzati. Vorrei prima eseguire un'interrogazione sull'intero indice di 5000 documenti che raggiungerà una media di 500 documenti. Successivamente vorrei interrogare utilizzando un diverso insieme di parole chiave su questi 500 documenti e NON sull'intero indice.Richieste multiple in Solr

Così la prima volta che invierò una query verrà generato un punteggio, la seconda volta che eseguo una query il nuovo punteggio generato dovrebbe essere basato sui 500 documenti della query precedente, o in altre parole Solr dovrebbe considerare solo questi 500 documenti come l'intero indice.

Per riassumere questo, Index of 5000 sarà filtrato a 500 e poi 50 (5000> 500> 50). È fondamentalmente filtrante, ma mi piacerebbe farlo in Solr.

Ho una conoscenza di base ragionevole e sto ancora imparando.

Aggiornamento: Se rappresentate matematicamente sarebbe simile a questa:

results1=f(query1) 
results2=f(query2, results1) 
final_results=f(query3, results2) 

Vorrei che questo fosse realizzare utilizzando un programma e l'utente finale vedrà solo 50 risultati. Quindi la sfaccettatura non è un'opzione.

risposta

3

Filter queries (fq) sono specificamente progettati per fare una restrizione rapida del risultato impostato non calcolando il punteggio.

Quindi, se si mette la prima query nel parametro FQ e la vostra seconda query punteggio di generazione nel parametro normale 'q', che dovrebbe fare quello che chiedi.

Vedere anche a question discussing this issue from the opposite direction.

+0

Grazie a Alexandre, sulla base del mio test iniziale posso dire che risolve il mio problema. Inoltre, vedo che il tempo impiegato è molto inferiore rispetto alla soluzione di Gus. Una combinazione tra la tua soluzione e quella di Gus dovrebbe risolvere il mio problema in modo completo. – user2575429

0

Dovresti dare un'occhiata a "ricerca sfaccettata" da Solr: http://wiki.apache.org/solr/SolrFacetingOverview Questo ti aiuterà in questo tipo di ricerca "iterativa".

+0

Hey Grazie, so di sfaccettature, ma non voglio usarlo. La parte di drill down, mi piacerebbe farlo in un programma. L'utente finale vedrà solo il set finale di 50 risultati e nient'altro. Dopo la prima query vorrei eseguire una seconda query sui risultati ottenuti con parametri completamente diversi. – user2575429

2

credo che si desidera utilizzare una query nidificate come questo:

text:"roses are red" AND _query_:"type:poems" 

Si può leggere di più su query nidificate qui:

http://searchhub.org/2009/03/31/nested-queries-in-solr/

+0

Grazie a Thanx Gus, penso che questo sia un buon approccio per le mie esigenze e ne sto approfondendo l'analisi, effettuerò dei test e vedremo come funziona. Apprezzo il vostro aiuto. – user2575429

5

Due probabili implementazioni mi vengono in mente. L'approccio più semplice sarebbe quella di aggiungere solo la prima query per la seconda query;

+(first query) +(new query) 

Questo è un buon approccio se la prima query, che si desidera filtrare, cambia spesso. Se la prima query è qualcosa di simile a una categoria di documenti, o qualcosa di simile, dove si può beneficiare di riutilizzo del filtro stesso, quindi una query di filtro è l'approccio migliore, utilizzando la fq parameter, qualcosa come:

q=field:query2&fq=categoryField:query1 

filtro query nella cache una serie di iD dei documenti per filtrare contro, quindi per le ricerche di uso comune, come le categorie, intervalli di date comuni, ecc, un vantaggio significativo delle prestazioni possono essere acquisite da esso (per le ricerche non comuni, o stringhe di ricerca immesse dall'utente, può basta incorrere in inutili sovraccarichi per memorizzare nella cache i risultati e inquinare la cache con un set di risultati inutili)