Damon,

Adding <searchable-expression> appears to have a big impact. Searching without 
it and looking at xdmp:query-meters() output, I get this:

<qm:link-cache-hits>8327</qm:link-cache-hits>
<qm:link-cache-misses>9921</qm:link-cache-misses>

But if I add <searchable-expression>, I get this:

<qm:link-cache-hits>123</qm:link-cache-hits>
<qm:link-cache-misses>6</qm:link-cache-misses>

Unfortunately, in reality we don't want to restrict our searches only to 
<page>, because each document includes metadata that must also be searchable -- 
title, author name, etc. That requirement of our application would seem to 
disallow the use of <searchable-expression>. Or is there some way around this 
-- perhaps through the use of fields?

Many thanks,
Greg


On May 22, 2012, at 3:05 PM, Damon Feldman wrote:

> Greg,
> 
> I suspect your algorithms are still searching for and finding snippets in 
> entire documents/books, rather than pages. Fragmenting on page allows you to 
> more efficiently load a smaller number of pages from a book, but you have to 
> explicitly work with pages to see the benefit. If you load a full book 
> document you'll get all the pages, and no benefit.
> 
> Adding a searchable-expression to the search:search options may help:
> 
> <searchable-expression xmlns:lib="http://digital.library.ptsem.edu/ia";> 
>  /lib:page
> </searchable-expression>
> 
> (above code not tested)
> This tells search:search to look for *and return* pages.
> 
> Yours,
> Damon
> 
> -----Original Message-----
> From: [email protected] 
> [mailto:[email protected]] On Behalf Of Murray, Gregory
> Sent: Tuesday, May 22, 2012 11:58 AM
> To: MarkLogic Developer Discussion
> Subject: Re: [MarkLogic Dev General] Efficient full-text searching and 
> snippeting
> 
> Mike,
> 
> Thanks very much for your quick reply. Clearly there are lots of good ideas 
> here. Our first plan of attack has been to set <page> as a fragment root and 
> reindex the database. Our 50,000 documents now consist of 18 million 
> fragments. Strangely, the situation appears to be even worse than before. The 
> query resolution time seems reasonable, but snippet processing is now several 
> times slower than it was before. We're using search:search(), and running a 
> typical query in QC gives these metrics:
> 
>  <search:metrics>
>    <search:query-resolution-time>PT0.093S</search:query-resolution-time>
>    <search:facet-resolution-time>PT0.109S</search:facet-resolution-time>
>    <search:snippet-resolution-time>PT6.582S</search:snippet-resolution-time>
>    <search:total-time>PT6.926S</search:total-time>
>  </search:metrics>
> 
> which makes me wonder if the snippet process is still bringing in the entire 
> document (book) rather than an individual fragment (page).
> 
> In case they're relevant, I should clarify a few things: Our document 
> structure includes a metadata element that stands outside of any <page> 
> element. Also, a typical page will contain about 1000 UTF-8 characters, which 
> is smaller than the optimal size range. And there are inevitably some blank 
> pages and thus some empty fragments. For example:
> 
> <doc xmlns="http://digital.library.ptsem.edu/ia";>
>  <metadata>
>    <id>1edhumanimmortalitjameuoft</id>
>    <name>James, William, 1842-1910.</name>
>    <title>Human immortality : two supposed objections to the doctrine</title>
>    <date>1898</date>
>    ...
>  </metadata>
>  <text type="ocr">
>    <page id="1edhumanimmortalitjameuoft_0001" absSeq="1"/>
>    <page id="1edhumanimmortalitjameuoft_0002" absSeq="2"/>
>    ...
>    <page id="1edhumanimmortalitjameuoft_0011" absSeq="11" 
> xmlns="http://digital.library.ptsem.edu/ia";>
>      HUMAN IMMORTALITY
>      Tis a matter unfortunately too often seen in history to call for much 
> remark,
>      ...
>    </page>
>  ...
>  </text>
> </doc>
> 
> Given that additional info -- do you have any thoughts on why snippeting 
> would be even slower than before fragmenting on <page>?
> 
> Many thanks,
> Greg
> 
> 
> On May 18, 2012, at 5:23 PM, Michael Blakeley wrote:
> 
>> That can be a tricky question to answer. The bottleneck may be disk or could 
>> also be CPU, since highlighting several MB of XML can use quite a few 
>> cycles. If you can establish that the bottleneck is CPU, it may be enough to 
>> extend your highlight code to set $cts:action to 'skip' or 'break' after the 
>> first few matches.
>> 
>> Otherwise your goal is to create documents or fragments that average 
>> something like the 1-100 kB. XML is messy so we cannot hit that number 
>> precisely, so do not take that target too literally. At the same time, make 
>> sure that the fragments are well-aligned with search and update requirements.
>> 
>> The simplest thing that might possibly work would be to fragment by page. I 
>> do not much like that answer myself: the sizes are reasonable, but 
>> paragraphs and sentences may cross page boundaries. Since search terms are 
>> indexed by fragment, that may cause problems. Imagine searching for "now is 
>> the time", but one of the potential matches crosses a page boundary. If the 
>> book is a single document and the page boundary is a phrase-through, there 
>> is no problem. But if each page is its own fragment root, then neither page 
>> will match the full query. Still, this option is worth considering and does 
>> not require much extra work because each book still looks like a single XML 
>> document.
>> 
>> Another common approach is to treat each book as a directory 
>> (http://blakeley.com/blogofile/2012/03/19/directory-assistance/), which 
>> contains one document for every top-level structural element. Usually these 
>> are chapters or something at a similar level. That limits the highlighting 
>> problem to a reasonable amount of XML, and searching chapters independently 
>> makes sense for most applications. Some chapters may be larger than others, 
>> but still smaller than the entire book. Crucially, they should be small 
>> enough to highlight comfortably. Reassembling the entire book can be as 
>> simple as having a toc.xml or manifest.xml in each directory.
>> 
>> Most book-oriented applications use one or the other of those approaches. 
>> There are also some clever algorithmic tricks involving cts:walk and 
>> cts:highlight together, and approaches using duplicated content for 
>> passage-oriented or sentence-oriented search. But these can be challenging 
>> to implement, and most applications can use one of the simpler designs 
>> outlined above.
>> 
>> -- Mike
>> 
>> On 18 May 2012, at 13:48 , Murray, Gregory wrote:
>> 
>>> Hello,
>>> 
>>> I'm working on a project based on full-text XML documents. Each document is 
>>> a digital representation of a book, containing a short metadata header but 
>>> consisting mainly of <page> elements, each of which contains a single text 
>>> node containing a blob of OCR'ed text. We now have 50,000 such documents 
>>> and are hitting performance/scaling problems. After some profiling, we've 
>>> concluded that searching isn't the problem but that snippeting is a major 
>>> culprit. At ML World, my colleagues and I asked Mary Holstege about this, 
>>> and she indicated that most likely I/O is the bottleneck, because each time 
>>> a document is processed it must be pulled from disk in its entirety, since 
>>> of course the <page> elements are not amenable to indexing. She suggested 
>>> breaking the monolithic documents into pieces, perhaps one XML document per 
>>> page. At that point, performing a search would involve the search itself 
>>> but also post-processing to assemble the results back into book-based 
>>> results for display t
 o
> 
> 
>> th
>>> e user.
>>> 
>>> I'm sure that would work well if I knew how to collate the page-level 
>>> search results into book-level results. I'm sure there are readers of this 
>>> list -- perhaps especially in publishing or government -- who work not just 
>>> with smaller, data-centric documents but also with large, full-text 
>>> documents. Is there a way to retain the integrity of the documents as 
>>> complete books and still have good performance? If not, and if we were to 
>>> split the books into pages, what's a good strategy for collating the 
>>> page-level search results so they still appear to be book-level results to 
>>> the user?
>>> 
>>> Many thanks,
>>> Greg
>>> 
>>> Gregory Murray
>>> Digital Library Application Developer
>>> Princeton Theological Seminary
>>> 
>>> _______________________________________________
>>> General mailing list
>>> [email protected]
>>> http://community.marklogic.com/mailman/listinfo/general
>>> 
>> 
>> _______________________________________________
>> General mailing list
>> [email protected]
>> http://community.marklogic.com/mailman/listinfo/general
> 
> _______________________________________________
> General mailing list
> [email protected]
> http://community.marklogic.com/mailman/listinfo/general
> _______________________________________________
> General mailing list
> [email protected]
> http://community.marklogic.com/mailman/listinfo/general

_______________________________________________
General mailing list
[email protected]
http://community.marklogic.com/mailman/listinfo/general

Reply via email to