{"id":311,"date":"2015-01-30T18:30:34","date_gmt":"2015-01-30T17:30:34","guid":{"rendered":"http:\/\/www.cymbeline.ch\/?p=311"},"modified":"2015-02-10T21:48:16","modified_gmt":"2015-02-10T20:48:16","slug":"improvements-lucene-net-objectmapping","status":"publish","type":"post","link":"https:\/\/cymbeline.ch\/2015\/01\/30\/improvements-lucene-net-objectmapping\/","title":{"rendered":"Improvements to Lucene.Net.ObjectMapping"},"content":{"rendered":"
I’d like to discuss some improvements to Lucene.Net.ObjectMapping which I published yesterday as a new version (1.0.3) to NuGet<\/a>. In addition, I want to take this opportunity to give a quick outlook on what’s to come next.<\/p>\n The library now comes with support for all of the CRUD operations. Let’s look at them one by one, starting with Create.<\/p>\n In Lucene.Net terms, that would be AddDocument. Since the library does object to document mapping, this is simplified to an Add operation.<\/p>\n Or, if you need a specific analyzer for the document the object gets mapped to, you can use the overload which accepts a second parameter of type Analyzer.<\/p>\n The retrieve operation, or mapping of a document to an object hasn’t changed since v1.0.0. There are examples for how to query and retrieve in my previous post<\/a>. Of course, if you happen to know the ID of the document without a query, then you can just map that document to your class without going through a query. But since the document IDs can change over time, it’s usually more practical to pivot off a query.<\/p>\n Update is maybe the most interesting operation here. Since document IDs can change over time, there’s really no good way to reliably update a specific document, without making a query. That’s why the UpdateDocument method from the IndexReader asks you for a query\/term to use to match the document to update. And that’s why it’s generally a good idea to bring your own unique identifier to the game. Suppose your class has a property of type Guid and name “Id”, which is used as your unique identifier for the objects of that type.<\/p>\n Under the covers, this will find all the documents matching the query and matching the type (MyClass), delete them and then add a new document for the mapped myObject. If you need an analyzer, for the newly mapped document, you can use the second overload.<\/p>\n Just like the retrieve operation, the Delete operation is also supported since v1.0.0. I realize though that I haven’t given any examples yet. But really, it’s quite simple again. You give the type of objects you want to delete the mapped documents for, and you give a query to identify the objects to delete. No magic at all.<\/p>\n Naturally, you can use any Query you want for the delete operation (as well as for updates). You can make them arbitrarily complex as long as they’re still supported by Lucene.Net.<\/p>\n That’s it, CRUD with no magic, no tricks. Let me know if there’s functionality you’d like to see added, either by commenting here or by opening a bug\/enhancement\/whatever on GitHub<\/a>. I’ve started working on LINQ support for the ObjectMapping library too, with the goal that you can write LINQ queries like the following.<\/p>\n It will likely take a little longer to get that stable, but I’ll try to make a pre-release on NuGet in the next few weeks.<\/p>\n <\/p>","protected":false},"excerpt":{"rendered":" I’d like to discuss some improvements to Lucene.Net.ObjectMapping which I published yesterday as a new version (1.0.3) to NuGet. In addition, I want to take this opportunity to give a quick outlook on what’s to come next. CRUD Operations The library now comes with support for all of the CRUD operations. Let’s look at them … Continue reading “Improvements to Lucene.Net.ObjectMapping”<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[61],"tags":[17,12,80,77,78,79],"yoast_head":"\nCRUD Operations<\/h2>\n
Create \/ Add<\/h3>\n
\r\nIndexWriter myIndexWriter = ...;\r\nMyClass myObject = new MyClass(...);\r\n\r\nmyIndexWriter.Add(myObject);\r\n<\/pre>\n
\r\nIndexWriter myIndexWriter = ...;\r\nMyClass myObject = new MyClass(...);\r\n\r\nmyIndexWriter.Add(myObject, new MyOwnAnalyzer());\r\n<\/pre>\n
Retrieve \/ Query<\/h3>\n
Update<\/h3>\n
\r\nIndexWriter myIndexWriter = ...;\r\nMyClass myObject = ...;\r\n\r\nmyObject.MyPropertyToUpdate = "new value";\r\n\r\nmyIndexWriter.Update(\r\n myObject,\r\n new TermQuery(new Term("Id", myObject.Id.ToString())));\r\n<\/pre>\n
\r\nIndexWriter myIndexWriter = ...;\r\nMyClass myObject = ...;\r\n\r\nmyObject.MyPropertyToUpdate = "new value";\r\n\r\nmyIndexWriter.Update(\r\n myObject,\r\n new TermQuery(new Term("Id", myObject.Id.ToString())),\r\n new MyOwnAnalyzer());\r\n<\/pre>\n
Delete<\/h3>\n
\r\nIndexWriter myIndexWriter = ...;\r\nmyIndexWriter.DeleteDocuments<MyClass>(\r\n new TermQuery(new Term("Tag", "deleted")));\r\n<\/pre>\n
Summary and Outlook<\/h2>\n
\r\nvar query = from myObject in mySearcher.AsQueryable<MyClass>()\r\n where myObject.Tag == "history"\r\n select myObject;\r\n<\/pre>\n