Qual è la differenza tra un indice invertito e un semplice vecchio indice?


99

Nell'ingegneria del software creiamo indici tutto il tempo (ad esempio, nei database) ma sento anche molte persone parlare di indici invertiti. C'è qualcosa di fondamentalmente diverso tra i due? Sembrano la stessa cosa.



Per chiarire, ti stai chiedendo: cosa c'è di diverso in un normale indice ( en.wikipedia.org/wiki/Index_%28database%29 ) che scompone una tabella in base ai dati che già esistono in quella tabella? È corretto?
jwheron

3
@guidoism Ciò che tutti non hanno menzionato (sebbene la normalità la descriva parzialmente con esempi e lovesh sia praticamente sul pulsante) è che gli indici invertiti "invertono" i dati di base per essere più efficienti (ad esempio, scambia chiavi / dati per cercare da una prospettiva diversa o ordinamento alfabetico / numerico per consentire algoritmi di ricerca rapida), mentre un indice standard memorizza i dati così come li trova. I riferimenti "indietro / avanti" e il significato letterale della parola "invertito" non si applicano qui, invece si riferisce all'inversione dei dati per produrre un formato efficiente specifico per l'attività in corso.
TheManWithNoName

Risposte:


216

Un uso comune è "... per consentire una rapida ricerca full-text".

I due tipi denotano direzionalità . Uno ti porta avanti attraverso l'indice e l'altro ti porta indietro (l'inverso) attraverso l'indice. Questo è tutto. Non c'è mistero da scoprire qui. In caso contrario, i due tipi sono identici, è solo una questione di quali informazioni hai , e di conseguenza le informazioni che si sta cercando di trovare.

Per rispondere alla tua domanda, non credo che ci sia effettivamente un modo per sapere perché l'uso è quello che è oggi. L'unico motivo per cui è importante definire quale è forwarde quale è invertedè in modo che tutti possiamo avere una conversazione su di loro e tutti sanno di quale direzione stiamo parlando. Pensa ai termini "sinistra" e "destra": sono relativi. Il che non ha importanza, tranne per il fatto che tutti devono essere d'accordo su quale sia "sinistra" e quale "destra" affinché le parole abbiano un significato. Se, come cultura, decidessimo di girare a sinistra ea destra, allora avresti lo stesso problema a capire cosa sia una "svolta a destra" rispetto a una "svolta a sinistra" poiché il significato concordato è cambiato. Tuttavia, la denominazione è arbitraria, sul significato.

Nel tuo commento in cui chiedi "per favore, non limitarti a definire i termini", ti manca il punto e penso che ti stia solo bloccando sulla formulazione quando non c'è assolutamente alcuna differenza tra loro.


A beneficio dei futuri lettori, fornirò ora diversi esempi di indici "diretti" e "invertiti":

Esempio 1: ricerca sul Web

Se stai pensando che l'inverso di un indice è qualcosa come l' inverso di una funzione in matematica , dove l'inverso è una cosa speciale che ha una forma diversa, allora ti sbagli: non è così qui.

In un motore di ricerca hai un elenco di documenti (pagine su siti web), dove inserisci alcune parole chiave e ottieni risultati.

Un indice in avanti (o solo un indice) è l' elenco dei documenti e le parole che compaiono in essi. Nell'esempio di ricerca sul Web, Google esegue la scansione del Web, creando l'elenco di documenti e individuando quali parole compaiono in ciascuna pagina.

L' indice invertito è l' elenco delle parole e dei documenti in cui compaiono. Nell'esempio di ricerca sul Web, fornisci l'elenco di parole (la tua query di ricerca) e Google produce i documenti (link dei risultati di ricerca).

Sono entrambi indici: è solo questione di quale direzione stai andando. Avanti è da documenti-> a-> parole, invertito è da parole-> a-> documenti.

Esempio 2: DNS

Un altro esempio è una ricerca DNS (che prende un nome host e restituisce un indirizzo IP) e una ricerca inversa (che prende un indirizzo IP e ti dà il nome host).

Esempio 3: un libro

L'indice sul retro di un libro è in realtà un indice invertito , come definito dagli esempi sopra: un elenco di parole e dove trovarle nel libro. In un libro, il sommario è come un indice diretto : è un elenco di documenti (capitoli) che il libro contiene, tranne che invece di elencare le parole in quelle sezioni, il sommario fornisce solo un nome / descrizione generale di ciò che contenuti in quei documenti (capitoli).

Esempio 4: il tuo cellulare

L' indice di inoltro nel telefono cellulare è l'elenco dei contatti e i numeri di telefono (cellulare, casa, lavoro) sono associati a tali contatti. L' indice invertito è ciò che ti consente di inserire manualmente un numero di telefono, e quando premi "componi" vedi il nome della persona, piuttosto che il numero, perché il tuo telefono ha preso il numero di telefono e ha trovato il contatto associato ad esso.


11
Grazie per il tuo tempo. ma la tua risposta è ancora poco informativa. Come ho accennato nella mia richiesta di ricompensa, capisco cosa significano i termini coinvolti e perché si presentano. La mia domanda era: "perché le persone che hanno chiamato gli indici invertiti li hanno chiamati invertiti quando abbiamo una lunga tradizione che li chiama semplicemente indici semplici? Ad esempio, gli indici alla fine dei libri, come fai notare, sono in realtà invertiti. dal punto di vista storico, gli indici alla fine dei libri venivano prima degli indici web. Allora perché invertire la tradizione? ". La mia ipotesi è che sia stata solo una di quelle cose che sono appena successe ...
Manav

1
"Non credo che sia possibile sapere perché, senza procedere ad un esame storico di l'uso dei termini" - mi piacerebbe avere qualcuno sperava sarebbe condurre un esame del genere storico e dare una risposta. :-) Perché questo essere opposto al significato del linguaggio comune di "indice" è sorprendente. (Una possibile risposta è che quando si pensava per la prima volta alla frase "indice invertito", la frase "indice" era già per qualche "indice" invertito rispetto a "indice invertito", cioè invertito rispetto al significato reale di "indice ". In tal caso, sarebbe utile sapere perché il forward" index "ha preso il nome strano.)
ShreevatsaR

