Doug Cutting wrote:

It would be good to improve the support for incremental crawling added to Nutch. Here are some ideas about how we might implement it. Andrzej has posted in the past about this, so he probably has better ideas.

Incremental crawling could proceed as follows:

1. Bootstrap with a batch crawl, using the 'crawl' command. Modify CrawlDatum to store the MD5Hash of the content of fetched urls.


Yes, this is required to detect unmodified content. A small note: plain MD5Hash(byte[] content) is quite ineffective for many pages, e.g. pages with a counter, or with ads. It would be good to provide a framework for other implementations of "page equality" - for now perhaps we should just say that this value is a byte[], and not specifically an MD5Hash.

Other additions to CrawlDatum for consideration:

* last modified time, not just the last fetched time - these two are different, and the fetching policy will depend on both. E.g. to synchronize with the page change cycle it is necessary to know the time of the previous modification seen by Nutch. I've done simulations, which show that if we don't track this value then the fetchInterval adjustments won't stabilize even if the page change cycle is fixed.

* segment name from the last updatedb. I'm not fully convinced about this, but consider the following:

I think this is needed in order to check which segments may be safely deleted, because there are no more active pages in them. If you enable a variable fetchInterval, then after a while you will end up with widely ranging intervals - some pages will have a daily or hourly period, some others will have a period of several months. Add to this the fact that you start counting the time for each page at different moments, and then the oldest page you have could be as old as maxFetchInterval (whatever that is, Float.MAX_VALUE or some other maximum you set). Most likely such old pages would live in segments with very little current data.

Now, you need to minimize the number of active segments (because of search performance and the time to deduplicate). However, with variable fetchInterval you no longer know which segments it is safe to delete. I imagine a tool could collect all segment names from CrawlDB, and prepare a list (segmentName, numRecords). Those segments that are not found on this list it would be safe to delete. Those segments that have few records could be processed to extract those records and move them to a single segment (and discard the rest of old segment data).

..

Alternatively, we could add Properties to CrawlDatum, and let people put whatever they wish there...


2. Reduce the fetch interval for high-scoring urls. If the default is monthly, then the top-scoring 1% of urls might be set to daily, and the top-scoring 10% of urls might be set to weekly.


In the original patchset I had a notion of pluggable FetchSchedule-s. I think this would be an ideal place to make such decisions. Implementations would be pluggable in a similar way as URLFilter, with the DefaultFetchSchedule doing what we do today.

3. Generate a fetch list & fetch it. When the url has been previously fetched, and its content is unchanged, increase its fetch interval by an amount, e.g., 50%. If the content is changed, decrease the fetch interval. The percentage of increase and decrease might be influenced by the url's score.


Again, that's the task for a FetchSchedule.

4. Update the crawl db & link db, index the new segment, dedup, etc. When updating the crawl db, scores for existing urls should not change, since the scoring method we're using (OPIC) assumes each page is fetched only once.


I would love to refactor this part too, to make the scoring mechanism abstracted in a similar way, so that you could plug in different scoring implementations. The float value in CrawlDatum is opaque enough to support different scoring mechanisms.

--
Best regards,
Andrzej Bialecki     <><
___. ___ ___ ___ _ _   __________________________________
[__ || __|__/|__||\/|  Information Retrieval, Semantic Web
___|||__||  \|  ||  |  Embedded Unix, System Integration
http://www.sigram.com  Contact: info at sigram dot com


Reply via email to