Hi Bram, > I have implemented a system where on page load the ten first results are > shown, and when a user clicks a button an Ajax request is sent, and the ten > next results are looked up and appended to HTML. This works great, especially > in cases where many hits are found.
I’m glad to hear it works! > However, this is still quite slow when you are querying for rare cases. > Therefore I am curious about your opinion on the following idea: > > What if you set the difference between $start and $end to 1, and immediately > return each hit, and fire the next ajax request? Before spending some more work here, I am interested in hearing what exactly is the bottleneck in your setup: * Have you done some simple performance tests? * Does it take most time to evaluate the query or to return results to the browser? * Would a query that returns single results really be faster than one that returns 10 results? * Do you sort your search results? If yes, returning 100 results instead of 10 should not be much slower. Thanks in advance Christian > -----Oorspronkelijk bericht----- > Van: Christian Grün [mailto:christian.gr...@gmail.com] > Verzonden: donderdag 21 april 2016 15:22 > Aan: Bram Vanroy | KU Leuven <bram.vanr...@student.kuleuven.be> > CC: BaseX <basex-talk@mailman.uni-konstanz.de> > Onderwerp: Re: [basex-talk] Querying Basex from a web interface > > PS: The current way to only return chunks of the result is to pass on the > index to the first and last result in your result, and to do the filtering in > XQuery: > > $results[position() = $start to $end] > > By returning one more result than requested, the client will know that there > will be more results. This may be helpful, because computing the total result > size is often much more expensive than returning only the first results. > > Does this help? > Christian > > > > On Thu, Apr 21, 2016 at 3:18 PM, Christian Grün <christian.gr...@gmail.com> > wrote: >> Hi Bram, >> >> Thanks for your query. This is just a quick response, but you could >> have a look at the new %rest:single annotation in BaseX [1]. Your >> feedback is welcome. >> >> Christian >> >> [1] http://docs.basex.org/wiki/RESTXQ#Query_Execution >> >> >> >> On Thu, Apr 21, 2016 at 3:11 PM, Bram Vanroy | KU Leuven >> <bram.vanr...@student.kuleuven.be> wrote: >>> Hello all >>> >>> >>> >>> I have been reading through many emails on this list and I’ve learnt >>> a lot about how Basex works and how others use it. A month or so back >>> I have sent an email myself to this list concerning caching. Even >>> though I have some more questions about that, I will leave that for >>> another time. Today I am concerned about retrieving chunked input from >>> Basex. >>> >>> >>> >>> (Question also found on StackOverflow, with a nice bounty! J >>> http://stackoverflow.com/questions/36675388/efficient-and-user-friend >>> ly-way-to-present-slow-loading-results) >>> >>> >>> >>> Case at hand: we use Basex to query a 50 million tokens corpus. We >>> also make this available to other users through a website. The thing >>> is that this is slow. For our own projects that’s no problem, we dive >>> straight into the back-end and run a search command from terminal and >>> let the query run for all the time it needs. However, for users it is >>> paramount that they get a quick response. At the moment it is taking >>> too long. I don’t blame BaseX. We love BaseX and are astounded by its >>> efficiency and optimisations! However, we want to deliver the best >>> user-experience to our users. >>> >>> >>> >>> We call a new session from PHP, wait to receive the results, do some >>> post-processing and then load the result page. As said, this takes >>> too much time. We’ve been looking into some solutions. The best one >>> that I think should be possible, is returning chunks of the results. >>> Do you know those websites that allow you to see results but only, >>> like, 20 per page? I think something similar is appropriate. When a >>> user has searched for a pattern, we only show the 20 or so first >>> results just so they can get an idea of the results they’d find. >>> Then, when they click a button, we should query for the twenty next >>> results which are then appended to the list (JavaScript solution I >>> guess), and so on. Until all results have been found. Additionally, I >>> will also provide a button from which users can download all results >>> in a text file. This is allowed to take a longer time. The main thing is >>> that users should get early feedback and results on their query. >>> >>> >>> >>> Now the question is if something like this is possible in an >>> efficient manner in BaseX. Can you form a query that only finds the >>> 20 first results, and then the following 20 and so on – and is this >>> faster than searching everything at once? In other words, when I am >>> searching for the results >>> 120-140 (after having pushed the button a couple of times), is BaseX >>> smart enough to skip the search space it has already done to find the >>> 120 previous hits? If so, that would be great. Could you help me on >>> my way, with some PHP/XQuery code that is suitable? >>> >>> >>> >>> I also highly encourage you to participate on StackOverflow. As I >>> said, I am offering a 200 bounty – for the people who are interested in >>> Internet fame. >>> J >>> >>> >>> >>> >>> >>> Thank you for your time >>> >>> >>> >>> Kind regards >>> >>> >>> >>> Bram Vanroy >>> >>> http://bramvanroy.be >