2
@jefflunt chiedendosi solo perché dovrebbe essere utilizzata l'indicizzazione in avanti. Sto parlando in particolare dell'esempio di ricerca sul web qui. Quindi se Google, come parte dell'indicizzazione in avanti, fa l' elenco dei documenti <-> parole in essi e alla fine usa l' elenco di parole <-> elenco di documenti nella loro ricerca, perché l' elenco dei documenti <-> parole in loro ? In altre parole, la mia domanda è: non si può chiedere a Google quali parole ci sono in una determinata pagina (documento) o principalmente si chiederà dove si trovano le parole chiave che sta cercando nelle pagine. Allora perché l'indicizzazione in avanti?
quickbrownfox

1
Quindi nel contesto del database relazionale non esiste un indice invertito? o quegli indici sono in realtà "indice invertito". I problemi con termini "gradevoli" in letteratura sono ignoranza / errore / deliberazione da parte di pochi pionieri o corpi che iniziano accordi diversi e parte della comunità segue quella nomenclatura. Tutti si confondono dopo qualche tempo. Sono sicuro che ci sono molti termini nel software che originariamente dovevano essere diciamo A, ma una comunità diversa lo prende deliberatamente o erroneamente come A 'o B, sintatticamente fuori rotta. Confonde ancora a morte il nuovo studente.
nir

1
@ Roylee - Non ho letto quel white paper. Penso che quello che stai chiedendo sia: "Aggiornate l'indice invertito quando aggiorni l'indice forward?" Se questa è la tua domanda, la risposta è sì.
Jefflunt

26

