Re: Lucene Concurrent Search
For the singleton technique that I use, the per-search code looks like import org.apache.lucene.search.IndexSearcher; import org.apache.lucene.search.SearcherManager; SearcherManager sm = LuceneSearcherManagerCache.get(indexdir); IndexSearcher s = sm.acquire(); try { search(...); } finally { sm.release(s); } s = null; where LuceneSearcherManagerCache is the singleton class that initialises and caches SearcherManager instances by index directory. It calls maybeRefresh() on each call which of course isn't particularly efficient, but this is used, within tomcat, for occasional searches on small indexes with no knowledge of when or if a particular index may have changed or not. In practice, on my indexes on my hardware it is, as usual with lucene, fast. As I think I said, the initialization of SearcherManager is 100% default: new SearcherManager(dir, new SearcherFactory()); Hope that helps. -- Ian. On Thu, Sep 5, 2013 at 11:21 PM, David Miranda david.b.mira...@gmail.com wrote: Did you have a practical example of the use of SearchManager (initialize, use to do research)? Thanks in advance. 2013/9/5 Stephen Green eelstretch...@gmail.com You can implement a ServletListener for your app and open the index there (in the contextInitialized method). You can then create the SearcherManager from the IndexReader/Searcher and store it in the ServletContext, where it can be fetched out by your REST servlets. This is a typical pattern that we use for lots of Web apps that use resources like Lucene. On Thu, Sep 5, 2013 at 12:05 PM, Ian Lea ian@gmail.com wrote: I use a singleton class but there are other ways in tomcat. Can't remember what - maybe application scope. -- Ian. On Thu, Sep 5, 2013 at 4:46 PM, David Miranda david.b.mira...@gmail.com wrote: Where I can initialize the SearchManager variable to after use it in the REST servlet to do research in the index? 2013/9/5 Ian Lea ian@gmail.com I think that blog post was bleeding edge and the API changed a bit subsequently. I use Directory dir = whatever; SearcherManager sm = new SearcherManager(dir, new SearcherFactory()); to get default behaviour. The javadocs for SearcherFactory explain that you can write your own implementation if you want custom behaviour such as warming. -- Ian. On Thu, Sep 5, 2013 at 3:53 PM, David Miranda david.b.mira...@gmail.com wrote: Hi, I'm trying to implement my code with SearchManager to make my app thread-safe. I'm follow this post: http://blog.mikemccandless.com/2011/09/lucenes-searchermanager-simplifies.html There is a class that implements SearchWarmer. I can't find this class in the Lucene library, what class is that? Thanks. 2013/9/5 Aditya findbestopensou...@gmail.com Hi You want to use REST service for your search, then my advice would be to use Solr. As it has buitl-in functionality of REST API. If you want to use Lucene then below are my comments: 1. In do search function, you are creating reader object. If this call is invoked for every query then it would be very expensive. You need to create it once globally and re opon it, if the index is modified. Its better use SearchManager. Regards Aditya www.findbestopensource.com - Search from 1 Million open source projects. On Thu, Sep 5, 2013 at 6:46 AM, David Miranda david.b.mira...@gmail.com wrote: Hi, I'm developing a web application, that contains a REST service in the Tomcat, that receives several requests per second. The REST requests do research in a Lucene index, to do this i use the IndexSearch. My questions are: - There are concurrency problems in multiple research? - What the best design pattern to do this? public class IndexResearch(){ private static int MAX_HITS = 500; private static String DIRECTORY = indexdir; private IndexSearcher searcher; private StandardAnalyzer analyzer; public IndexResearch(){ } public String doSearch(String text){ analyzer = new StandardAnalyzer(Version.LUCENE_43); topic = QueryParser.escape(topic); Query q = new QueryParser(Version.LUCENE_43, field, analyzer ).parse(text); File indexDirectory = new File(DIRECTORY); IndexReader reader; reader = DirectoryReader.open(FSDirectory.open(indexDirectory)); searcher = new IndexSearcher(reader); /*more code*/ } } Can I create, in the servlet, one object of this class per client request (Is that the best design pattern)? Thanks in advance. -- Cumprimentos,
Re: Lucene Concurrent Search
Something like: public class SearchListener implements ServletContextListener { @Override public void contextInitialized(ServletContextEvent sce) { ServletContext sc = sce.getServletContext(); String indexDir = sc.getInitParameter(indexDir); SearcherManager searcherManager = new SearcherManager(FSDirectory.open(new File(indexDir)), null); sc.setAttribute(searcherManager, searcherManager); } public void contextDestroyed(ServletContextEvent sce) { ServletContext sc = sce.getServletContext(); SearcherManager searcherManager = (SearcherManager) sc.getAttribute(searcherManager); if(searcherManager != null) { try { searcherManager.close(); } catch(IOException ex) { logger.log(Level.SEVERE, String.format( Error shutting down search engine), ex); } } } } Usually does the trick. You need to put some parameters (indexDir) into your web.xml and make sure that it knows that SearchListener is a ServletListener for your Web app. But, to re-iterate what someone else said: if you really just want RESTful search, you might be better off with Solr. On Thu, Sep 5, 2013 at 6:21 PM, David Miranda david.b.mira...@gmail.comwrote: Did you have a practical example of the use of SearchManager (initialize, use to do research)? Thanks in advance. 2013/9/5 Stephen Green eelstretch...@gmail.com You can implement a ServletListener for your app and open the index there (in the contextInitialized method). You can then create the SearcherManager from the IndexReader/Searcher and store it in the ServletContext, where it can be fetched out by your REST servlets. This is a typical pattern that we use for lots of Web apps that use resources like Lucene. On Thu, Sep 5, 2013 at 12:05 PM, Ian Lea ian@gmail.com wrote: I use a singleton class but there are other ways in tomcat. Can't remember what - maybe application scope. -- Ian. On Thu, Sep 5, 2013 at 4:46 PM, David Miranda david.b.mira...@gmail.com wrote: Where I can initialize the SearchManager variable to after use it in the REST servlet to do research in the index? 2013/9/5 Ian Lea ian@gmail.com I think that blog post was bleeding edge and the API changed a bit subsequently. I use Directory dir = whatever; SearcherManager sm = new SearcherManager(dir, new SearcherFactory()); to get default behaviour. The javadocs for SearcherFactory explain that you can write your own implementation if you want custom behaviour such as warming. -- Ian. On Thu, Sep 5, 2013 at 3:53 PM, David Miranda david.b.mira...@gmail.com wrote: Hi, I'm trying to implement my code with SearchManager to make my app thread-safe. I'm follow this post: http://blog.mikemccandless.com/2011/09/lucenes-searchermanager-simplifies.html There is a class that implements SearchWarmer. I can't find this class in the Lucene library, what class is that? Thanks. 2013/9/5 Aditya findbestopensou...@gmail.com Hi You want to use REST service for your search, then my advice would be to use Solr. As it has buitl-in functionality of REST API. If you want to use Lucene then below are my comments: 1. In do search function, you are creating reader object. If this call is invoked for every query then it would be very expensive. You need to create it once globally and re opon it, if the index is modified. Its better use SearchManager. Regards Aditya www.findbestopensource.com - Search from 1 Million open source projects. On Thu, Sep 5, 2013 at 6:46 AM, David Miranda david.b.mira...@gmail.com wrote: Hi, I'm developing a web application, that contains a REST service in the Tomcat, that receives several requests per second. The REST requests do research in a Lucene index, to do this i use the IndexSearch. My questions are: - There are concurrency problems in multiple research? - What the best design pattern to do this? public class IndexResearch(){ private static int MAX_HITS = 500; private static String DIRECTORY = indexdir; private IndexSearcher searcher; private StandardAnalyzer analyzer; public IndexResearch(){ } public String doSearch(String text){ analyzer = new StandardAnalyzer(Version.LUCENE_43); topic = QueryParser.escape(topic); Query q = new QueryParser(Version.LUCENE_43, field, analyzer ).parse(text); File indexDirectory = new
Re: Lucene Concurrent Search
Why use Solr instead of Lucene for this kind of application? 2013/9/6 Stephen Green eelstretch...@gmail.com Something like: public class SearchListener implements ServletContextListener { @Override public void contextInitialized(ServletContextEvent sce) { ServletContext sc = sce.getServletContext(); String indexDir = sc.getInitParameter(indexDir); SearcherManager searcherManager = new SearcherManager(FSDirectory.open(new File(indexDir)), null); sc.setAttribute(searcherManager, searcherManager); } public void contextDestroyed(ServletContextEvent sce) { ServletContext sc = sce.getServletContext(); SearcherManager searcherManager = (SearcherManager) sc.getAttribute(searcherManager); if(searcherManager != null) { try { searcherManager.close(); } catch(IOException ex) { logger.log(Level.SEVERE, String.format( Error shutting down search engine), ex); } } } } Usually does the trick. You need to put some parameters (indexDir) into your web.xml and make sure that it knows that SearchListener is a ServletListener for your Web app. But, to re-iterate what someone else said: if you really just want RESTful search, you might be better off with Solr. On Thu, Sep 5, 2013 at 6:21 PM, David Miranda david.b.mira...@gmail.com wrote: Did you have a practical example of the use of SearchManager (initialize, use to do research)? Thanks in advance. 2013/9/5 Stephen Green eelstretch...@gmail.com You can implement a ServletListener for your app and open the index there (in the contextInitialized method). You can then create the SearcherManager from the IndexReader/Searcher and store it in the ServletContext, where it can be fetched out by your REST servlets. This is a typical pattern that we use for lots of Web apps that use resources like Lucene. On Thu, Sep 5, 2013 at 12:05 PM, Ian Lea ian@gmail.com wrote: I use a singleton class but there are other ways in tomcat. Can't remember what - maybe application scope. -- Ian. On Thu, Sep 5, 2013 at 4:46 PM, David Miranda david.b.mira...@gmail.com wrote: Where I can initialize the SearchManager variable to after use it in the REST servlet to do research in the index? 2013/9/5 Ian Lea ian@gmail.com I think that blog post was bleeding edge and the API changed a bit subsequently. I use Directory dir = whatever; SearcherManager sm = new SearcherManager(dir, new SearcherFactory()); to get default behaviour. The javadocs for SearcherFactory explain that you can write your own implementation if you want custom behaviour such as warming. -- Ian. On Thu, Sep 5, 2013 at 3:53 PM, David Miranda david.b.mira...@gmail.com wrote: Hi, I'm trying to implement my code with SearchManager to make my app thread-safe. I'm follow this post: http://blog.mikemccandless.com/2011/09/lucenes-searchermanager-simplifies.html There is a class that implements SearchWarmer. I can't find this class in the Lucene library, what class is that? Thanks. 2013/9/5 Aditya findbestopensou...@gmail.com Hi You want to use REST service for your search, then my advice would be to use Solr. As it has buitl-in functionality of REST API. If you want to use Lucene then below are my comments: 1. In do search function, you are creating reader object. If this call is invoked for every query then it would be very expensive. You need to create it once globally and re opon it, if the index is modified. Its better use SearchManager. Regards Aditya www.findbestopensource.com - Search from 1 Million open source projects. On Thu, Sep 5, 2013 at 6:46 AM, David Miranda david.b.mira...@gmail.com wrote: Hi, I'm developing a web application, that contains a REST service in the Tomcat, that receives several requests per second. The REST requests do research in a Lucene index, to do this i use the IndexSearch. My questions are: - There are concurrency problems in multiple research? - What the best design pattern to do this? public class IndexResearch(){ private static int MAX_HITS = 500; private static String DIRECTORY = indexdir; private IndexSearcher searcher; private StandardAnalyzer analyzer; public IndexResearch(){ } public
Re: Lucene Concurrent Search
Mostly because it already handles all of the I sexing and querying that I expect you'll want to be doing and now with Solr Cloud you can ven scale search beyond one machine. If you're just looking to learn about this stuff, though, it is fun to roll your own! On Friday, September 6, 2013, David Miranda wrote: Why use Solr instead of Lucene for this kind of application? 2013/9/6 Stephen Green eelstretch...@gmail.com Something like: public class SearchListener implements ServletContextListener { @Override public void contextInitialized(ServletContextEvent sce) { ServletContext sc = sce.getServletContext(); String indexDir = sc.getInitParameter(indexDir); SearcherManager searcherManager = new SearcherManager(FSDirectory.open(new File(indexDir)), null); sc.setAttribute(searcherManager, searcherManager); } public void contextDestroyed(ServletContextEvent sce) { ServletContext sc = sce.getServletContext(); SearcherManager searcherManager = (SearcherManager) sc.getAttribute(searcherManager); if(searcherManager != null) { try { searcherManager.close(); } catch(IOException ex) { logger.log(Level.SEVERE, String.format( Error shutting down search engine), ex); } } } } Usually does the trick. You need to put some parameters (indexDir) into your web.xml and make sure that it knows that SearchListener is a ServletListener for your Web app. But, to re-iterate what someone else said: if you really just want RESTful search, you might be better off with Solr. On Thu, Sep 5, 2013 at 6:21 PM, David Miranda david.b.mira...@gmail.com wrote: Did you have a practical example of the use of SearchManager (initialize, use to do research)? Thanks in advance. 2013/9/5 Stephen Green eelstretch...@gmail.com You can implement a ServletListener for your app and open the index there (in the contextInitialized method). You can then create the SearcherManager from the IndexReader/Searcher and store it in the ServletContext, where it can be fetched out by your REST servlets. This is a typical pattern that we use for lots of Web apps that use resources like Lucene. On Thu, Sep 5, 2013 at 12:05 PM, Ian Lea ian@gmail.com wrote: I use a singleton class but there are other ways in tomcat. Can't remember what - maybe application scope. -- Ian. On Thu, Sep 5, 2013 at 4:46 PM, David Miranda david.b.mira...@gmail.com wrote: Where I can initialize the SearchManager variable to after use it in the REST servlet to do research in the index? 2013/9/5 Ian Lea ian@gmail.com I think that blog post was bleeding edge and the API changed a bit subsequently. I use Directory dir = whatever; -- Cumprimentos, David Miranda -- Stephen Green http://thesearchguy.wordpress.com
Re: Lucene Concurrent Search
Take a look at org.apache.lucene.search.SearcherManager. From the javadocs Utility class to safely share IndexSearcher instances across multiple threads, while periodically reopening.. -- Ian. On Thu, Sep 5, 2013 at 2:16 AM, David Miranda david.b.mira...@gmail.com wrote: Hi, I'm developing a web application, that contains a REST service in the Tomcat, that receives several requests per second. The REST requests do research in a Lucene index, to do this i use the IndexSearch. My questions are: - There are concurrency problems in multiple research? - What the best design pattern to do this? public class IndexResearch(){ private static int MAX_HITS = 500; private static String DIRECTORY = indexdir; private IndexSearcher searcher; private StandardAnalyzer analyzer; public IndexResearch(){ } public String doSearch(String text){ analyzer = new StandardAnalyzer(Version.LUCENE_43); topic = QueryParser.escape(topic); Query q = new QueryParser(Version.LUCENE_43, field, analyzer ).parse(text); File indexDirectory = new File(DIRECTORY); IndexReader reader; reader = DirectoryReader.open(FSDirectory.open(indexDirectory)); searcher = new IndexSearcher(reader); /*more code*/ } } Can I create, in the servlet, one object of this class per client request (Is that the best design pattern)? Thanks in advance. - To unsubscribe, e-mail: java-user-unsubscr...@lucene.apache.org For additional commands, e-mail: java-user-h...@lucene.apache.org
Re: Lucene Concurrent Search
Hi You want to use REST service for your search, then my advice would be to use Solr. As it has buitl-in functionality of REST API. If you want to use Lucene then below are my comments: 1. In do search function, you are creating reader object. If this call is invoked for every query then it would be very expensive. You need to create it once globally and re opon it, if the index is modified. Its better use SearchManager. Regards Aditya www.findbestopensource.com - Search from 1 Million open source projects. On Thu, Sep 5, 2013 at 6:46 AM, David Miranda david.b.mira...@gmail.comwrote: Hi, I'm developing a web application, that contains a REST service in the Tomcat, that receives several requests per second. The REST requests do research in a Lucene index, to do this i use the IndexSearch. My questions are: - There are concurrency problems in multiple research? - What the best design pattern to do this? public class IndexResearch(){ private static int MAX_HITS = 500; private static String DIRECTORY = indexdir; private IndexSearcher searcher; private StandardAnalyzer analyzer; public IndexResearch(){ } public String doSearch(String text){ analyzer = new StandardAnalyzer(Version.LUCENE_43); topic = QueryParser.escape(topic); Query q = new QueryParser(Version.LUCENE_43, field, analyzer ).parse(text); File indexDirectory = new File(DIRECTORY); IndexReader reader; reader = DirectoryReader.open(FSDirectory.open(indexDirectory)); searcher = new IndexSearcher(reader); /*more code*/ } } Can I create, in the servlet, one object of this class per client request (Is that the best design pattern)? Thanks in advance.
Re: Lucene Concurrent Search
I think that blog post was bleeding edge and the API changed a bit subsequently. I use Directory dir = whatever; SearcherManager sm = new SearcherManager(dir, new SearcherFactory()); to get default behaviour. The javadocs for SearcherFactory explain that you can write your own implementation if you want custom behaviour such as warming. -- Ian. On Thu, Sep 5, 2013 at 3:53 PM, David Miranda david.b.mira...@gmail.com wrote: Hi, I'm trying to implement my code with SearchManager to make my app thread-safe. I'm follow this post: http://blog.mikemccandless.com/2011/09/lucenes-searchermanager-simplifies.html There is a class that implements SearchWarmer. I can't find this class in the Lucene library, what class is that? Thanks. 2013/9/5 Aditya findbestopensou...@gmail.com Hi You want to use REST service for your search, then my advice would be to use Solr. As it has buitl-in functionality of REST API. If you want to use Lucene then below are my comments: 1. In do search function, you are creating reader object. If this call is invoked for every query then it would be very expensive. You need to create it once globally and re opon it, if the index is modified. Its better use SearchManager. Regards Aditya www.findbestopensource.com - Search from 1 Million open source projects. On Thu, Sep 5, 2013 at 6:46 AM, David Miranda david.b.mira...@gmail.com wrote: Hi, I'm developing a web application, that contains a REST service in the Tomcat, that receives several requests per second. The REST requests do research in a Lucene index, to do this i use the IndexSearch. My questions are: - There are concurrency problems in multiple research? - What the best design pattern to do this? public class IndexResearch(){ private static int MAX_HITS = 500; private static String DIRECTORY = indexdir; private IndexSearcher searcher; private StandardAnalyzer analyzer; public IndexResearch(){ } public String doSearch(String text){ analyzer = new StandardAnalyzer(Version.LUCENE_43); topic = QueryParser.escape(topic); Query q = new QueryParser(Version.LUCENE_43, field, analyzer ).parse(text); File indexDirectory = new File(DIRECTORY); IndexReader reader; reader = DirectoryReader.open(FSDirectory.open(indexDirectory)); searcher = new IndexSearcher(reader); /*more code*/ } } Can I create, in the servlet, one object of this class per client request (Is that the best design pattern)? Thanks in advance. -- Cumprimentos, David Miranda - To unsubscribe, e-mail: java-user-unsubscr...@lucene.apache.org For additional commands, e-mail: java-user-h...@lucene.apache.org
Re: Lucene Concurrent Search
Where I can initialize the SearchManager variable to after use it in the REST servlet to do research in the index? 2013/9/5 Ian Lea ian@gmail.com I think that blog post was bleeding edge and the API changed a bit subsequently. I use Directory dir = whatever; SearcherManager sm = new SearcherManager(dir, new SearcherFactory()); to get default behaviour. The javadocs for SearcherFactory explain that you can write your own implementation if you want custom behaviour such as warming. -- Ian. On Thu, Sep 5, 2013 at 3:53 PM, David Miranda david.b.mira...@gmail.com wrote: Hi, I'm trying to implement my code with SearchManager to make my app thread-safe. I'm follow this post: http://blog.mikemccandless.com/2011/09/lucenes-searchermanager-simplifies.html There is a class that implements SearchWarmer. I can't find this class in the Lucene library, what class is that? Thanks. 2013/9/5 Aditya findbestopensou...@gmail.com Hi You want to use REST service for your search, then my advice would be to use Solr. As it has buitl-in functionality of REST API. If you want to use Lucene then below are my comments: 1. In do search function, you are creating reader object. If this call is invoked for every query then it would be very expensive. You need to create it once globally and re opon it, if the index is modified. Its better use SearchManager. Regards Aditya www.findbestopensource.com - Search from 1 Million open source projects. On Thu, Sep 5, 2013 at 6:46 AM, David Miranda david.b.mira...@gmail.com wrote: Hi, I'm developing a web application, that contains a REST service in the Tomcat, that receives several requests per second. The REST requests do research in a Lucene index, to do this i use the IndexSearch. My questions are: - There are concurrency problems in multiple research? - What the best design pattern to do this? public class IndexResearch(){ private static int MAX_HITS = 500; private static String DIRECTORY = indexdir; private IndexSearcher searcher; private StandardAnalyzer analyzer; public IndexResearch(){ } public String doSearch(String text){ analyzer = new StandardAnalyzer(Version.LUCENE_43); topic = QueryParser.escape(topic); Query q = new QueryParser(Version.LUCENE_43, field, analyzer ).parse(text); File indexDirectory = new File(DIRECTORY); IndexReader reader; reader = DirectoryReader.open(FSDirectory.open(indexDirectory)); searcher = new IndexSearcher(reader); /*more code*/ } } Can I create, in the servlet, one object of this class per client request (Is that the best design pattern)? Thanks in advance. -- Cumprimentos, David Miranda - To unsubscribe, e-mail: java-user-unsubscr...@lucene.apache.org For additional commands, e-mail: java-user-h...@lucene.apache.org -- Cumprimentos, David Miranda
Re: Lucene Concurrent Search
Hi, I'm trying to implement my code with SearchManager to make my app thread-safe. I'm follow this post: http://blog.mikemccandless.com/2011/09/lucenes-searchermanager-simplifies.html There is a class that implements SearchWarmer. I can't find this class in the Lucene library, what class is that? Thanks. 2013/9/5 Aditya findbestopensou...@gmail.com Hi You want to use REST service for your search, then my advice would be to use Solr. As it has buitl-in functionality of REST API. If you want to use Lucene then below are my comments: 1. In do search function, you are creating reader object. If this call is invoked for every query then it would be very expensive. You need to create it once globally and re opon it, if the index is modified. Its better use SearchManager. Regards Aditya www.findbestopensource.com - Search from 1 Million open source projects. On Thu, Sep 5, 2013 at 6:46 AM, David Miranda david.b.mira...@gmail.com wrote: Hi, I'm developing a web application, that contains a REST service in the Tomcat, that receives several requests per second. The REST requests do research in a Lucene index, to do this i use the IndexSearch. My questions are: - There are concurrency problems in multiple research? - What the best design pattern to do this? public class IndexResearch(){ private static int MAX_HITS = 500; private static String DIRECTORY = indexdir; private IndexSearcher searcher; private StandardAnalyzer analyzer; public IndexResearch(){ } public String doSearch(String text){ analyzer = new StandardAnalyzer(Version.LUCENE_43); topic = QueryParser.escape(topic); Query q = new QueryParser(Version.LUCENE_43, field, analyzer ).parse(text); File indexDirectory = new File(DIRECTORY); IndexReader reader; reader = DirectoryReader.open(FSDirectory.open(indexDirectory)); searcher = new IndexSearcher(reader); /*more code*/ } } Can I create, in the servlet, one object of this class per client request (Is that the best design pattern)? Thanks in advance. -- Cumprimentos, David Miranda
Re: Lucene Concurrent Search
I use a singleton class but there are other ways in tomcat. Can't remember what - maybe application scope. -- Ian. On Thu, Sep 5, 2013 at 4:46 PM, David Miranda david.b.mira...@gmail.com wrote: Where I can initialize the SearchManager variable to after use it in the REST servlet to do research in the index? 2013/9/5 Ian Lea ian@gmail.com I think that blog post was bleeding edge and the API changed a bit subsequently. I use Directory dir = whatever; SearcherManager sm = new SearcherManager(dir, new SearcherFactory()); to get default behaviour. The javadocs for SearcherFactory explain that you can write your own implementation if you want custom behaviour such as warming. -- Ian. On Thu, Sep 5, 2013 at 3:53 PM, David Miranda david.b.mira...@gmail.com wrote: Hi, I'm trying to implement my code with SearchManager to make my app thread-safe. I'm follow this post: http://blog.mikemccandless.com/2011/09/lucenes-searchermanager-simplifies.html There is a class that implements SearchWarmer. I can't find this class in the Lucene library, what class is that? Thanks. 2013/9/5 Aditya findbestopensou...@gmail.com Hi You want to use REST service for your search, then my advice would be to use Solr. As it has buitl-in functionality of REST API. If you want to use Lucene then below are my comments: 1. In do search function, you are creating reader object. If this call is invoked for every query then it would be very expensive. You need to create it once globally and re opon it, if the index is modified. Its better use SearchManager. Regards Aditya www.findbestopensource.com - Search from 1 Million open source projects. On Thu, Sep 5, 2013 at 6:46 AM, David Miranda david.b.mira...@gmail.com wrote: Hi, I'm developing a web application, that contains a REST service in the Tomcat, that receives several requests per second. The REST requests do research in a Lucene index, to do this i use the IndexSearch. My questions are: - There are concurrency problems in multiple research? - What the best design pattern to do this? public class IndexResearch(){ private static int MAX_HITS = 500; private static String DIRECTORY = indexdir; private IndexSearcher searcher; private StandardAnalyzer analyzer; public IndexResearch(){ } public String doSearch(String text){ analyzer = new StandardAnalyzer(Version.LUCENE_43); topic = QueryParser.escape(topic); Query q = new QueryParser(Version.LUCENE_43, field, analyzer ).parse(text); File indexDirectory = new File(DIRECTORY); IndexReader reader; reader = DirectoryReader.open(FSDirectory.open(indexDirectory)); searcher = new IndexSearcher(reader); /*more code*/ } } Can I create, in the servlet, one object of this class per client request (Is that the best design pattern)? Thanks in advance. -- Cumprimentos, David Miranda - To unsubscribe, e-mail: java-user-unsubscr...@lucene.apache.org For additional commands, e-mail: java-user-h...@lucene.apache.org -- Cumprimentos, David Miranda - To unsubscribe, e-mail: java-user-unsubscr...@lucene.apache.org For additional commands, e-mail: java-user-h...@lucene.apache.org
Re: Lucene Concurrent Search
Did you have a practical example of the use of SearchManager (initialize, use to do research)? Thanks in advance. 2013/9/5 Stephen Green eelstretch...@gmail.com You can implement a ServletListener for your app and open the index there (in the contextInitialized method). You can then create the SearcherManager from the IndexReader/Searcher and store it in the ServletContext, where it can be fetched out by your REST servlets. This is a typical pattern that we use for lots of Web apps that use resources like Lucene. On Thu, Sep 5, 2013 at 12:05 PM, Ian Lea ian@gmail.com wrote: I use a singleton class but there are other ways in tomcat. Can't remember what - maybe application scope. -- Ian. On Thu, Sep 5, 2013 at 4:46 PM, David Miranda david.b.mira...@gmail.com wrote: Where I can initialize the SearchManager variable to after use it in the REST servlet to do research in the index? 2013/9/5 Ian Lea ian@gmail.com I think that blog post was bleeding edge and the API changed a bit subsequently. I use Directory dir = whatever; SearcherManager sm = new SearcherManager(dir, new SearcherFactory()); to get default behaviour. The javadocs for SearcherFactory explain that you can write your own implementation if you want custom behaviour such as warming. -- Ian. On Thu, Sep 5, 2013 at 3:53 PM, David Miranda david.b.mira...@gmail.com wrote: Hi, I'm trying to implement my code with SearchManager to make my app thread-safe. I'm follow this post: http://blog.mikemccandless.com/2011/09/lucenes-searchermanager-simplifies.html There is a class that implements SearchWarmer. I can't find this class in the Lucene library, what class is that? Thanks. 2013/9/5 Aditya findbestopensou...@gmail.com Hi You want to use REST service for your search, then my advice would be to use Solr. As it has buitl-in functionality of REST API. If you want to use Lucene then below are my comments: 1. In do search function, you are creating reader object. If this call is invoked for every query then it would be very expensive. You need to create it once globally and re opon it, if the index is modified. Its better use SearchManager. Regards Aditya www.findbestopensource.com - Search from 1 Million open source projects. On Thu, Sep 5, 2013 at 6:46 AM, David Miranda david.b.mira...@gmail.com wrote: Hi, I'm developing a web application, that contains a REST service in the Tomcat, that receives several requests per second. The REST requests do research in a Lucene index, to do this i use the IndexSearch. My questions are: - There are concurrency problems in multiple research? - What the best design pattern to do this? public class IndexResearch(){ private static int MAX_HITS = 500; private static String DIRECTORY = indexdir; private IndexSearcher searcher; private StandardAnalyzer analyzer; public IndexResearch(){ } public String doSearch(String text){ analyzer = new StandardAnalyzer(Version.LUCENE_43); topic = QueryParser.escape(topic); Query q = new QueryParser(Version.LUCENE_43, field, analyzer ).parse(text); File indexDirectory = new File(DIRECTORY); IndexReader reader; reader = DirectoryReader.open(FSDirectory.open(indexDirectory)); searcher = new IndexSearcher(reader); /*more code*/ } } Can I create, in the servlet, one object of this class per client request (Is that the best design pattern)? Thanks in advance. -- Cumprimentos, David Miranda - To unsubscribe, e-mail: java-user-unsubscr...@lucene.apache.org For additional commands, e-mail: java-user-h...@lucene.apache.org -- Cumprimentos, David Miranda - To unsubscribe, e-mail: java-user-unsubscr...@lucene.apache.org For additional commands, e-mail: java-user-h...@lucene.apache.org -- Stephen Green http://thesearchguy.wordpress.com -- Cumprimentos, David Miranda
Re: Lucene Concurrent Search
You can implement a ServletListener for your app and open the index there (in the contextInitialized method). You can then create the SearcherManager from the IndexReader/Searcher and store it in the ServletContext, where it can be fetched out by your REST servlets. This is a typical pattern that we use for lots of Web apps that use resources like Lucene. On Thu, Sep 5, 2013 at 12:05 PM, Ian Lea ian@gmail.com wrote: I use a singleton class but there are other ways in tomcat. Can't remember what - maybe application scope. -- Ian. On Thu, Sep 5, 2013 at 4:46 PM, David Miranda david.b.mira...@gmail.com wrote: Where I can initialize the SearchManager variable to after use it in the REST servlet to do research in the index? 2013/9/5 Ian Lea ian@gmail.com I think that blog post was bleeding edge and the API changed a bit subsequently. I use Directory dir = whatever; SearcherManager sm = new SearcherManager(dir, new SearcherFactory()); to get default behaviour. The javadocs for SearcherFactory explain that you can write your own implementation if you want custom behaviour such as warming. -- Ian. On Thu, Sep 5, 2013 at 3:53 PM, David Miranda david.b.mira...@gmail.com wrote: Hi, I'm trying to implement my code with SearchManager to make my app thread-safe. I'm follow this post: http://blog.mikemccandless.com/2011/09/lucenes-searchermanager-simplifies.html There is a class that implements SearchWarmer. I can't find this class in the Lucene library, what class is that? Thanks. 2013/9/5 Aditya findbestopensou...@gmail.com Hi You want to use REST service for your search, then my advice would be to use Solr. As it has buitl-in functionality of REST API. If you want to use Lucene then below are my comments: 1. In do search function, you are creating reader object. If this call is invoked for every query then it would be very expensive. You need to create it once globally and re opon it, if the index is modified. Its better use SearchManager. Regards Aditya www.findbestopensource.com - Search from 1 Million open source projects. On Thu, Sep 5, 2013 at 6:46 AM, David Miranda david.b.mira...@gmail.com wrote: Hi, I'm developing a web application, that contains a REST service in the Tomcat, that receives several requests per second. The REST requests do research in a Lucene index, to do this i use the IndexSearch. My questions are: - There are concurrency problems in multiple research? - What the best design pattern to do this? public class IndexResearch(){ private static int MAX_HITS = 500; private static String DIRECTORY = indexdir; private IndexSearcher searcher; private StandardAnalyzer analyzer; public IndexResearch(){ } public String doSearch(String text){ analyzer = new StandardAnalyzer(Version.LUCENE_43); topic = QueryParser.escape(topic); Query q = new QueryParser(Version.LUCENE_43, field, analyzer ).parse(text); File indexDirectory = new File(DIRECTORY); IndexReader reader; reader = DirectoryReader.open(FSDirectory.open(indexDirectory)); searcher = new IndexSearcher(reader); /*more code*/ } } Can I create, in the servlet, one object of this class per client request (Is that the best design pattern)? Thanks in advance. -- Cumprimentos, David Miranda - To unsubscribe, e-mail: java-user-unsubscr...@lucene.apache.org For additional commands, e-mail: java-user-h...@lucene.apache.org -- Cumprimentos, David Miranda - To unsubscribe, e-mail: java-user-unsubscr...@lucene.apache.org For additional commands, e-mail: java-user-h...@lucene.apache.org -- Stephen Green http://thesearchguy.wordpress.com
Lucene Concurrent Search
Hi, I'm developing a web application, that contains a REST service in the Tomcat, that receives several requests per second. The REST requests do research in a Lucene index, to do this i use the IndexSearch. My questions are: - There are concurrency problems in multiple research? - What the best design pattern to do this? public class IndexResearch(){ private static int MAX_HITS = 500; private static String DIRECTORY = indexdir; private IndexSearcher searcher; private StandardAnalyzer analyzer; public IndexResearch(){ } public String doSearch(String text){ analyzer = new StandardAnalyzer(Version.LUCENE_43); topic = QueryParser.escape(topic); Query q = new QueryParser(Version.LUCENE_43, field, analyzer ).parse(text); File indexDirectory = new File(DIRECTORY); IndexReader reader; reader = DirectoryReader.open(FSDirectory.open(indexDirectory)); searcher = new IndexSearcher(reader); /*more code*/ } } Can I create, in the servlet, one object of this class per client request (Is that the best design pattern)? Thanks in advance.