API géospatiale
Le Lucene distribué prend en charge l'indexation des documents avec les coordonnées géo-spatiales et, plus tard, l'interrogation de ces documents indexés pour une recherche basée sur la localisation. À cette fin, le Lucene distribué utilise le Spatial4n
bibliothèque.
Pré-requis
- Pour en savoir plus sur les prérequis standard requis pour travailler avec tous NCache fonctionnalités côté client, veuillez vous référer à la page donnée sur Prérequis de l'API côté client.
- Assurez-vous que vous avez créé et démarré un cache Lucene via le NCache Centre de gestion or Interface de ligne de commande.
- Assurez-vous que votre application n'utilise aucune DLL/référence Lucene native.
- Pour plus de détails sur l'API, reportez-vous à : DocumentSpatial, Stratégie spatiale, GeohashPrefixTree, RecursivePrefixTreeStrategyRecursivePrefixTreeStrategy, NCacheAnnuaire, IndexWriterConfig, Version Lucene, Analyseur standard, IndexWriter, Contexte spatial, ReadShapeFromWktReadShapeFromWkt, Recherche d'index, Lecteur d'index, Lecteur d'annuaire, Classe SortField, Type de champ de tri, Spatialargs, Opération Spatiale, DistanceUtils, MarqueCircle, Dist2Degrés, MarqueFiltre, TopDocs, Requête MatchAllDocs, disposer.
Document spatial
Les documents spatiaux sont créés à l'aide de la SpatialDocument
classe. Ces documents sont ensuite utilisés à des fins d'indexation. Cette classe est spécifique au Lucene distribué.
Les SpatialDocument
se compose des formes de la IShape
classe avec un Document
. Ces formes se transformeront ensuite en champs indexables côté serveur via un Strategy
. Les champs indexables seront ajoutés au Document
via IndexWriter
.
Dans l'exemple suivant, une méthode pour un document spatial est créée avec le type de retour de SpatialDocument
class, cette méthode est ensuite utilisée dans l'exemple suivant.
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
};
}
Exemple d'API spatiale
Les SpatialStrategy
La classe encapsule une approche d'indexation et de recherche de documents basée sur les formes. Le Lucene distribué prend en charge toutes les stratégies spatiales prises en charge par le Lucene. Le fonctionnement de l'API spatiale est le même dans les deux, le Lucene distribué et le Lucene, à l'exception du concept d'un SpatialDocument
classe qui est présente dans le Lucene distribué uniquement.
Dans l'exemple suivant, les documents spatiaux sont définis à l'aide de la CreateSpatialDocument
méthode créée dans l'exemple précédent, puis ajoutée à la IndexWriter
des SpatialStrategy
défini. Les documents sont ensuite recherchés avec le IndexSearcher
, et les résultats sont vérifiés par la suite.
// 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();
Notes
Ne pas disposer du NCacheDirectory
, IndexReader
, IndexWriter
, IndexSearcher
ainsi que DirectoryTaxonomyReader
entraînera une consommation de mémoire supplémentaire côté serveur.
Ressources additionnelles
NCache fournit également un exemple d'application pour l'API Geo-Spatial dans Distributed Lucene sur GitHub
Voir aussi
.RAPPORTER: DistribuéLucene.Net.Spatial espace de noms.