L'hanno chiamato invertito solo perché esiste già un indice forward. Prendiamo l'esempio del motore di ricerca, composto da due parti: la prima parte è "web crawler e parser" che costruisce un indice da documento a parola, la seconda parte è database di ricerca che costruisce un indice da parola a documento. Poiché esiste il primo indice, chiamiamo naturalmente il secondo indice come indice invertito.

Se assegni l'indice al TOC (Table of Content) di un libro, devi chiamare l'indice alla fine del libro come "indice invertito". Oppure, dall'altra parte, puoi chiamare il TOC come indice invertito.


6
Questa dovrebbe essere la risposta accettata in quanto risponde alla domanda perché chiamiamo un indice "invertito" anche se è proprio quello che tutti pensano di un "indice normale". Un indice b-tree SQL memorizza per ogni parola un puntatore a tutte le righe ("documenti") che la contengono. Là lo chiamiamo "indice". Ma nei motori di ricerca chiamiamo improvvisamente questa stessa identica procedura "indice invertito". Non perché sia ​​fondamentalmente diverso, ma perché prima abbiamo creato un "indice diretto" (testo diviso) e poi "invertito". Quindi, tutto sommato, il nome "inverso" deriva dal processo di creazione, non dalla struttura finale dell'indice.
Foo Bar

@xeranic grazie per gli approfondimenti. Domanda rapida: è pratico rimuovere le voci dal file dell'indice in avanti dopo aver creato l'indice invertito?
Roy Lee

3
Sono d'accordo con @FooBar. Questa risposta dovrebbe essere scelta come la risposta giusta. Ha risposto perché inventiamo un nuovo termine inverted index anche se tutti gli indici normali nella nostra vita sono già usati come inverted.
Ryan Lyu

7

tipicamente quando si parla di indice, si intendono alcuni calcoli aggiunti o risultati memorizzati di procedure che sono state fatte per velocizzare l'applicazione (es. MySQL o altro RDBMS Consultare MySQL nella documentazione ). L'indicizzazione può anche essere correlata alla memorizzazione nella cache, ecc.

L'indice invertito crea file con una struttura destinata principalmente alla ricerca (full-text).

L'indice invertito è costituito da due file principali:

  • Vocabolario
  • Occorrenze

Nel vocabolario sono parole comuni estratte dal testo (ovviamente dopo aver filtrato le parole della lista nera come i pronomi). Il file delle occorrenze contiene la connessione tra parole e documenti (word1 appare in doc1 e doc2, non in doc3). È rappresentato in una forma di matrice.

Processo di indicizzazione - indice invertito

Nell'immagine sopra è mostrato il processo di creazione dei due file citati.

Se sei ulteriormente interessato a questa problematica posso consigliarti un ottimo libro scritto da Ricardo Yated - Modern Information Retrieval ( Vedi su Amazon ) - a pagina 200 credo.

Spero che sia d'aiuto :-)


Questa è un'ottima risposta in quanto spiega cos'è veramente un indice invertito. Supera l'idea dell'indicizzazione diretta e inversa che è diversa dall'algoritmo utilizzato per una capacità di ricerca abilitata dalla creazione e dall'indice invertito.
AN6U5

6

la normalità ha già differenziato meravigliosamente tra un indice forward e un indice invertito, ma per la domanda sul perché uno sia chiamato indice forward e l'altro indice invertito, forse è per questo che sono chiamati in questo modo ---

Prendendo ad esempio la scansione e l'indicizzazione dei motori di ricerca (o la creazione di un indice per un libro), è possibile creare un indice in avanti contemporaneamente mentre si esegue la scansione delle pagine Web (o si legge il libro) o si procede . Quindi, se hai 10 pagine web da scansionare (o 10 capitoli in un libro) puoi scansionare la prima pagina web (leggi il primo capitolo) e poi fare un elenco di parole che appaiono nella pagina web (parole che appaiono nel capitolo) e continuare questo processo per altre pagine web (altri capitoli) così quando hai scansionato tutte le 10 pagine web (leggi tutti i 10 capitoli) il tuo indice di andata è completo con ogni pagina web (capitolo) che punta a un elenco di parole che contiene .

