API geospaziale
Distributed Lucene supporta l'indicizzazione dei documenti con le coordinate geospaziali e successivamente l'interrogazione di questi documenti indicizzati per la ricerca basata sulla posizione. A questo scopo la Distributed Lucene utilizza il file Spatial4n
biblioteca.
Prerequisiti
- Per conoscere i prerequisiti standard richiesti per lavorare con all NCache Per le funzionalità lato client fare riferimento alla pagina specificata Prerequisiti dell'API lato client.
- Assicurati di aver creato e avviato una cache Lucene tramite il file NCache Centro di gestione or Interfaccia della riga di comando.
- Assicurati che la tua applicazione non stia utilizzando alcuna DLL/Riferimento Lucene nativa.
- Per i dettagli dell'API fare riferimento a: Documento spaziale, Strategia spaziale, GeohashPrefixTree, RicorsivoPrefissoTreeStrategy, NCacheelenco, IndexWriterConfig, Versione Lucene, Analizzatore standard, Indice scrittore, Contesto spaziale, ReadShapeFromWkt, Cercatore di indici, Lettore di indici, Lettore di directory, Classe SortField, SortFieldType, SpatialArgs, Operazione spaziale, DistanceUtils, Fai cerchio, Dist2Gradi, CreaFiltro, TopDoc, CorrispondenzaTutteDocsQuery, lineamenti.
Documento spaziale
I documenti spaziali vengono creati utilizzando il file SpatialDocument
classe. Questi documenti vengono successivamente utilizzati per scopi di indicizzazione. Questa classe è specifica della Lucene distribuita.
I SpatialDocument
è costituito dalle forme del IShape
classe insieme ad a Document
. Queste forme si trasformeranno quindi nei campi indicizzabili sul lato server tramite a Strategy
. I campi indicizzabili verranno aggiunti al file Document
via IndexWriter
.
Nell'esempio seguente, viene creato un metodo per un documento spaziale con il tipo restituito di SpatialDocument
class, questo metodo viene quindi utilizzato nell'esempio successivo.
public static SpatialDocument CreateSpatialDocument(int id, SpatialStrategy strategy, params IShape[] shapes)
{
Document doc = new Document();
doc.Add(new Int32Field("id", id, Field.Store.YES));
foreach (IShape shape in shapes)
{
IPoint pt = (IPoint)shape;
doc.Add(new StoredField(strategy.FieldName,
pt.X.ToString(CultureInfo.InvariantCulture) + " " +
pt.Y.ToString(CultureInfo.InvariantCulture)));
}
return new SpatialDocument()
{
Document = doc,
Shapes = shapes
};
}
Esempio di API spaziale
I SpatialStrategy
class incapsula un approccio all'indicizzazione e alla ricerca dei documenti in base alle forme. Il Lucene distribuito supporta tutte le strategie spaziali supportate dal Lucene. Il funzionamento dell'API spaziale è lo stesso in entrambi, Distributed Lucene e Lucene, ad eccezione del concetto di SpatialDocument
classe che è presente solo nel Distributed Lucene.
Nell'esempio seguente, i documenti spaziali vengono definiti utilizzando il CreateSpatialDocument
metodo creato nell'esempio precedente e quindi aggiunto a IndexWriter
con la SpatialStrategy
definito. I documenti vengono successivamente ricercati con il IndexSearcher
e i risultati vengono successivamente verificati.
// Precondition: Lucene cache is already connected
string cache = "luceneCache";
string index = "normalIndex";
IndexReader indexReader = null;
IndexSearcher indexSearcher = null;
// Initialize prefix tree with depth level
var maxLevels = 11;
var grid = new GeohashPrefixTree(SpatialContext.GEO,
maxLevels);
// Define strategy
var strategy = new RecursivePrefixTreeStrategy(grid,
"myGeoField");
// Open NCache directory on index
var directory = NCacheDirectory.Open(cache, index);
// Configure and initalize index writer
var indexWriterConfig = new IndexWriterConfig
(LuceneVersion.LUCENE_48, new StandardAnalyzer
(LuceneVersion.LUCENE_48));
IndexWriter writer = new IndexWriter(directory,
indexWriterConfig);
// Add spatial documents to document with index writer
writer.AddDocument(CreateSpatialDocument(2, strategy,
SpatialContext.GEO.MakePoint(-80.93, 33.77)), strategy);
writer.AddDocument(CreateSpatialDocument(4, strategy,
SpatialContext.GEO.ReadShapeFromWkt("POINT(60.9289094
-50.7693246)")), strategy);
writer.AddDocument(CreateSpatialDocument(20,
strategy, SpatialContext.GEO.MakePoint(0.1, 0.1),
SpatialContext.GEO.MakePoint(0, 0)), strategy);
// Open index reader on directory
indexReader = DirectoryReader.Open(directory);
// Open index searcher on index reader
indexSearcher = new IndexSearcher(indexReader);
// Define sorting strategy
Sort idSort = new Sort(new SortField("id",
SortFieldType.INT32));
// Define spatial arguments
SpatialArgs args = new SpatialArgs(SpatialOperation.
Intersects, SpatialContext.GEO.MakeCircle(-80.0, 33.
0, DistanceUtils.Dist2Degrees(200, DistanceUtils.
EARTH_MEAN_RADIUS_KM)));
// Define the filter with spatial arguments
Filter filter = strategy.MakeFilter(args);
// Search top docs
TopDocs docs = indexSearcher.Search(new
MatchAllDocsQuery(), filter, 10, idSort);
if (indexSearcher != null) indexSearcher.Dispose();
if (indexReader != null) indexReader.Dispose();
Note:
Non smaltire il NCacheDirectory
, IndexReader
, IndexWriter
, IndexSearcher
e DirectoryTaxonomyReader
comporterà un consumo aggiuntivo di memoria sul lato server.
Risorse addizionali
NCache fornisce anche un'applicazione di esempio per l'API Geo-Spatial nel Distributed Lucene on GitHub
Vedere anche
.NETTO: DistribuitoLucene.Net.Spatial spazio dei nomi.