Geo-Spatial-API
Distributed Lucene unterstützt die Indizierung der Dokumente mit den geografischen Koordinaten und die spätere Abfrage dieser indizierten Dokumente für eine standortbasierte Suche. Zu diesem Zweck verwendet das Distributed Lucene die Spatial4n
Bibliothek.
Voraussetzungen:
- Lernen Sie die Standardvoraussetzungen kennen, die für die Arbeit mit allen erforderlich sind NCache Weitere Informationen zu clientseitigen Funktionen finden Sie auf der angegebenen Seite Clientseitige API-Voraussetzungen.
- Stellen Sie sicher, dass Sie über die einen Lucene-Cache erstellt und gestartet haben NCache Management Center or Befehlszeilenschnittstelle.
- Stellen Sie sicher, dass Ihre Anwendung keine native Lucene-DLL/-Referenz verwendet.
- Einzelheiten zur API finden Sie unter: Raumdokument, Räumliche Strategie, GeohashPrefixTree, RecursivePrefixTreeStrategy, NCacheVerzeichnis, IndexWriterConfig, LuceneVersion, StandardAnalyzer, IndexWriter, SpatialContext, ReadShapeFromWkt, IndexSucher, IndexReader, DirectoryReader, Klasse SortField, SortFieldType, SpatialArgs, SpatialOperation, DistanceUtils, Kreis machen, Abstand2Grad, MakeFilter, TopDocs, MatchAllDocsQuery, Entsorgen.
Raumdokument
Die räumlichen Dokumente werden mit dem erstellt SpatialDocument
Klasse. Diese Dokumente werden später für Indexierungszwecke verwendet. Diese Klasse ist spezifisch für Distributed Lucene.
Das SpatialDocument
besteht aus den Formen der IShape
Klasse zusammen mit a Document
. Diese Formen werden dann über a in die indexierbaren Felder auf der Serverseite umgewandelt Strategy
. Die indizierbaren Felder werden dem hinzugefügt Document
IndexWriter
.
Im folgenden Beispiel wird eine Methode für ein räumliches Dokument mit dem Rückgabetyp von erstellt SpatialDocument
Klasse wird diese Methode dann im nächsten Beispiel verwendet.
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
};
}
Beispiel für eine räumliche API
Das SpatialStrategy
-Klasse kapselt einen Ansatz zum Indizieren und Durchsuchen der Dokumente basierend auf den Formen. Das Distributed Lucene unterstützt alle räumlichen Strategien, die von Lucene unterstützt werden. Die Funktionsweise der räumlichen API ist in Distributed Lucene und Lucene gleich, mit Ausnahme des Konzepts von a SpatialDocument
Klasse, die nur in Distributed Lucene vorhanden ist.
Im folgenden Beispiel werden räumliche Dokumente mithilfe von definiert CreateSpatialDocument
Methode, die im vorherigen Beispiel erstellt und dann zur hinzugefügt wurde IndexWriter
an. Nach der Installation können Sie HEIC-Dateien mit der SpatialStrategy
definiert. Die Dokumente werden später mit dem durchsucht IndexSearcher
, und die Ergebnisse werden anschließend überprüft.
// 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
Nicht entsorgen NCacheDirectory
, IndexReader
, IndexWriter
, IndexSearcher
und DirectoryTaxonomyReader
führt zu einem zusätzlichen Speicherverbrauch auf der Serverseite.
Weitere Informationen
NCache stellt auch eine Beispielanwendung für die Geo-Spatial-API in Distributed Lucene bereit GitHub
Siehe auch
.NETZ: DistributedLucene.Net.Spatial Namespace.