Ma per creare un indice invertito devi eseguire la scansione di tutte le 10 pagine web (leggi i 10 capitoli) e quindi prendere ogni parola da ogni elenco di documenti e capire quali documenti contengono quella parola. Quindi è come tornare indietro dopo aver scansionato le pagine web (leggere i capitoli del libro) . Quindi è chiamato indice invertito.

Questa è solo una mia speculazione.


5

Esistono molti tipi di indice. Ad esempio, B-tree, R-tree, hash ... Per scopi diversi, dobbiamo scegliere l'indice corretto.

L'indice invertito è speciale. Indice invertito solitamente utilizzato nel motore di ricerca full text. Usa l'indice invertito per trovare la posizione di una parola in un documento (o in un insieme di documenti) il più velocemente possibile. Pensa al limite di memoria e CPU, altri indici non possono finire questo lavoro.

Puoi leggere il documento Lucene per maggiori dettagli. È un motore di ricerca open source. http://lucene.apache.org/java/docs/index.html


3

Il termine "Indice di parole invertite" si riferisce al cambiamento nella relazione di un singolo documento contenente molte parole, a ciascuna parola univoca contenente (o che identifica) un elenco di molti documenti. Questo significa effettivamente prendere una relazione uno-a-molti (Docs to Words) e invertirla (o invertirla) in modo tale che ora esista una nuova relazione uno-a-molti "invertita", che è ciascuna parola unica relativa a molti- Documenti (cioè, tutto ciò che contiene quella parola). La sua origine è davvero così semplice, e il termine "indice invertito" era usato per descrivere indici manuali dello stesso tipo molto prima che esistessero i computer e l'indicizzazione elettronica ad alta velocità (sì, è vero, sono un vecchio programmatore bislacco, quasi abbastanza grande da aver considerato Grace Hopper una "dolce signorina" età appropriata per corteggiare quando COBOL era un nuovo linguaggio brillante). Per favore, non scartare ancora noi geezers, poiché occasionalmente possiamo fornire uno o due bit storici utili, e forse anche preziosi, quando la nostra RAM personale è ancora funzionante, cioè. [sorriso]


2

negli indici invertiti, abbiamo la seguente forma:

word1-> elenco di documenti in cui si trova (ordine ordinato)

word2-> elenco di documenti in cui si trova (ordine ordinato)

È molto utile per l'elaborazione delle query dei motori di ricerca in quanto ci consente di trovare documenti in cui si trova la parola.

È possibile utilizzare l'apprendimento della macchina supervisionato per costruire questo indice invertito.


6
Mi suona come un indice, cosa c'è al contrario?
guidoismo

2
@guidoism Un indice invertito è l'inversione di un indice forward. un indice diretto memorizza un elenco di parole per ogni documento. Ad esempio Doc-> w1, w2
Programmatore

Non trovo ancora alcuna differenza tra l'indice Forward e Inverted (in termini di come funziona, lascia il bit di denominazione). Entrambi per me, sembra un indice che mappa un campo a un gruppo di ID documento. È così che ho capito come l'oracle btree (altrimenti denominato forward index) organizza i dati. Non vedo alcuna differenza nei principi dell'indice invertito. Mappare un documento -> w1, w2, w3 mi sembra una proposta inefficiente in termini di ricerca. Mi chiedo perché è questo in primo luogo? Questo mi riporta al punto di partenza. :-).
user1189332

@Programmer Domanda rapida: è pratico rimuovere le voci dal file dell'indice in avanti dopo aver creato l'indice invertito?
Roy Lee

0

Un'altra differenza:

La gestione degli aggiornamenti con l'indice invertito è costosa rispetto all'indice forward.

L'indice diretto gestisce facilmente gli aggiornamenti riflettendo le modifiche solo nell'indice del documento corrispondente, mentre nell'indice invertito la stessa modifica deve riflettersi in più posizioni sull'indice invertito.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.