Fulltekstsøk som Google

stemmer
11

Jeg ønsker å implementere fulltekst-søk i min off-line (android) program for å søke i brukergenerert liste over notater.

Jeg ønsker at det skal oppføre seg akkurat som Google (siden de fleste er allerede brukt til spørring til Google)

Min første kravene er:

  • Rask: som Google eller så fort som mulig, har 100000 dokumenter med 200 hundre ord hver.
  • Søke etter to ord skal bare returnere dokumenter som inneholder begge ordene (ikke bare ett ord) (med mindre OR operatør brukes)
  • Små bokstaver (aka: normalisering): Hvis jeg har ordet 'Hei' og jeg søker etter 'hei' det skal matche.
  • Diakritisk merke ufølsom: Hvis jeg har ordet 'así' et søk etter 'asi' bør matche. På spansk, mange mennesker, feil, enten ikke satt diakritiske tegn eller mislykkes i riktig å sette dem.
  • Stopp ord eliminasjon: å ikke ha en stor indeksmeningsløse ord som 'og', 'det' eller 'for' bør ikke bli indeksert i det hele tatt.
  • Dictionary substitusjon (aka: stem ord): Lignende ord skal indekseres som en. For eksempel tilfeller av 'begjærlig' og 'sulten' bør erstattes med 'sult'.
  • Søk etter uttrykk: 'Hei verden' Hvis jeg har teksten et søk på ' 'world hallo'' bør ikke samsvarer med det, men et søk på ' 'hello world'' bør matche.
  • Søk alle felt (i Multi dokumenter) hvis ingen feltet spesifisert (ikke bare en standard felt)
  • Autofullføring i søkeresultatene mens du skriver for å gi populære søkene. (Akkurat som Google Suggest)

Hvordan kan jeg konfigurere en full-tekst-søkemotor for å oppføre seg så mye som mulig som Google?

(Jeg er mest interessert i Open Source, Java og spesielt Lucene)

Publisert på 29/12/2009 klokken 22:35
kilden bruker
På andre språk...                            


5 svar

stemmer
2

Kjøp en Google Search Appliance . Eller som kommentarene si, bruker Lucene som du allerede nevnt.

Svarte 29/12/2009 kl. 22:43
kilden bruker

stemmer
3

Mange av disse atferd er standard for Lucene. Den første (inkludert alle vilkår) er ikke, men du kan tvinge dette problemet ved å sette standard operatør:

MultiFieldQueryParser parser = new MultiFieldQueryParser(fields, new StandardAnalyzer());
parser.setDefaultOperator(QueryParser.AND_OPERATOR);

Jeg vet at elementer 2, 4 og 6 er mulig, og IIRC, de skjer som standard. Jeg er ikke sikker på om elementer 3 og 5, men Lucene tilbyr massevis av tilpasningsmuligheter, så jeg vil foreslå å gjennomføre en proof-of-concept med dine data for å se om det oppfyller disse kravene også.

Svarte 29/12/2009 kl. 22:47
kilden bruker

stemmer
0

Med mindre du kjøper en søkemotor, har du Lucene, Nutch, Apache Solr og noen få andre.

Svarte 29/12/2009 kl. 23:16
kilden bruker

stemmer
0

HyperSQL er en ren-java SQL implementering som kan kjørte ganske lett, som kan SQLite. Du kan bruke sine fulltekst evner og spørring for å gjenskape hjulet, men som andre kommentarer har påpekt en eksisterende implementering er trolig best.

Svarte 30/12/2009 kl. 05:14
kilden bruker

stemmer
14

Jeg tror Lucene kan løse dine behov. Du bør også vurdere å bruke Solr , som har tilsvarende funksjonalitet og er mye enklere å sette opp.

Jeg vil diskutere hvert krav separat, ved hjelp av Lucene. Jeg tror Solr har lignende mekanismer.

  • Rask: som Google eller så fort som mulig, har 100000 dokumenter med 200 hundre ord hver.

Dette er en rimelig indeks størrelse både for Lucene og Solr, muliggjør uthenting av varer i flere titalls millisekunder pr spørring.

  • Søke etter to ord skal bare returnere dokumenter som inneholder begge ordene (ikke bare ett ord) (med mindre OR operatør brukes)

Du kan gjøre det ved hjelp av en BooleanQuery med MUST som standard i Lucene.

De neste fire krav kan håndteres ved å tilpasse en Lucene Analyzer :

  • Små bokstaver (aka: normalisering): Hvis jeg har ordet 'Hei' og jeg søker etter 'hei' det skal matche.

En LowerCaseFilter kan brukes til dette.

  • Diakritisk merke ufølsom: Hvis jeg har ordet 'así' et søk etter 'asi' bør matche. På spansk, mange mennesker, feil, enten ikke satt diakritiske tegn eller mislykkes i riktig å sette dem.

Dette krever Unicode normalisering fulgt av diacritic fjerning. Du kan bygge en tilpasset Analyzer for dette.

  • Stopp ord eliminasjon: å ikke ha en stor indeksmeningsløse ord som 'og', 'det' eller 'for' bør ikke bli indeksert i det hele tatt.

En StopFilter fjerner stoppord i Lucene.

  • Dictionary substitusjon (aka: stem ord): Lignende ord skal indekseres som en. For eksempel tilfeller av 'begjærlig' og 'sulten' bør erstattes med 'sult'.

Lucene har mange snøball Stemmers . En av dem kan være hensiktsmessig.

  • Søk etter uttrykk: 'Hei verden' Hvis jeg har teksten et søk på ' 'world hallo'' bør ikke samsvarer med det, men et søk på ' 'hello world'' bør matche.

Dette er dekket av Lucene PhraseQuery spesialisert spørring.

Som du kan se, dekker Lucene alle de nødvendige funksjonene. For å få et mer generelt bilde, foreslår jeg at boken Lucene in Action , The Apache Lucene Wiki eller The Lucid Imagination nettstedet .

Svarte 03/01/2010 kl. 19:48
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more