diff --git a/defaults/yacy.init b/defaults/yacy.init index dcb81f7de..d4172ce96 100644 --- a/defaults/yacy.init +++ b/defaults/yacy.init @@ -762,6 +762,9 @@ search.navigation=hosts,authors,namespace,topics,filetype,protocol all search results are valid without verification search.verify = iffresh +search.excludehosts= +search.excludehosth= + # in case that a link verification fails then the corresponding index reference can be # deleted to clean up the index. If this property is set then failed index verification in # the cases of nocache, iffresh and ifexist causes an index deletion diff --git a/htroot/Bookmarks.java b/htroot/Bookmarks.java index 5b658437a..5a8fd21ef 100644 --- a/htroot/Bookmarks.java +++ b/htroot/Bookmarks.java @@ -197,14 +197,13 @@ public class Bookmarks { // try to get the bookmark from the LURL database final URIMetadataRow urlentry = sb.indexSegments.urlMetadata(Segments.Process.PUBLIC).load(ASCII.getBytes(urlHash)); if (urlentry != null) try { - final URIMetadataRow.Components metadata = urlentry.metadata(); - final Document document = Document.mergeDocuments(metadata.url(), null, sb.loader.loadDocuments(sb.loader.request(metadata.url(), true, false), CacheStrategy.IFEXIST, 5000, Integer.MAX_VALUE)); + final Document document = Document.mergeDocuments(urlentry.url(), null, sb.loader.loadDocuments(sb.loader.request(urlentry.url(), true, false), CacheStrategy.IFEXIST, 5000, Integer.MAX_VALUE)); prop.put("mode_edit", "0"); // create mode - prop.put("mode_url", metadata.url().toNormalform(false, true)); - prop.putHTML("mode_title", metadata.dc_title()); - prop.putHTML("mode_description", (document == null) ? metadata.dc_title(): document.dc_title()); - prop.putHTML("mode_author", metadata.dc_creator()); - prop.putHTML("mode_tags", (document == null) ? metadata.dc_subject() : document.dc_subject(',')); + prop.put("mode_url", urlentry.url().toNormalform(false, true)); + prop.putHTML("mode_title", urlentry.dc_title()); + prop.putHTML("mode_description", (document == null) ? urlentry.dc_title(): document.dc_title()); + prop.putHTML("mode_author", urlentry.dc_creator()); + prop.putHTML("mode_tags", (document == null) ? urlentry.dc_subject() : document.dc_subject(',')); prop.putHTML("mode_path",""); prop.put("mode_public", "0"); prop.put("mode_feed", "0"); //TODO: check if it IS a feed diff --git a/htroot/ConfigBasic.html b/htroot/ConfigBasic.html index 62a4dfce0..145ef5502 100644 --- a/htroot/ConfigBasic.html +++ b/htroot/ConfigBasic.html @@ -32,9 +32,11 @@
  • ok Select a language for the interface:
    -   -   - +   +   + + +
  • diff --git a/htroot/ConfigBasic.java b/htroot/ConfigBasic.java index e13636f8c..de9d9f92f 100644 --- a/htroot/ConfigBasic.java +++ b/htroot/ConfigBasic.java @@ -263,22 +263,15 @@ public class ConfigBasic { prop.putHTML("defaultName", sb.peers.mySeed().getName()); prop.putHTML("defaultPort", env.getConfig("port", "8090")); lang = env.getConfig("locale.language", "default"); // re-assign lang, may have changed + prop.put("lang_de", "0"); + prop.put("lang_fr", "0"); + prop.put("lang_cn", "0"); + prop.put("lang_ru", "0"); + prop.put("lang_en", "0"); if ("default".equals(lang)) { - prop.put("langDeutsch", "0"); - prop.put("langFrancais", "0"); - prop.put("langEnglish", "1"); - } else if ("fr".equals(lang)) { - prop.put("langDeutsch", "0"); - prop.put("langFrancais", "1"); - prop.put("langEnglish", "0"); - } else if ("de".equals(lang)) { - prop.put("langDeutsch", "1"); - prop.put("langFrancais", "0"); - prop.put("langEnglish", "0"); + prop.put("lang_en", "1"); } else { - prop.put("langDeutsch", "0"); - prop.put("langFrancais", "0"); - prop.put("langEnglish", "0"); + prop.put("lang_" + lang, "1"); } return prop; } diff --git a/htroot/ConfigPortal.html b/htroot/ConfigPortal.html index 369a19766..ba4b86885 100644 --- a/htroot/ConfigPortal.html +++ b/htroot/ConfigPortal.html @@ -109,12 +109,18 @@ +
    Exclude Hosts
    +
    List of hosts that shall be excluded from search results by default but can be included using the site:<host> operator:
    +
    + #[search.excludehosth]# +
    +
    'About' Column
    (shown in a column alongside
    with the search result page)
    (Headline)
    (Content)
    -
     
    +
     
       diff --git a/htroot/ConfigPortal.java b/htroot/ConfigPortal.java index 7e6379833..fe61eb69d 100644 --- a/htroot/ConfigPortal.java +++ b/htroot/ConfigPortal.java @@ -26,6 +26,7 @@ // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA import net.yacy.cora.protocol.RequestHeader; +import net.yacy.kelondro.data.meta.DigestURI; import net.yacy.search.Switchboard; import net.yacy.search.SwitchboardConstants; import de.anomic.data.WorkTables; @@ -93,6 +94,10 @@ public class ConfigPortal { sb.setConfig("about.headline", post.get("about.headline", "")); sb.setConfig("about.body", post.get("about.body", "")); + String excludehosts = post.get("search.excludehosts", ""); + sb.setConfig("search.excludehosts", excludehosts); + sb.setConfig("search.excludehosth", DigestURI.hosthashes(excludehosts)); + // construct navigation String String nav = ""; if (post.getBoolean("search.navigation.hosts", false)) nav += "hosts,"; @@ -126,8 +131,10 @@ public class ConfigPortal { sb.setConfig("search.result.show.pictures", false); sb.setConfig(SwitchboardConstants.SEARCH_VERIFY, "iffresh"); sb.setConfig(SwitchboardConstants.SEARCH_VERIFY_DELETE, "true"); - prop.put("about.headline", ""); - prop.put("about.body", ""); + sb.setConfig("about.headline", ""); + sb.setConfig("about.body", ""); + sb.setConfig("search.excludehosts", ""); + sb.setConfig("search.excludehosth", ""); } } @@ -167,6 +174,9 @@ public class ConfigPortal { prop.put("about.headline", sb.getConfig("about.headline", "")); prop.put("about.body", sb.getConfig("about.body", "")); + prop.put("search.excludehosts", sb.getConfig("search.excludehosts", "")); + prop.put("search.excludehosth", sb.getConfig("search.excludehosth", "")); + final String browserPopUpPage = sb.getConfig(SwitchboardConstants.BROWSER_POP_UP_PAGE, "ConfigBasic.html"); prop.put("popupFront", 0); prop.put("popupSearch", 0); diff --git a/htroot/CrawlResults.java b/htroot/CrawlResults.java index 9cdceff83..519f8cd0a 100644 --- a/htroot/CrawlResults.java +++ b/htroot/CrawlResults.java @@ -180,7 +180,6 @@ public class CrawlResults { String urlstr, urltxt; Seed initiatorSeed, executorSeed; URIMetadataRow urle; - URIMetadataRow.Components metadata; int cnt = 0; final Iterator> i = ResultURLs.results(tabletype); @@ -193,11 +192,9 @@ public class CrawlResults { Log.logWarning("PLASMA", "CrawlResults: URL not in index with url hash " + entry.getKey()); urlstr = null; urltxt = null; - metadata = null; continue; } - metadata = urle.metadata(); - urlstr = metadata.url().toNormalform(false, true); + urlstr = urle.url().toNormalform(false, true); urltxt = nxTools.shortenURLString(urlstr, 72); // shorten the string text like a URL initiatorSeed = entry.getValue() == null || entry.getValue().initiatorHash == null ? null : sb.peers.getConnected(ASCII.String(entry.getValue().initiatorHash)); @@ -236,11 +233,11 @@ public class CrawlResults { prop.put("table_indexed_" + cnt + "_showTitle", (showTitle) ? "1" : "0"); prop.put("table_indexed_" + cnt + "_showTitle_available", "1"); - if (metadata == null || metadata.dc_title() == null || metadata.dc_title().trim().length() == 0) + if (urle.dc_title() == null || urle.dc_title().trim().length() == 0) prop.put("table_indexed_" + cnt + "_showTitle_available_nodescr", "0"); else { prop.put("table_indexed_" + cnt + "_showTitle_available_nodescr", "1"); - prop.putHTML("table_indexed_" + cnt + "_showTitle_available_nodescr_urldescr", metadata.dc_title()); + prop.putHTML("table_indexed_" + cnt + "_showTitle_available_nodescr_urldescr", urle.dc_title()); } prop.put("table_indexed_" + cnt + "_showTitle_available_urlHash", entry.getKey()); @@ -250,13 +247,13 @@ public class CrawlResults { if (showCountry && urle != null) { prop.put("table_indexed_" + cnt + "_showCountry", "1"); - prop.put("table_indexed_" + cnt + "_showCountry_country", metadata.url().getLocale().getCountry()); + prop.put("table_indexed_" + cnt + "_showCountry_country", urle.url().getLocale().getCountry()); } else prop.put("table_indexed_" + cnt + "_showCountry", "0"); if (showIP && urle != null) { prop.put("table_indexed_" + cnt + "_showIP", "1"); - prop.put("table_indexed_" + cnt + "_showIP_ip", metadata.url().getInetAddress().getHostAddress()); + prop.put("table_indexed_" + cnt + "_showIP_ip", urle.url().getInetAddress().getHostAddress()); } else prop.put("table_indexed_" + cnt + "_showIP", "0"); diff --git a/htroot/IndexControlRWIs_p.java b/htroot/IndexControlRWIs_p.java index 619309d3d..8132b40f1 100644 --- a/htroot/IndexControlRWIs_p.java +++ b/htroot/IndexControlRWIs_p.java @@ -377,7 +377,7 @@ public class IndexControlRWIs_p if ( post.containsKey("keyhashsimilar") ) { try { final Iterator> containerIt = - segment.termIndex().referenceContainer(keyhash, true, 256, false).iterator(); + segment.termIndex().referenceContainer(keyhash, true, false, 256, false).iterator(); ReferenceContainer container; i = 0; int rows = 0, cols = 0; @@ -427,7 +427,7 @@ public class IndexControlRWIs_p final URIMetadataRow e = segment.urlMetadata().load(b); segment.urlMetadata().remove(b); if ( e != null ) { - url = e.metadata().url(); + url = e.url(); pw.println(url.getHost() + "/" + url.getFile()); for ( final String supportedBlacklistType : supportedBlacklistTypes ) { if ( ListManager.listSetContains( @@ -463,7 +463,7 @@ public class IndexControlRWIs_p final URIMetadataRow e = segment.urlMetadata().load(b); segment.urlMetadata().remove(b); if ( e != null ) { - url = e.metadata().url(); + url = e.url(); pw.println(url.getHost() + "/.*"); for ( final String supportedBlacklistType : supportedBlacklistTypes ) { if ( ListManager.listSetContains( @@ -530,10 +530,7 @@ public class IndexControlRWIs_p String us; long rn = -1; while ( !ranked.isEmpty() && (entry = ranked.takeURL(false, 1000)) != null ) { - if ( (entry == null) || (entry.metadata() == null) ) { - continue; - } - url = entry.metadata().url(); + url = entry.url(); if ( url == null ) { continue; } diff --git a/htroot/IndexControlURLs_p.java b/htroot/IndexControlURLs_p.java index b150c5d68..3c6f21d2e 100644 --- a/htroot/IndexControlURLs_p.java +++ b/htroot/IndexControlURLs_p.java @@ -158,7 +158,7 @@ public class IndexControlURLs_p { if (entry == null) { prop.putHTML("result", "No Entry for URL hash " + urlhash + "; nothing deleted."); } else { - urlstring = entry.metadata().url().toNormalform(false, true); + urlstring = entry.url().toNormalform(false, true); prop.put("urlstring", ""); sb.urlRemove(segment, urlhash.getBytes()); prop.putHTML("result", "Removed URL " + urlstring); @@ -210,7 +210,7 @@ public class IndexControlURLs_p { if (entry == null) { prop.putHTML("result", "No Entry for URL hash " + urlhash); } else { - prop.putHTML("urlstring", entry.metadata().url().toNormalform(false, true)); + prop.putHTML("urlstring", entry.url().toNormalform(false, true)); prop.putAll(genUrlProfile(segment, entry, urlhash)); prop.put("statistics", 0); } @@ -333,21 +333,20 @@ public class IndexControlURLs_p { prop.put("genUrlProfile_urlhash", urlhash); return prop; } - final URIMetadataRow.Components metadata = entry.metadata(); final URIMetadataRow le = (entry.referrerHash() == null || entry.referrerHash().length != Word.commonHashLength) ? null : segment.urlMetadata().load(entry.referrerHash()); - if (metadata == null || metadata.url() == null) { + if (entry.url() == null) { prop.put("genUrlProfile", "1"); prop.put("genUrlProfile_urlhash", urlhash); return prop; } prop.put("genUrlProfile", "2"); - prop.putHTML("genUrlProfile_urlNormalform", metadata.url().toNormalform(false, true)); + prop.putHTML("genUrlProfile_urlNormalform", entry.url().toNormalform(false, true)); prop.put("genUrlProfile_urlhash", urlhash); - prop.put("genUrlProfile_urlDescr", metadata.dc_title()); + prop.put("genUrlProfile_urlDescr", entry.dc_title()); prop.put("genUrlProfile_moddate", entry.moddate().toString()); prop.put("genUrlProfile_loaddate", entry.loaddate().toString()); prop.put("genUrlProfile_referrer", (le == null) ? 0 : 1); - prop.putHTML("genUrlProfile_referrer_url", (le == null) ? "" : le.metadata().url().toNormalform(false, true)); + prop.putHTML("genUrlProfile_referrer_url", (le == null) ? "" : le.url().toNormalform(false, true)); prop.put("genUrlProfile_referrer_hash", (le == null) ? "" : ASCII.String(le.hash())); prop.put("genUrlProfile_doctype", String.valueOf(entry.doctype())); prop.put("genUrlProfile_language", entry.language()); diff --git a/htroot/Supporter.java b/htroot/Supporter.java index 8ed8faa25..2abcabb14 100644 --- a/htroot/Supporter.java +++ b/htroot/Supporter.java @@ -34,8 +34,8 @@ import net.yacy.cora.date.GenericFormatter; import net.yacy.cora.document.ASCII; import net.yacy.cora.document.UTF8; import net.yacy.cora.protocol.RequestHeader; -import net.yacy.cora.ranking.ConcurrentScoreMap; -import net.yacy.cora.ranking.ScoreMap; +import net.yacy.cora.sorting.ConcurrentScoreMap; +import net.yacy.cora.sorting.ScoreMap; import net.yacy.kelondro.data.meta.DigestURI; import net.yacy.kelondro.index.Row; import net.yacy.kelondro.index.Row.Entry; diff --git a/htroot/Surftips.java b/htroot/Surftips.java index 9c5e9eeb5..fedae9b06 100644 --- a/htroot/Surftips.java +++ b/htroot/Surftips.java @@ -33,8 +33,8 @@ import java.util.Iterator; import net.yacy.cora.date.GenericFormatter; import net.yacy.cora.document.UTF8; import net.yacy.cora.protocol.RequestHeader; -import net.yacy.cora.ranking.ConcurrentScoreMap; -import net.yacy.cora.ranking.ScoreMap; +import net.yacy.cora.sorting.ConcurrentScoreMap; +import net.yacy.cora.sorting.ScoreMap; import net.yacy.kelondro.data.meta.DigestURI; import net.yacy.kelondro.index.Row; import net.yacy.kelondro.index.Row.Entry; diff --git a/htroot/ViewFile.java b/htroot/ViewFile.java index fb97741d0..08df8813b 100644 --- a/htroot/ViewFile.java +++ b/htroot/ViewFile.java @@ -117,14 +117,13 @@ public class ViewFile { // get the urlEntry that belongs to the url hash if (urlHash.length() > 0 && (urlEntry = indexSegment.urlMetadata().load(ASCII.getBytes(urlHash))) != null) { // get the url that belongs to the entry - final URIMetadataRow.Components metadata = urlEntry.metadata(); - if ((metadata == null) || (metadata.url() == null)) { + if (urlEntry == null || urlEntry.url() == null) { prop.put("error", "3"); prop.put("viewMode", VIEW_MODE_NO_TEXT); return prop; } - url = metadata.url(); - descr = metadata.dc_title(); + url = urlEntry.url(); + descr = urlEntry.dc_title(); //urlEntry.wordCount(); size = urlEntry.size(); pre = urlEntry.flags().get(Condenser.flag_cat_indexof); diff --git a/htroot/api/termlist_p.java b/htroot/api/termlist_p.java index f98c87002..4c3259535 100644 --- a/htroot/api/termlist_p.java +++ b/htroot/api/termlist_p.java @@ -27,7 +27,7 @@ import java.util.Iterator; import net.yacy.cora.document.ASCII; import net.yacy.cora.protocol.RequestHeader; -import net.yacy.cora.ranking.Rating; +import net.yacy.cora.sorting.Rating; import net.yacy.kelondro.index.Row; import net.yacy.kelondro.logging.Log; import net.yacy.search.Switchboard; @@ -50,7 +50,7 @@ public class termlist_p { segment = sb.indexSegments.segment(post.get("segment")); } if (segment == null) segment = sb.indexSegments.segment(Segments.Process.PUBLIC); - final Iterator> i = segment.termIndex().referenceCountIterator(null, false); + final Iterator> i = segment.termIndex().referenceCountIterator(null, false, false); Rating e; int c = 0, termnumber = 0; byte[] termhash, maxterm = null; diff --git a/htroot/api/yacydoc.java b/htroot/api/yacydoc.java index 71565d4bc..5bbbf33f4 100644 --- a/htroot/api/yacydoc.java +++ b/htroot/api/yacydoc.java @@ -87,29 +87,28 @@ public class yacydoc { final URIMetadataRow entry = segment.urlMetadata().load(urlhash.getBytes()); if (entry == null) return prop; - final URIMetadataRow.Components metadata = entry.metadata(); - if (metadata.url() == null) { + if (entry.url() == null) { return prop; } final URIMetadataRow le = (entry.referrerHash() == null || entry.referrerHash().length != Word.commonHashLength) ? null : segment.urlMetadata().load(entry.referrerHash()); - prop.putXML("dc_title", metadata.dc_title()); - prop.putXML("dc_creator", metadata.dc_creator()); + prop.putXML("dc_title", entry.dc_title()); + prop.putXML("dc_creator", entry.dc_creator()); prop.putXML("dc_description", ""); // this is the fulltext part in the surrogate - prop.putXML("dc_subject", metadata.dc_subject()); - prop.putXML("dc_publisher", metadata.dc_publisher()); + prop.putXML("dc_subject", entry.dc_subject()); + prop.putXML("dc_publisher", entry.dc_publisher()); prop.putXML("dc_contributor", ""); prop.putXML("dc_date", ISO8601Formatter.FORMATTER.format(entry.moddate())); prop.putXML("dc_type", String.valueOf(entry.doctype())); - prop.putXML("dc_identifier", metadata.url().toNormalform(false, true)); + prop.putXML("dc_identifier", entry.url().toNormalform(false, true)); prop.putXML("dc_language", ASCII.String(entry.language())); - prop.put("geo_lat", metadata.lat()); - prop.put("geo_long", metadata.lon()); + prop.put("geo_lat", entry.lat()); + prop.put("geo_long", entry.lon()); - prop.put("yacy_urlhash", metadata.url().hash()); + prop.put("yacy_urlhash", entry.url().hash()); prop.putXML("yacy_loaddate", entry.loaddate().toString()); prop.putXML("yacy_referrer_hash", (le == null) ? "" : ASCII.String(le.hash())); - prop.putXML("yacy_referrer_url", (le == null) ? "" : le.metadata().url().toNormalform(false, true)); + prop.putXML("yacy_referrer_url", (le == null) ? "" : le.url().toNormalform(false, true)); prop.put("yacy_size", entry.size()); prop.put("yacy_words",entry.wordCount()); diff --git a/htroot/api/ymarks/add_ymark.java b/htroot/api/ymarks/add_ymark.java index ce61e9267..c34520514 100644 --- a/htroot/api/ymarks/add_ymark.java +++ b/htroot/api/ymarks/add_ymark.java @@ -35,7 +35,7 @@ public class add_ymark { if(post.containsKey("urlHash")) { final String urlHash = post.get("urlHash",YMarkUtil.EMPTY_STRING); - final DigestURI url = sb.indexSegments.segment(Segments.Process.PUBLIC).urlMetadata().load(urlHash.getBytes()).metadata().url(); + final DigestURI url = sb.indexSegments.segment(Segments.Process.PUBLIC).urlMetadata().load(urlHash.getBytes()).url(); final String folders = post.get(YMarkEntry.BOOKMARK.FOLDERS.key(),YMarkEntry.BOOKMARK.FOLDERS.deflt()); final String tags = post.get(YMarkEntry.BOOKMARK.TAGS.key(),YMarkUtil.EMPTY_STRING); try { diff --git a/htroot/yacy/crawlReceipt.java b/htroot/yacy/crawlReceipt.java index a4567cfa4..fabcabe00 100644 --- a/htroot/yacy/crawlReceipt.java +++ b/htroot/yacy/crawlReceipt.java @@ -33,8 +33,8 @@ import net.yacy.cora.document.ASCII; import net.yacy.cora.protocol.RequestHeader; import net.yacy.kelondro.data.meta.URIMetadataRow; import net.yacy.kelondro.logging.Log; -import net.yacy.peers.Seed; import net.yacy.peers.Protocol; +import net.yacy.peers.Seed; import net.yacy.search.Switchboard; import net.yacy.search.index.Segments; import de.anomic.crawler.ResultURLs; @@ -125,15 +125,14 @@ public final class crawlReceipt { return prop; } - final URIMetadataRow.Components metadata = entry.metadata(); - if (metadata.url() == null) { + if (entry.url() == null) { if (log.isWarning()) log.logWarning("crawlReceipt: RECEIVED wrong RECEIPT (url null) for hash " + ASCII.String(entry.hash()) + " from peer " + iam + "\n\tURL properties: "+ propStr); prop.put("delay", "3600"); return prop; } // check if the entry is in our network domain - final String urlRejectReason = sb.crawlStacker.urlInAcceptedDomain(metadata.url()); + final String urlRejectReason = sb.crawlStacker.urlInAcceptedDomain(entry.url()); if (urlRejectReason != null) { if (log.isWarning()) log.logWarning("crawlReceipt: RECEIVED wrong RECEIPT (" + urlRejectReason + ") for hash " + ASCII.String(entry.hash()) + " from peer " + iam + "\n\tURL properties: "+ propStr); prop.put("delay", "9999"); @@ -145,7 +144,7 @@ public final class crawlReceipt { sb.indexSegments.urlMetadata(Segments.Process.RECEIPTS).store(entry); ResultURLs.stack(entry, youare.getBytes(), iam.getBytes(), EventOrigin.REMOTE_RECEIPTS); sb.crawlQueues.delegatedURL.remove(entry.hash()); // the delegated work has been done - if (log.isInfo()) log.logInfo("crawlReceipt: RECEIVED RECEIPT from " + otherPeerName + " for URL " + ASCII.String(entry.hash()) + ":" + metadata.url().toNormalform(false, true)); + if (log.isInfo()) log.logInfo("crawlReceipt: RECEIVED RECEIPT from " + otherPeerName + " for URL " + ASCII.String(entry.hash()) + ":" + entry.url().toNormalform(false, true)); // ready for more prop.put("delay", "10"); diff --git a/htroot/yacy/search.java b/htroot/yacy/search.java index a5bfc0aee..580142489 100644 --- a/htroot/yacy/search.java +++ b/htroot/yacy/search.java @@ -41,9 +41,9 @@ import net.yacy.cora.document.RSSMessage; import net.yacy.cora.protocol.Domains; import net.yacy.cora.protocol.HeaderFramework; import net.yacy.cora.protocol.RequestHeader; -import net.yacy.cora.ranking.ScoreMap; -import net.yacy.cora.ranking.WeakPriorityBlockingQueue; import net.yacy.cora.services.federated.yacy.CacheStrategy; +import net.yacy.cora.sorting.ScoreMap; +import net.yacy.cora.sorting.WeakPriorityBlockingQueue; import net.yacy.kelondro.data.meta.DigestURI; import net.yacy.kelondro.data.word.WordReference; import net.yacy.kelondro.data.word.WordReferenceFactory; @@ -244,6 +244,7 @@ public final class search { null, false, sitehash, + null, authorhash, DigestURI.TLD_any_zone_filter, client, @@ -305,6 +306,7 @@ public final class search { constraint, false, sitehash, + null, authorhash, DigestURI.TLD_any_zone_filter, client, diff --git a/htroot/yacy/transferURL.java b/htroot/yacy/transferURL.java index fa8ab98e2..944c96d00 100644 --- a/htroot/yacy/transferURL.java +++ b/htroot/yacy/transferURL.java @@ -34,10 +34,10 @@ import net.yacy.cora.document.RSSMessage; import net.yacy.cora.protocol.RequestHeader; import net.yacy.kelondro.data.meta.URIMetadataRow; import net.yacy.kelondro.logging.Log; -import net.yacy.peers.Seed; import net.yacy.peers.EventChannel; -import net.yacy.peers.Protocol; import net.yacy.peers.Network; +import net.yacy.peers.Protocol; +import net.yacy.peers.Seed; import net.yacy.repository.Blacklist; import net.yacy.search.Switchboard; import net.yacy.search.index.Segments; @@ -108,8 +108,7 @@ public final class transferURL { } // check if entry is well-formed - final URIMetadataRow.Components metadata = lEntry.metadata(); - if (metadata == null || metadata.url() == null) { + if (lEntry.url() == null) { Network.log.logWarning("transferURL: received invalid URL from peer " + otherPeerName + "\n\tURL Property: " + urls); blocked++; continue; @@ -123,28 +122,28 @@ public final class transferURL { } // check if the entry is blacklisted - if ((blockBlacklist) && (Switchboard.urlBlacklist.isListed(Blacklist.BLACKLIST_DHT, metadata.url()))) { - if (Network.log.isFine()) Network.log.logFine("transferURL: blocked blacklisted URL '" + metadata.url().toNormalform(false, true) + "' from peer " + otherPeerName); + if ((blockBlacklist) && (Switchboard.urlBlacklist.isListed(Blacklist.BLACKLIST_DHT, lEntry.url()))) { + if (Network.log.isFine()) Network.log.logFine("transferURL: blocked blacklisted URL '" + lEntry.url().toNormalform(false, true) + "' from peer " + otherPeerName); lEntry = null; blocked++; continue; } // check if the entry is in our network domain - final String urlRejectReason = sb.crawlStacker.urlInAcceptedDomain(metadata.url()); + final String urlRejectReason = sb.crawlStacker.urlInAcceptedDomain(lEntry.url()); if (urlRejectReason != null) { - if (Network.log.isFine()) Network.log.logFine("transferURL: blocked URL '" + metadata.url() + "' (" + urlRejectReason + ") from peer " + otherPeerName); + if (Network.log.isFine()) Network.log.logFine("transferURL: blocked URL '" + lEntry.url() + "' (" + urlRejectReason + ") from peer " + otherPeerName); lEntry = null; blocked++; continue; } // write entry to database - if (Network.log.isFine()) Network.log.logFine("Accepting URL " + i + "/" + urlc + " from peer " + otherPeerName + ": " + lEntry.metadata().url().toNormalform(true, false)); + if (Network.log.isFine()) Network.log.logFine("Accepting URL " + i + "/" + urlc + " from peer " + otherPeerName + ": " + lEntry.url().toNormalform(true, false)); try { sb.indexSegments.urlMetadata(Segments.Process.DHTIN).store(lEntry); ResultURLs.stack(lEntry, iam.getBytes(), iam.getBytes(), EventOrigin.DHT_TRANSFER); - if (Network.log.isFine()) Network.log.logFine("transferURL: received URL '" + metadata.url().toNormalform(false, true) + "' from peer " + otherPeerName); + if (Network.log.isFine()) Network.log.logFine("transferURL: received URL '" + lEntry.url().toNormalform(false, true) + "' from peer " + otherPeerName); received++; } catch (final IOException e) { Log.logException(e); diff --git a/htroot/yacy/urls.java b/htroot/yacy/urls.java index eb1493f04..e01f091fb 100644 --- a/htroot/yacy/urls.java +++ b/htroot/yacy/urls.java @@ -112,7 +112,6 @@ public class urls { final int count = urlhashes.length() / 12; int c = 0; URIMetadataRow entry; - URIMetadataRow.Components metadata; DigestURI referrer; for (int i = 0; i < count; i++) { entry = sb.indexSegments.urlMetadata(Segments.Process.PUBLIC).load(ASCII.getBytes(urlhashes.substring(12 * i, 12 * (i + 1)))); @@ -120,12 +119,11 @@ public class urls { // find referrer, if there is one referrer = sb.getURL(Segments.Process.PUBLIC, entry.referrerHash()); // create RSS entry - metadata = entry.metadata(); - prop.put("item_" + c + "_title", metadata.dc_title()); - prop.putXML("item_" + c + "_link", metadata.url().toNormalform(true, false)); + prop.put("item_" + c + "_title", entry.dc_title()); + prop.putXML("item_" + c + "_link", entry.url().toNormalform(true, false)); prop.putXML("item_" + c + "_referrer", (referrer == null) ? "" : referrer.toNormalform(true, false)); - prop.putXML("item_" + c + "_description", metadata.dc_title()); - prop.put("item_" + c + "_author", metadata.dc_creator()); + prop.putXML("item_" + c + "_description", entry.dc_title()); + prop.put("item_" + c + "_author", entry.dc_creator()); prop.put("item_" + c + "_pubDate", GenericFormatter.SHORT_SECOND_FORMATTER.format(entry.moddate())); prop.put("item_" + c + "_guid", ASCII.String(entry.hash())); c++; diff --git a/htroot/yacysearch.java b/htroot/yacysearch.java index 7ae89fa42..82da766b3 100644 --- a/htroot/yacysearch.java +++ b/htroot/yacysearch.java @@ -534,18 +534,17 @@ public class yacysearch { final String recommendHash = post.get("recommendref", ""); // urlhash final URIMetadataRow urlentry = indexSegment.urlMetadata().load(UTF8.getBytes(recommendHash)); if (urlentry != null) { - final URIMetadataRow.Components metadata = urlentry.metadata(); Document[] documents = null; try { - documents = sb.loader.loadDocuments(sb.loader.request(metadata.url(), true, false), CacheStrategy.IFEXIST, 5000, Integer.MAX_VALUE); + documents = sb.loader.loadDocuments(sb.loader.request(urlentry.url(), true, false), CacheStrategy.IFEXIST, 5000, Integer.MAX_VALUE); } catch (final IOException e) { } catch (final Parser.Failure e) { } if (documents != null) { // create a news message final Map map = new HashMap(); - map.put("url", metadata.url().toNormalform(false, true).replace(',', '|')); - map.put("title", metadata.dc_title().replace(',', ' ')); + map.put("url", urlentry.url().toNormalform(false, true).replace(',', '|')); + map.put("title", urlentry.dc_title().replace(',', ' ')); map.put("description", documents[0].dc_title().replace(',', ' ')); map.put("author", documents[0].dc_creator()); map.put("tags", documents[0].dc_subject(' ')); @@ -564,9 +563,8 @@ public class yacysearch { final String bookmarkHash = post.get("bookmarkref", ""); // urlhash final URIMetadataRow urlentry = indexSegment.urlMetadata().load(UTF8.getBytes(bookmarkHash)); if (urlentry != null) { - final URIMetadataRow.Components metadata = urlentry.metadata(); try { - sb.tables.bookmarks.createBookmark(sb.loader, metadata.url(), YMarkTables.USER_ADMIN, true, "searchresult", "/search"); + sb.tables.bookmarks.createBookmark(sb.loader, urlentry.url(), YMarkTables.USER_ADMIN, true, "searchresult", "/search"); } catch (final Throwable e) { } } @@ -618,6 +616,7 @@ public class yacysearch { constraint, true, sitehash, + DigestURI.hosthashess(sb.getConfig("search.excludehosth", "")), authorhash, DigestURI.TLD_any_zone_filter, client, diff --git a/htroot/yacysearchtrailer.java b/htroot/yacysearchtrailer.java index ec5fd48a0..d7522b6fb 100644 --- a/htroot/yacysearchtrailer.java +++ b/htroot/yacysearchtrailer.java @@ -27,7 +27,7 @@ import java.util.Iterator; import net.yacy.cora.protocol.RequestHeader; -import net.yacy.cora.ranking.ScoreMap; +import net.yacy.cora.sorting.ScoreMap; import net.yacy.document.LibraryProvider; import net.yacy.kelondro.util.EventTracker; import net.yacy.kelondro.util.Formatter; diff --git a/locales/cn.lng b/locales/cn.lng index c7331e2ad..91f6b143e 100755 --- a/locales/cn.lng +++ b/locales/cn.lng @@ -30,7 +30,7 @@ Server Access Overview==网站访问概况 This is a list of \#\[num\]\# requests to the local http server within the last hour.==最近一小时内有 #[num]# 个到本地的访问请求. This is a list of requests to the local http server within the last hour.==此列表显示最近一小时内到本机的访问请求. Showing \#\[num\]\# requests.==显示 #[num]# 个请求. ->Host<==>主机< +#>Host<==>Host< >Path<==>路径< Date<==日期< Access Count During==访问时间 @@ -39,13 +39,13 @@ last Minute==最近1 分 last 10 Minutes==最近10 分 last Hour==最近1 小时 The following hosts are registered as source for brute-force requests to protected pages==以下主机作为保护页面强制请求的源 ->Host==>主机 +#>Host==>Host Access Times==访问时间 Server Access Details==服务器访问细节 Local Search Log==本地搜索日志 Local Search Host Tracker==本地搜索主机跟踪 Remote Search Log==远端搜索日志 -Total:==所有: +#Total:==Total: Success:==成功: Remote Search Host Tracker==远端搜索跟踪 This is a list of searches that had been requested from this\' peer search interface==此列表显示从远端peer所进行的搜索 @@ -58,7 +58,7 @@ Used Time \(ms\)==消耗时间(毫秒) URL fetch \(ms\)==获取URL(毫秒) Snippet comp \(ms\)==片段比较(毫秒) Query==查询字符 ->User Agent<==>用户端信息< +#>User Agent<==>User Agent< Search Word Hashes==搜索字哈希值 Count==计数 Queries Per Last Hour==小时平均查询 @@ -92,7 +92,7 @@ Blacklist Pattern==黑名单规则 Edit selected pattern\(s\)==编辑选中规则 Delete selected pattern\(s\)==删除选中规则 Move selected pattern\(s\) to==移动选中规则 -You can select them here for deletion==您可以从这里选择要删除的项 +#You can select them here for deletion==您可以从这里选择要删除的项 Add new pattern:==添加新规则: "Add URL pattern"=="添加URL规则" The right \'\*\', after the \'\/\', can be replaced by a regex.== 在 '/' 后边的 '*' ,可用正则表达式表示. @@ -188,7 +188,7 @@ Comments==评论 Blog-Home==博客主页 Author:==作者: Subject:==标题: -Text:==内容: +#Text:==Text: You can use==您可以用 Yacy-Wiki Code==YaCy-Wiki 代码 here.==. @@ -209,7 +209,7 @@ Confirm deletion==确定删除 Yes, delete it.==是, 删除. No, leave it.==不, 保留. Import was successful!==导入成功! -Import failed, maybe the supplied file was no valid blog-backup?==导入失败, 可能提供的文件不是有效的博客副本? +Import failed, maybe the supplied file was no valid blog-backup?==导入失败, 可能提供的文件不是有效的博客备份? Please select the XML-file you want to import:==请选择您想导入的XML文件: #----------------------------- @@ -223,7 +223,7 @@ delete==删除 allow==允许 Author:==作者: Subject:==标题: -Text:==内容: +#Text:==Text: You can use==您可以用 Yacy-Wiki Code==YaCy-Wiki 代码 here.==在这里. @@ -250,7 +250,7 @@ Import HTML Bookmarks==导入HTML书签 "import"=="导入" Default Tags:==默认标签 imported==已导入 -Edit Bookmark==编辑书签 +#Edit Bookmark==编辑书签 #URL:==URL: Title:==标题: Description:==描述: @@ -272,14 +272,14 @@ Edit==编辑 Delete==删除 Folders==目录 Bookmark Folder==书签目录 -Tags==标签 +#Tags==标签 Bookmark List==书签列表 previous page==前一页 next page==后一页 All==所有 Show==显示 Bookmarks per page.==每页书签. -unsorted==默认排序 +#unsorted==默认排序 #----------------------------- #File: Collage.html @@ -340,7 +340,7 @@ Save User==保存用户 #File: ConfigAppearance_p.html #--------------------------- Appearance and Integration==外观界面 -You can change the appearance of the YaCy interface with skins.==您可以在这里修改Yacy的外观界面. +You can change the appearance of the YaCy interface with skins.==您可以在这里修改YaCy的外观界面. #You can change the appearance of YaCy with skins==Sie können hier das Erscheinungsbild von YaCy mit Skins ändern The selected skin and language also affects the appearance of the search page.==选择的皮肤和语言也会影响到搜索页面的外观. If you create a search portal with YaCy then you can==如果您创建YaCy门户, @@ -368,7 +368,7 @@ The generic skin \'generic_pd\' can be configured here with custom colors:==能 >Search Headline<==>搜索页面 标题< >Search URL==>搜索页面 链接< "Set Colors"=="设置颜色" ->Skin Download<==>下载皮肤< +#>Skin Download<==>下载皮肤< Skins can be installed from download locations==安装下载皮肤 Install new skin from URL==从URL安装皮肤 Use this skin==使用这个皮肤 @@ -383,9 +383,9 @@ Error saving the skin.==保存皮肤时出错. #--------------------------- Access Configuration==访问设置 Basic Configuration==基本设置 -Your YaCy Peer needs some basic information to operate properly==您的Yacy Peer需要一些基本信息才能工作 +Your YaCy Peer needs some basic information to operate properly==您的YaCy Peer需要一些基本信息才能工作 Select a language for the interface==选择界面语言 -Use Case: what do you want to do with YaCy:==用途: 您用Yacy做什么: +Use Case: what do you want to do with YaCy:==用途: 您用YaCy做什么: Community-based web search==基于社区的网络搜索 Join and support the global network \'freeworld\', search the web with an uncensored user-owned search network==加入并支持全球网络 'freeworld', 自由地搜索. Search portal for your own web pages==属于您自己的搜索引擎 @@ -412,8 +412,8 @@ What you should do next:==下一步您该做的: Your basic configuration is complete! You can now \(for example\)==配置成功, 您现在可以 just <==开始< start an uncensored search==自由地搜索了 -start your own crawl and contribute to the global index, or create your own private web index==开始您的索引, 并将其贡献给全球索引, 或者创建一个您自己的私人搜索网页 -set a personal peer profile \(optional settings\)==设置私人peer (可选项) +start your own crawl and contribute to the global index, or create your own private web index==开始您的索引, 并将其贡献给全球索引, 或者创建一个您自己的私有搜索网页 +set a personal peer profile \(optional settings\)==设置私有peer (可选项) monitor at the network page what the other peers are doing==监视网络页面, 以及其他peer的活动 Your Peer name is a default name; please set an individual peer name.==您的peer名称为系统默认, 请设置另外一个名称. You did not set a user name and/or a password.==您未设置用户名和/或密码. @@ -487,8 +487,8 @@ might overwrite existing data if a file of the same name exists already.==, 旧 #File: ConfigLiveSearch.html #--------------------------- -Integration of a Search Field for Live Search==搜索栏集成即搜即得 -A \'Live-Search\' input field that reacts as search-as-you-type in a pop-up window can easily be integrated in any web page=='即搜即得'输入栏: 即当您在搜索栏键入关键字时, 会在网页中弹出搜索对话框按钮 +Integration of a Search Field for Live Search==搜索栏集成: 即时搜索 +A \'Live-Search\' input field that reacts as search-as-you-type in a pop-up window can easily be integrated in any web page=='即时搜索'输入栏: 即当您在搜索栏键入关键字时, 会在网页中弹出搜索对话框按钮 This is the same function as can be seen on all pages of the YaCy online-interface \(look at the window in the upper right corner\)==当您在线使用YaCy时, 您会在搜索页面看到相应功能(页面右上角) Just use the code snippet below to integrate that in your own web pages==将以下代码添加到您的网页中 Please check if the address, as given in the example \'\#\[ip\]\#\:\#\[port\]\#\' here is correct and replace it with more appropriate values if necessary==对于形如 '#[ip]#:#[port]#' 的地址, 请用具体值来替换 @@ -556,7 +556,7 @@ This enables automated, DHT-ruled Index Transmission to other peers==自动向 disabled during crawling==在crawl时关闭 disabled during indexing==在索引时关闭 >Index Receive==>接收索引 -Accept remote Index Transmissions==接受远端索引传递 +Accept remote Index Transmissions==接受远程索引传递 This works only if you have a senior peer. The DHT-rules do not work without this function==仅当您拥有更上级peer时有效. 如果未设置此项, DHT规则不生效 >reject==>拒绝 accept transmitted URLs that match your blacklist==接受符合黑名单的URL @@ -657,7 +657,7 @@ Default Pop-Up Page<==默认弹出页面< >Search Front Page==>搜索首页 >Search Page \(small header\)==>搜索页面(二级标题) >Interactive Search Page==>交互搜索页面 -Default index.html Page \(by forwarder\)==默认index.html(前向指定) +Default index.html Page \(by forwarder\)==默认index.html(前者指定) Target for Click on Search Results==点击搜索结果时 \"_blank\" \(new window\)=="_blank" (新窗口) @@ -833,8 +833,8 @@ Sending Client==发送主机 #File: CrawlProfileEditor_p.html #--------------------------- >Crawl Profile Editor<==>Crawl文件编辑< ->Crawler Steering<==>Crawler引导< ->Crawl Scheduler<==>Crawl安排< +>Crawler Steering<==>Crawler向导< +>Crawl Scheduler<==>定期Crawl< >Scheduled Crawls can be modified in this table<==>请在下表中修改已安排的crawl< Crawl profiles hold information about a crawl process that is currently ongoing.==Crawl文件里保存有正在运行的crawl进程信息. @@ -882,7 +882,7 @@ DHT Transfer==DHT转移 Proxy Use==Proxy使用 Local Crawling==本地crawl Global Crawling==全球crawl -Surrogate Import==替代品导入 +Surrogate Import==导入备份 >Crawl Results Overview<==>Crawl结果一览< These are monitoring pages for the different indexing queues.==索引队列监视页面. YaCy knows 5 different ways to acquire web indexes. The details of these processes \(1-5\) are described within the submenu's listed==YaCy使用5种不同的方式来获取网络索引. 进程(1-5)的细节在子菜单中显示 @@ -890,7 +890,7 @@ above which also will show you a table with indexing results so far. The informa so you need to log-in with your administration password.==所以您最好设置一个有密码的管理员账户来查看. Case \(6\) is a monitor of the local receipt-generator, the opposed case of \(1\). It contains also an indexing result monitor but is not considered private==事件(6)与事件(1)相反, 显示本地回执. 它也包含索引结果, 但不属于隐私 since it shows crawl requests from other peers.==因为它含有来自其他peer的请求. -Case \(7\) occurs if surrogate files are imported==如果导入了替代品, 则事件(7)发生. +Case \(7\) occurs if surrogate files are imported==如果备份被导入, 则事件(7)发生. The image above illustrates the data flow initiated by web index acquisition.==上图为网页索引的数据流. Some processes occur double to document the complex index migration structure.==一些进程可能出现双重文件索引结构混合的情况. \(1\) Results of Remote Crawl Receipts==(1) 远程crawl回执结果 @@ -911,8 +911,8 @@ the logic of the Global Distributed Hash Table.==您的peer是最适合存储它 Use Case: This list may fill if you check the 'Index Receive'-flag on the 'Index Control' page==用法:当您选中了在'索引控制'里的'接收索引'时, 这个表会被填充. \(4\) Results for Proxy Indexing==(4) 代理索引结果 These web pages had been indexed as result of your proxy usage.==以下是由于使用代理而索引的网页. -No personal or protected page is indexed==不包括私人或受保护网页 -such pages are detected by Cookie-Use or POST-Parameters \(either in URL or as HTTP protocol\)==通过检测cookie用途和提交参数(链接中或者HTTP协议)能够识别出此类网页, +No personal or protected page is indexed==不包括私有或受保护网页 +such pages are detected by Cookie-Use or POST-Parameters \(either in URL or as HTTP protocol\)==通过检测cookie用途和提交参数(链接或者HTTP协议)能够识别出此类网页, and automatically excluded from indexing.==并在索引时自动排除. Use Case: You must use YaCy as proxy to fill up this table.==用法:必须把YaCy用作代理才能填充此表格. Set the proxy settings of your browser to the same port as given==将浏览器代理端口设置为 @@ -926,8 +926,8 @@ This is the 'mirror'-case of process \(1\).==这是进程(1)的'镜像'实例. Use Case: This list may fill if you check the 'Accept remote crawling requests'-flag on the 'Index Crate' page==用法:如果您选中了'索引创建'页面的'接受远端crawl请求', 则会在此列表中显示. The stack is empty.==栈为空. Statistics about \#\[domains\]\# domains in this stack:==此栈显示有关 #[domains]# 域的数据: -\(7\) Results from surrogates import==\(7\) 替代品导入结果 -These records had been imported from surrogate files in DATA/SURROGATES/in==这些记录从 DATA/SURROGATES/in 中的替代文件中导入 +\(7\) Results from surrogates import==\(7\) 备份导入结果 +These records had been imported from surrogate files in DATA/SURROGATES/in==这些记录从 DATA/SURROGATES/in 中的备份文件中导入 Use Case: place files with dublin core metadata content into DATA/SURROGATES/in or use an index import method==用法:将包含Dublin核心元数据的文件放在 DATA/SURROGATES/in 中, 或者使用索引导入方式 \(i.e. MediaWiki import, OAI-PMH retrieval\)==(例如 MediaWiki 导入, OAI-PMH 导入\) #Domain==Domain @@ -947,60 +947,60 @@ Showing latest \#\[count\]\# lines from a stack of \#\[all\]\# entries.==显示 #File: CrawlStartExpert_p.html #--------------------------- -Expert Crawl Start==Experten Crawl Start -Start Crawling Job:==Starte Crawling Aufgabe: -You can define URLs as start points for Web page crawling and start crawling here. \"Crawling\" means that YaCy will download the given website, extract all links in it and then download the content behind these links. This is repeated as long as specified under \"Crawling Depth\".==Sie können hier URLs angeben, die gecrawlt werden sollen und dann das Crawling starten. "Crawling" bedeutet, dass YaCy die angegebene Webseite runterlädt, alle Links extrahiert und dann den Inhalt hinter diesen Links runterlädt. Dies wird solange wiederholt wie unter "Crawling Tiefe" angegeben. -Attribute<==Attribut< -Value<==Wert< -Description<==Beschreibung< ->Starting Point:==>Startpunkt: ->From URL==>Von URL -From Sitemap==Von Sitemap -From File==Von Datei -Existing start URLs are always re-crawled.==Existierende Start-URLs werden immer wieder gecrawled. -Other already visited URLs are sorted out as \"double\", if they are not allowed using the re-crawl option.==Andere bereits besuchte Seiten werden als 'doppelt' aussortiert, wenn diese nicht ausdrücklich per Re-crawl Option zugelassen wurden. -Create Bookmark==Lesezeichen erstellen -\(works with "Starting Point: From URL" only\)==(funktioniert nur mit "Startpunkt von URL") -Title<==Titel< -Folder<==Ordner< -This option lets you create a bookmark from your crawl start URL.==Diese Option gibt Ihnen die Möglichkeit ein Lesezeichen aus Ihrer Crawl Start URL zu erstellen. -Crawling Depth==Crawling-Tiefe -This defines how often the Crawler will follow links \(of links..\) embedded in websites.==Dies definiert, wie oft der Crawler eingebetteten Links (von Links ...) in Webseiten folgen wird. -0 means that only the page you enter under \"Starting Point\" will be added==0 bedeutet, dass nur die Seite unter "Startpunkt" -to the index. 2-4 is good for normal indexing. Values over 8 are not useful, since a depth-8 crawl will==dem Index zugefügt wird. 2-4 ist gut für normales Indexieren. Werte über 8 sind nicht nützlich, denn eine Suche mit Suchtiefe 8 würde -index approximately 25.600.000.000 pages, maybe this is the whole WWW.==ungefähr 25.600.000.000 Seiten indexieren, vielleicht sogar das ganze WWW. -Scheduled re-crawl<==Geplanter Re-Crawl< ->no doubles<==>Keine Dubletten< -run this crawl once and never load any page that is already known, only the start-url may be loaded again.==Führe diesen Crawl einmalig aus und lade niemals eine schon bekannte Seite nach. Nur die URL unter Startpunkt darf noch einmal geladen werden. ->re-load<==>Nachladen< -run this crawl once, but treat urls that are known since==führe diesen Crawl einmalig aus aber behandle URLs die bereits seit ->years<==>Jahre< ->months<==>Monate< ->days<==>Tage< ->hours<==>Stunden< -not as double and load them again. No scheduled re-crawl.==bekannt sind nicht als Dubletten und lade sie erneut. ->scheduled<==>Geplant< -after starting this crawl, repeat the crawl every==Nach dem Start dieses Crawls, führe ihn jede -> automatically.==> automatisch aus. -A web crawl performs a double-check on all links found in the internet against the internal database. If the same url is found again,==Ein Web Crawl führt eine Dubletten Prüfung anhand einer internen Datenbank gegen alle im Internet gefunden Links durch. Wenn dieselbe URL wieder gefunden wird, -then the url is treated as double when you check the \'no doubles\' option. A url may be loaded again when it has reached a specific age,==wird die URL als Dublette behandelt wenn die 'Keine Doubletten' Option ausgewählt wurde. Eine URL kann noch einmal geladen werden wenn sie ein bestimmtes Alter erreicht hat. -to use that check the \'re-load\' option. When you want that this web crawl is repeated automatically, then check the \'scheduled\' option.==Dafür kann die 'Nachladen' Option verwendet werden. Wenn der Web Crawl automatisch wiederholt werden soll, kann die 'Geplant' Option ausgewählt werden. -In this case the crawl is repeated after the given time and no url from the previous crawl is omitted as double.==In diesem Fall wird der Crawl erneut nach der eingestellten Zeit ausgeführt und keine URL aus einem vorhergegangenem Crawl wird als Dublette ausgelassen. -Must-Match Filter==Muss-entsprechen Filter -Use filter==Filter nutzen -Restrict to start domain==Auf Startdomain beschränken -Restrict to sub-path==Auf Sub-Pfad beschränken +Expert Crawl Start==Crawl高级设置 +Start Crawling Job:==开始Crawl任务: +You can define URLs as start points for Web page crawling and start crawling here. \"Crawling\" means that YaCy will download the given website, extract all links in it and then download the content behind these links. This is repeated as long as specified under \"Crawling Depth\".==您可以将指定URL作为网页crawling的起始点. "Crawling"意即YaCy会下载指定的网站, 并解析出网站中链接的所有内容, 其深度由"Crawling深度"指定. +Attribute<==属性< +Value<==值< +Description<==描述< +>Starting Point:==>起始点: +>From URL==>来自URL +From Sitemap==来自站点地图 +From File==来自文件 +Existing start URLs are always re-crawled.==已存在的起始链接将会被重新crawl. +Other already visited URLs are sorted out as \"double\", if they are not allowed using the re-crawl option.==对于已经访问过的链接, 如果它们不允许被重新crawl,则被标记为'重复'. +Create Bookmark==创建书签 +\(works with "Starting Point: From URL" only\)==(仅从"起始链接"开始) +Title<==标题< +Folder<==目录< +This option lets you create a bookmark from your crawl start URL.==此选项会将起始链接设为书签. +Crawling Depth==Crawling深度 +This defines how often the Crawler will follow links \(of links..\) embedded in websites.==此选项为crawler跟踪网站嵌入链接的深度. +0 means that only the page you enter under \"Starting Point\" will be added==设置为 0 代表仅将"起始点" +to the index. 2-4 is good for normal indexing. Values over 8 are not useful, since a depth-8 crawl will==添加到索引. 建议设置为2-4. 由于设置为8会索引将近25,000,000,000个页面, 所以不建议设置大于8的值, +index approximately 25.600.000.000 pages, maybe this is the whole WWW.==这可能是整个互联网的内容. +Scheduled re-crawl<==已安排的重新Crawl< +>no doubles<==>无 重复< +run this crawl once and never load any page that is already known, only the start-url may be loaded again.==仅运行一次crawl, 并且不载入重复网页, 可能会重载起始链接. +>re-load<==>重载< +run this crawl once, but treat urls that are known since==运行此crawl, 但是将链接视为从 +>years<==>年< +>months<==>月< +>days<==>日< +>hours<==>时< +not as double and load them again. No scheduled re-crawl.==不重复并重新载入. 无安排的crawl任务. +>scheduled<==>定期< +after starting this crawl, repeat the crawl every==运行此crawl后, 每隔 +> automatically.==> 运行. +A web crawl performs a double-check on all links found in the internet against the internal database. If the same url is found again,==网页crawl参照自身数据库, 对所有找到的链接进行重复性检查. 如果链接重复, +then the url is treated as double when you check the \'no doubles\' option. A url may be loaded again when it has reached a specific age,==并且'无重复'选项打开, 则被以重复链接对待. 如果链接存在时间超过一定时间, +to use that check the \'re-load\' option. When you want that this web crawl is repeated automatically, then check the \'scheduled\' option.==并且'重载'选项打开, 则此链接会被重新读取. 当您想这些crawl自动运行时, 请选中'定期'选项. +In this case the crawl is repeated after the given time and no url from the previous crawl is omitted as double.==此种情况下, crawl会每隔一定时间自动运行并且不会重复寻找前一次crawl中的链接. +Must-Match Filter==必须与过滤器匹配 +Use filter==使用过滤器 +Restrict to start domain==限制为起始域 +Restrict to sub-path==限制为子路经 #The filter is an emacs-like regular expression that must match with the URLs which are used to be crawled;==Dieser Filter ist ein emacs-ähnlicher regulärer Ausdruck, der mit den zu crawlenden URLs übereinstimmen muss; -The filter is a regular expression==Dieser Filter ist ein Regulärer Ausdruck -that must match with the URLs which are used to be crawled; default is \'catch all\'.==der auf die zum Crawlen verwendeten URLs zutreffen muss. Die Standard Einstellung ist 'alle zulassen'. -Example: to allow only urls that contain the word \'science\', set the filter to \'.*science.*\'.==Beispiel: Um nur URLs zuzulassen, die das Wort 'Wissenschaft' beeinhalten, setzen Sie den Filter auf '.*Wissenschaft.*'. -You can also use an automatic domain-restriction to fully crawl a single domain.==Sie können aber auch eine automatische Domain-Beschränkung benutzen, um eine einzelne Domain komplett zu crawlen. -Must-Not-Match Filter==Muss-nicht-entsprechen Filter -This filter must not match to allow that the page is accepted for crawling.==Dieser Filter muss nicht passen, um zu erlauben, dass die Seite zum crawlen akzeptiert wird. -The empty string is a never-match filter which should do well for most cases.==Ein leeres Feld ist ein niemals-passend Filter, der in den meisten Fällen gute Dienste leisten sollte. -If you don't know what this means, please leave this field empty.==Wenn Sie nicht wissen, was dies bedeutet, lassen Sie das Feld einfach leer. +The filter is a regular expression==过滤是一组正则表达式 +that must match with the URLs which are used to be crawled; default is \'catch all\'.==, 它们表示了要抓取的链接规则; 默认是'抓取所有'. +Example: to allow only urls that contain the word \'science\', set the filter to \'.*science.*\'.==比如: 如果仅抓取包含'科学'的链接, 可将过滤器设置为 '.*.*'. +You can also use an automatic domain-restriction to fully crawl a single domain.==您也可以使用域限制来抓取整个域. +Must-Not-Match Filter==必须与过滤器不匹配 +This filter must not match to allow that the page is accepted for crawling.==此过滤器表示了所有不被抓取的网页规则. +The empty string is a never-match filter which should do well for most cases.==对于大多数情况可以留空. +If you don't know what this means, please leave this field empty.==如果您不知道这些设置的意义, 请将此留空. #Re-crawl known URLs:==Re-crawl bekannter URLs: -Use:==Benutzen: +Use:==使用: #It depends on the age of the last crawl if this is done or not: if the last crawl is older than the given==Es hängt vom Alter des letzten Crawls ab, ob dies getan oder nicht getan wird: wenn der letzte Crawl älter als das angegebene #Auto-Dom-Filter:==Auto-Dom-Filter: #This option will automatically create a domain-filter which limits the crawl on domains the crawler==Diese Option erzeugt automatisch einen Domain-Filter der den Crawl auf die Domains beschränkt , @@ -1008,388 +1008,388 @@ Use:==Benutzen: #restricting the crawl on only those domains that appear on the bookmark-page. The adequate depth==und dann den folgenden Crawl automatisch auf die Domains zu beschränken, die in der Bookmarkliste vorkamen. Die einzustellende Tiefe für #for this example would be 1.==dieses Beispiel wäre 1. #The default value 0 gives no restrictions.==Der Vorgabewert 0 bedeutet, dass nichts eingeschränkt wird. -Maximum Pages per Domain:==Maximale Seiten pro Domain: -Page-Count==Seitenanzahl -You can limit the maximum number of pages that are fetched and indexed from a single domain with this option.==Sie können die maximale Anzahl an Seiten, die von einer einzelnen Domain gefunden und indexiert werden, mit dieser Option begrenzen. -You can combine this limitation with the 'Auto-Dom-Filter', so that the limit is applied to all the domains within==Sie können diese Option auch mit dem 'Auto-Dom-Filter' kombinieren, so dass das Limit für alle Domains mit der -the given depth. Domains outside the given depth are then sorted-out anyway.==angegebenen Tiefe gilt. Domains ausserhalb der angegebenen Tiefe werden einfach aussortiert. -Accept URLs with==Akzeptiere URLs mit -dynamic URLs==dynamische URLs -A questionmark is usually a hint for a dynamic page. URLs pointing to dynamic content should usually not be crawled. However, there are sometimes web pages with static content that==Ein Fragezeichen ist normalerweise ein Hinweis auf eine dynamische Seite. URLs mit dynamischem Inhalt sollten normalerweise nicht gecrawlt werden. Wie auch immer, manchmal gibt es Seiten mit festem Inhalt, die -is accessed with URLs containing question marks. If you are unsure, do not check this to avoid crawl loops.==nur von URLs zu erreichen sind, die ein Fragezeichen enthalten. Wenn Sie unsicher sind, aktivieren Sie diese Funktion nicht, um Crawl Schleifen zu vermeiden. -Store to Web Cache==Speichern im Web-Cache -This option is used by default for proxy prefetch, but is not needed for explicit crawling.==Diese Option ist standardmäßig beim Proxy aktiviert, wird aber zum reinen Crawlen nicht gebraucht. - -Policy for usage of Web Cache==Regeln für die Nutzung des Web Caches -The caching policy states when to use the cache during crawling:==Die Caching Regeln legen fest wann der Cache während des Crawlen verwendet wird: +Maximum Pages per Domain:==每个域允许的最多页面: +Page-Count==页面计数 +You can limit the maximum number of pages that are fetched and indexed from a single domain with this option.==您可以将从单个域中抓取和索引的页面数目限制为此值. +You can combine this limitation with the 'Auto-Dom-Filter', so that the limit is applied to all the domains within==您可以将此设置与'Auto-Dom-Filter'结合起来, 以限制给定深度中所有域. +the given depth. Domains outside the given depth are then sorted-out anyway.==超出深度范围的域会被自动忽略. +Accept URLs with==接受链接 +dynamic URLs==动态URL +A questionmark is usually a hint for a dynamic page. URLs pointing to dynamic content should usually not be crawled. However, there are sometimes web pages with static content that==动态页面通常用问号标记. 通常不会抓取指向动态页面的链接. 然而, 也有些含有静态内容的页面用问号标记. +is accessed with URLs containing question marks. If you are unsure, do not check this to avoid crawl loops.==如果您不确定, 不要选中此项, 以防抓取时陷入死循环. +Store to Web Cache==存储到网页缓存 +This option is used by default for proxy prefetch, but is not needed for explicit crawling.==这个选项默认打开, 并用于预抓取, 但对于精确抓取此选项无效. + +Policy for usage of Web Cache==网页缓存使用策略 +The caching policy states when to use the cache during crawling:==缓存策略即表示抓取时何时使用缓存: #no cache==no cache -no cache==kein Cache +no cache==无 缓存 #if fresh==if fresh -if fresh==bei frischem Cache Hit +if fresh==如果 有更新 缓存 命中 #if exist==if exist -if exist==bei Cache Hit +if exist==如果 缓存 命中 #cache only==cache only -cache only==nur Cache -never use the cache, all content from fresh internet source;==Den Cache nie verwenden, allen Inhalt frisch von der Online Quelle -use the cache if the cache exists and is fresh using the proxy-fresh rules;==Verwende den Cache, wenn ein Treffer im Cache existiert und dieser aktuell ist. -use the cache if the cache exist. Do no check freshness. Otherwise use online source;==Verwende den Cache, wenn ein Treffer existiert ohne die Aktualität zu prüfen. Andernfalls verwende die Quelle online; -never go online, use all content from cache. If no cache exist, treat content as unavailable==Gehe niemals online, verwende nur den Cache Inhalt. Wenn kein Cache existiert, behandle den Inhalt als nicht verfügbar - -Do Local Indexing:==Lokales Indexieren: -index text==Indexiere Text -index media==Indexiere Medien -This enables indexing of the wepages the crawler will download. This should be switched on by default, unless you want to crawl only to fill the==Dies aktiviert die Indexierung von Webseiten, die der Crawler runterlädt. Dies sollte standardmässig aktiviert sein, ausser Sie wollen den -Document Cache without indexing.==Dokumenten Cache ohne Indexierung füllen. -Do Remote Indexing==Nutze Remote Indexierung -Describe your intention to start this global crawl \(optional\)==Beschreiben Sie warum Sie diesen globalen Crawl starten (optional) -This message will appear in the 'Other Peer Crawl Start' table of other peers.==Diese Nachricht wird bei anderen Peers in der 'Anderer Peer Crawl Start' Tabelle angezeigt. -If checked, the crawler will contact other peers and use them as remote indexers for your crawl.==Wenn aktiviert, wird der Crawler mit anderen Peers Kontakt aufnehmen und diese als Remote Indexierer für Ihren Crawl benutzen. -If you need your crawling results locally, you should switch this off.==Wenn Sie die Crawling Ergebnisse lokal benötigen, sollten Sie diese Funktion deaktivieren. -Only senior and principal peers can initiate or receive remote crawls.==Nur Senior und Principal Peers können einen remote Crawl initiieren oder erhalten. -A YaCyNews message will be created to inform all peers about a global crawl==Eine Nachricht wird im YaCy News Bereich angezeigt, um alle Peers von diesem globalen Crawl zu informieren -so they can omit starting a crawl with the same start point.==damit sie es vermeiden können, einen Crawl vom selben Startpunkt zu starten. -Exclude static Stop-Words==Statische Stop-Words ausschließen -This can be useful to circumvent that extremely common words are added to the database, i.e. \"the\", \"he\", \"she\", \"it\"... To exclude all words given in the file yacy.stopwords from indexing,==Dies ist sinnvoll, um zu verhindern, dass extrem häufig vorkommende Wörter wie z.B. "der", "die", "das", "und", "er", "sie" etc in die Datenbank aufgenommen werden. Um alle Wörter von der Indexierung auszuschließen, die in der Datei yacy.stopwords enthalten sind, -check this box.==aktivieren Sie diese Box. -"Start New Crawl"=="Neuen Crawl starten" +cache only==仅 缓存 +never use the cache, all content from fresh internet source;==从不使用缓存内容, 全部从因特网资源即时抓取; +use the cache if the cache exists and is fresh using the proxy-fresh rules;==如果缓存中存在并且是最新则使用代理刷新规则; +use the cache if the cache exist. Do no check freshness. Otherwise use online source;==如果缓存存在则使用缓存. 不检查是否最新. 否则使用最新源; +never go online, use all content from cache. If no cache exist, treat content as unavailable==从不检查线上内容, 全部使用缓存内容. 如果缓存存在, 将其视为无效 + +Do Local Indexing:==本地索引: +index text==索引文本 +index media==索引媒体 +This enables indexing of the wepages the crawler will download. This should be switched on by default, unless you want to crawl only to fill the==此选项开启时, crawler会下载网页索引. 默认打开, 除非您仅要填充 +Document Cache without indexing.==文件缓存而不进行索引. +Do Remote Indexing==远程索引 +Describe your intention to start this global crawl \(optional\)==在这填入您要进行全球crawl的目的(可选) +This message will appear in the 'Other Peer Crawl Start' table of other peers.==此消息会显示在其他peer的'其他peer crawl起始'列表中. +If checked, the crawler will contact other peers and use them as remote indexers for your crawl.==如果选中, crawler会联系其他peer, 并将其作为此次crawl的远程索引器. +If you need your crawling results locally, you should switch this off.==如果您仅想crawl本地内容, 请关闭此设置. +Only senior and principal peers can initiate or receive remote crawls.==仅高级peer和主peer能初始化或者接收远程crawl. +A YaCyNews message will be created to inform all peers about a global crawl==YaCy新闻消息中会通知其他peer这个全球crawl, +so they can omit starting a crawl with the same start point.==然后他们才能以相同起始点进行crawl. +Exclude static Stop-Words==排除静态非索引字 +This can be useful to circumvent that extremely common words are added to the database, i.e. \"the\", \"he\", \"she\", \"it\"... To exclude all words given in the file yacy.stopwords from indexing,==此项用于规避极常用字, 比如 "个", "他", "她", "它"等. 当要在索引时排除所有在yacy.stopwords文件中的字词时, +check this box.==请选中此项. +"Start New Crawl"=="开始新crawl" #----------------------------- #File: CrawlStartIntranet_p.html #--------------------------- #Intranet Crawl Start==Intranet Crawl Start -When an index domain is configured to contain intranet links,==Wenn eine Index Domain konfiguriert wurde die Intranet Links enthält, -the intranet may be scanned for available servers.==kann dieses Intranet auf verfügbare Server gescannt werden. -Please select below the servers in your intranet that you want to fetch into the search index.==Bitte in der folgenden Server Liste aus Ihrem Intranet auswählen, welche Sie in den Suchindex aufnehmen wollen. -This network definition does not allow intranet links.==Diese Netzwerk Konfiguration erlaubt keine Intranet Links. -A list of intranet servers is only available if you confiugure YaCy to index intranet targets.==Eine Liste mit Servern aus dem Intranet ist nur verfügbar, wenn Sie YaCy auch konfiguriert haben Intranetseiten zu indexieren. -To do so, open the Basic Configuration servlet and select the \'Intranet Indexing\' use case.==Um diese Einstellung vorzunehmen, bitte im Servlet Basis Konfiguration den Anwendungsfall 'Intranet Indexierung' auswählen. -Available Intranet Server==Verfügbare Intranet Server +When an index domain is configured to contain intranet links,==当索引域中包含局域网链接时, +the intranet may be scanned for available servers.==可用服务器会扫描它们. +Please select below the servers in your intranet that you want to fetch into the search index.==以下服务器在您的局域网中, 请选择您想添加到搜索索引中的主机. +This network definition does not allow intranet links.==当前网络定义不允许局域网链接. +A list of intranet servers is only available if you confiugure YaCy to index intranet targets.==仅当您将YaCy配置为索引局域网目标, 以下条目才有效. +To do so, open the Basic Configuration servlet and select the \'Intranet Indexing\' use case.==将YaCy配置为索引局域网目标, 打开基本设置页面, 选中'索引局域网'. +Available Intranet Server==可用局域网服务器 #>IP<==>IP< #>URL<==>URL< ->Process<==>Status< ->not in index<==>Nicht im Index< ->indexed<==>Indexiert< -"Add Selected Servers to Crawler"=="Füge ausgewählte Server zum Crawler hinzu" +>Process<==>状态< +>not in index<==>不在索引中< +>indexed<==>已加入索引< +"Add Selected Servers to Crawler"=="添加选中服务器到crawler" #----------------------------- #File: CrawlStartScanner_p.html #--------------------------- -Network Scanner==Netzwerk Scanner -YaCy can scan a network segment for available http, ftp and smb server.==YaCy kann ein Netzwerksegment auf verfügbare HTTP, FTP und SMB Server hin absuchen. -You must first select a IP range and then, after this range is scanned,==Sie müssen zuerst einen IP Bereich festlegen und dann, nachdem dieser Bereich gescannt wurde, -it is possible to select servers that had been found for a full-site crawl.==ist es möglich einen gefunden Server für eine volle Seiten Suche crawlen zu lassen. +Network Scanner==网络扫描器 +YaCy can scan a network segment for available http, ftp and smb server.==YaCy可扫描http, ftp 和smb服务器. +You must first select a IP range and then, after this range is scanned,==须先指定IP范围, 再进行扫描, +it is possible to select servers that had been found for a full-site crawl.==才有可能选择主机并将其作为全站crawl的服务器. No servers had been detected in the given IP range \#\[iprange\]\#. -Please enter a different IP range for another scan.==Bitte geben Sie einen anderen IP Bereich ein für einen weiteren Scan. -Please wait...==Bitte warten... ->Scan the network<==>Das Netzwerk Scannen< -Scan Range==Scan Bereich -Scan sub-range with given host==Scanne Unterbereich von angegebenen Host aus -Full Intranet Scan:==Voller Intranet Scan: -Do not use intranet scan results, you are not in an intranet environment!==Verwenden Sie nicht die Intranet Scan Resultate, da sie sich nicht in einer Intranet Umgebung befinden! ->Scan Cache<==>Scan Cache< -accumulate scan results with access type \"granted\" into scan cache \(do not delete old scan result\)==Sammle Scan Ergebnisse mit dem Zugriffstyp "granted" im Scan Cache (Lösche keine alten Scan Ergebnisse) ->Service Type<==>Service Typ< +Please enter a different IP range for another scan.==未检测到可用服务器, 请重新指定IP范围. +Please wait...==请稍候... +>Scan the network<==>扫描网络< +Scan Range==扫描范围 +Scan sub-range with given host==扫描给定主机的子域 +Full Intranet Scan:==局域网完全扫描: +Do not use intranet scan results, you are not in an intranet environment!==由于您当前不处于局域网环境, 请不要使用局域网扫描结果! +>Scan Cache<==>扫描缓存< +accumulate scan results with access type \"granted\" into scan cache \(do not delete old scan result\)==使用"已授权"的缓存以加速扫描(不要删除上次扫描结果) +>Service Type<==>服务类型< #>ftp==>FTP #>smb==>SMB #>http==>HTTP #>https==>HTTPS ->Scheduler<==>Scan Planung< -run only a scan==Nur einmalig Scannen -scan and add all sites with granted access automatically. This disables the scan cache accumulation.==Scannen und alle Webseiten mit erlaubtem Zugriff automatisch hinzufügen. Diese Einstellungen deaktiviert die Scan Cache Ansammlung. -Look every==Überprüfe alle ->minutes<==>Minuten< ->hours<==>Stunden< ->days<==>Tage< -again and add new sites automatically to indexer.==wieder und füge neue Seiten automatisch zum Indexer hinzu. -Sites that do not appear during a scheduled scan period will be excluded from search results.==Seiten die nicht im Laufe eines geplanten Scans auftauchen werden von den Suchergebnissen ausgeschlossen. -"Scan"=="Scannen" -The following servers had been detected:==Die folgenden Server wurden entdeckt: -Available server within the given IP range==Verfügbare Server innerhalb des angegebenen IP Bereichs ->Protocol<==>Protokoll< +>Scheduler<==>定期扫描< +run only a scan==运行一次扫描 +scan and add all sites with granted access automatically. This disables the scan cache accumulation.==扫描并自动添加已授权站点. 此选项会关闭缓存扫描加速. +Look every==每隔 +>minutes<==>分< +>hours<==>时< +>days<==>天< +again and add new sites automatically to indexer.==再次检视, 并自动添加新站点到索引器中. +Sites that do not appear during a scheduled scan period will be excluded from search results.==周期扫描中未上线的站点会被自动排除. +"Scan"=="扫描" +The following servers had been detected:==已检测到以下服务器: +Available server within the given IP range==指定IP范围内的可用服务器 +>Protocol<==>协议< #>IP<==>IP< #>URL<==>URL< ->Access<==>Zugriff< ->Process<==>Prozess< ->unknown<==>unbekannt< ->empty<==>leer< ->granted<==>erlaubt< ->denied<==>verweigert< ->not in index<==>nicht im Index< ->indexed<==>indexiert< -"Add Selected Servers to Crawler"=="Füge ausgewählte Server zum Crawlen hinzu" +>Access<==>权限< +>Process<==>状态< +>unknown<==>未知< +>empty<==>空< +>granted<==>已授权< +>denied<==>拒绝< +>not in index<==>未在索引中< +>indexed<==>已被索引< +"Add Selected Servers to Crawler"=="添加选中服务器到crawler" #----------------------------- #File: CrawlStartSite_p.html #--------------------------- ->Site Crawling<==>Seiten Crawlen< -Site Crawler:==Seiten Crawler: -Download all web pages from a given domain or base URL.==Downloaden aller Webseiten von einer gegebenen Domain oder Basis URL. ->Site Crawl Start<==>Seiten Crawl Start< ->Site<==>Seite< -Link-List of URL==Link Liste der URL ->Scheduler<==>Zeitplanung< -run this crawl once==führe diesen Crawl nur einmalig aus -scheduled, look every==geplant, überprüfe alle ->minutes<==>Minuten< ->hours<==>Stunden< ->days<==>Tage< -for new documents automatically.==automatisch auf neue Dokument. ->Path<==>Pfad< -load all files in domain==Lade alle Dateien in der Domäne -load only files in a sub-path of given url==Lade nur Dateien in einem Unterpfad der angegebenen URL ->Limitation<==>Einschränkungen< -not more than <==nicht mehr als < ->documents<==>Dokumente< ->Dynamic URLs<==>Dynamische URLs< -allow <==erlaube < -urls with a \'\?\' in the path==URLs mit einem '?' im Pfad +>Site Crawling<==>crawl站点< +Site Crawler:==站点crawler: +Download all web pages from a given domain or base URL.==下载给定域或者URL里的所有网页. +>Site Crawl Start<==>起始crawl站点< +>Site<==>站点< +Link-List of URL==URL链接表 +>Scheduler<==>定时器< +run this crawl once==运行此crawl +scheduled, look every==每 +>minutes<==>分钟< +>hours<==>小时< +>days<==>天< +for new documents automatically.==, 以自动查找新文件. +>Path<==>路径< +load all files in domain==载入域中所有文件 +load only files in a sub-path of given url==仅载入给定URL子路径中文件 +>Limitation<==>限制< +not more than <==不超过< +>documents<==>文件< +>Dynamic URLs<==>动态URL< +allow <==允许< +urls with a \'\?\' in the path==路径中含有'?' #>Start<==>Start< -"Start New Crawl"=="Starte neuen Crawl" -Hints<==Hinweise< ->Crawl Speed Limitation<==>Einschränkung der Crawl Geschwindigkeit< -No more that two pages are loaded from the same host in one second \(not more that 120 document per minute\) to limit the load on the target server.==Es werden nicht mehr als 2 Seiten pro Sekunde vom selben Host geladen (nicht mehr als 120 Dokumente per Minute), um die Last auf den Zielserver zu minimieren. ->Target Balancer<==>Ziel Balancer< -A second crawl for a different host increases the throughput to a maximum of 240 documents per minute since the crawler balances the load over all hosts.==Ein zweiter Crawl für einen anderen Host erhöht den Durchsatz auf ein Maximum von 240 Dokumenten pro Minute weil der der Crawler Balancer die Last über alle Hosts verteilt. ->High Speed Crawling<==>Hochgeschwindigkeits Crawlen< -A \'shallow crawl\' which is not limited to a single host \(or site\)==Ein 'oberflächlicher Crawl' der nicht auf einen einzelnen Host (oder eine Seite) limitiert ist -can extend the pages per minute \(ppm\) rate to unlimited documents per minute when the number of target hosts is high.==kann die Anzahl der Seiten pro Minute (ppm) auf unendlich viele Dokumente pro Minute erweitern wenn die Anzahl der Ziel Hosts hoch ist. -This can be done using the Expert Crawl Start servlet.==Das kann erreicht werden durch Verwendung des Crawl Start (Expert) Servlets. ->Scheduler Steering<==>Geplante Steuerung< -The scheduler on crawls can be changed or removed using the API Steering.==Die geplante Ausführung von Crawls kann geändert oder entfernt werden mit der API Aktionen Steuerung. +"Start New Crawl"=="开始新crawl" +Hints<==提示< +>Crawl Speed Limitation<==>crawl速度限制< +No more that two pages are loaded from the same host in one second \(not more that 120 document per minute\) to limit the load on the target server.==每秒最多从同一主机中载入两个页面(每分钟不超过120个文件)以限制目标主机负载. +>Target Balancer<==>目标平衡器< +A second crawl for a different host increases the throughput to a maximum of 240 documents per minute since the crawler balances the load over all hosts.==对于不同主机的二次crawl, 会上升到每分钟最多240个文件, 因为crawler会自动平衡所有主机的负载. +>High Speed Crawling<==>高速crawl< +A \'shallow crawl\' which is not limited to a single host \(or site\)==当目标主机很多时, 用于多个主机(或站点)的'浅crawl'方式, +can extend the pages per minute \(ppm\) rate to unlimited documents per minute when the number of target hosts is high.==会增加每秒页面数(ppm). +This can be done using the Expert Crawl Start servlet.==对应设置专家模式起始crawla>选项. +>Scheduler Steering<==>定时器向导< +The scheduler on crawls can be changed or removed using the API Steering.==可以使用API向导改变或删除crawl定时器. #----------------------------- #File: Help.html #--------------------------- -YaCy: Help==YaCy: Hilfe -Tutorial==Anleitung -You are using the administration interface of your own search engine==Sie benutzen gerade das Administrationsinterface ihrer eigenen Suchmaschine -You can create your own search index with YaCy==Sie können mit YaCy Ihren eigenen Suchindex erstellen -To learn how to do that, watch one of the demonstration videos below==Bitte sehen Sie als Anleitung eine Demonstration (2. Video unten in deutscher Sprache) +YaCy: Help==YaCy: 帮助 +Tutorial==新手教程 +You are using the administration interface of your own search engine==您正在搜索引擎的管理界面 +You can create your own search index with YaCy==您可以用YaCy创建属于自己的搜索索引 +To learn how to do that, watch one of the demonstration videos below==观看以下demo视频以了解更多 #----------------------------- #File: index.html #--------------------------- -YaCy \'\#\[clientname\]\#\': Search Page==YaCy '#[clientname]#': Suchseite +YaCy \'\#\[clientname\]\#\': Search Page==YaCy '#[clientname]#': 搜索页面 #kiosk mode==Kiosk Modus -"Search"=="Suchen" +"Search"=="搜索" #Text==Text -Images==Bilder +Images==图像 #Audio==Audio -Video==Videos -Applications==Anwendungen -more options...==mehr Optionen... -advanced parameters==erweiterte Parameter -Max. number of results==Max. Anzahl der Ergebnisse -Results per page==Ergebnisse pro Seite -Resource==Quelle -global==global ->local==>lokal -Global search is disabled because==Die globale Suche ist deaktiviert, denn -DHT Distribution is==die DHT-Verteilung ist -Index Receive is==der Index-Empfang ist -DHT Distribution and Index Receive are==DHT-Verteilung und Index-Empfang sind -disabled.\#\(==deaktiviert.#( -URL mask==URL-Filter -restrict on==beschränken auf -show all==alle zeigen +Video==视频 +Applications==应用程序 +more options...==更多设置... +advanced parameters==高级参数 +Max. number of results==搜索结果最多有 +Results per page==每个页面显示结果 +Resource==资源 +global==全球 +>local==>本地 +Global search is disabled because==全球搜索被禁用, 因为 +DHT Distribution is==DHT分发被 +Index Receive is==索引接收被 +DHT Distribution and Index Receive are==DHT分发和索引接受被 +disabled.\#\(==禁用.#( +URL mask==URL掩码 +restrict on==限制 +show all==显示所有 #überarbeiten!!! -Prefer mask==Vorzugsmaske -Constraints==Einschränkungen -only index pages==Nur Index-Seiten -"authentication required"=="Autorisierung erforderlich" -Disable search function for users without authorization==Suchfunktion für Benutzer ohne Autorisierung sperren -Enable web search to everyone==Suchfunktion für alle Nutzer erlauben -the peer-to-peer network==Peer-to-Peer-Netzwerk -only the local index==Nur lokaler Index -Query Operators==Such-Operatoren -restrictions==Restriktionen -only urls with the <phrase> in the url==Nur URLs, welche <phrase> enthalten -only urls with extension==Nur URLs mit der Dateinamenserweiterung -only urls from host==Nur URLs vom Server -only pages with as-author-anotated==Nur Seiten mit dem angegebenen Autor -only pages from top-level-domains==Nur Seiten aus der Top-Level-Domain -only resources from http or https servers==Nur Ressources auf HTTP- oder HTTPS-Servern -only resources from ftp servers==Nur Ressourcen auf FTP-Servern -they are rare==eher selten -crawl them yourself==crawlen Sie sie selbst -only resources from smb servers==Nur Ressourcen von SMB-Servern -Intranet Indexing must be selected==Intranet-Indexierung muss ausgewählt sein -only files from a local file system==Nur Dateien aus dem lokalen Dateisystem -ranking modifier==Ranking-Modifizierung -sort by date==Sortierung nach Datum -latest first==Neuste zuerst -multiple words shall appear near==Mehrere Wörter sollen nah zusammen stehen -doublequotes==Anführungszeichen -prefer given language==Angegebene Sprache bevorzugen -an ISO639 2-letter code==2-Buchstaben-Ländercode nach ISO639 -heuristics==Heuristiken -add search results from scroogle==Benutze zusätzliche Ergebnisse von Scroogle -add search results from blekko==Benutze zusätzliche Ergebnisse von Blekko -Search Navigation==Such-Navigation -keyboard shotcuts==Tastatur-Kürzel -tab or page-up==Tab oder Bild hoch -next result page==Nächste Ergebnisseite -page-down==Bild nach unten -previous result page==Vorherige Ergebnisseite -automatic result retrieval==Automatische Ergebnis-Abfrage -browser integration==Browserintegration -after searching, click-open on the default search engine in the upper right search field of your browser and select 'Add "YaCy Search.."'==Nach der Suche clicken Sie auf das Suchfeld Ihres Browsers und wählen Sie '"YaCy" hinzufügen' -search as rss feed==Suche als RSS-Feed -click on the red icon in the upper right after a search. this works good in combination with the '/date' ranking modifier. See an==Klicken Sie nach der Suche auf das rote Icon in der rechten oberen Ecke. Dies funktioniert gut mit dem '/date' Ranking-Modifizierer. Hier ein ->example==>Beispiel -json search results==JSON-Suchergebnisse -for ajax developers: get the search rss feed and replace the '.rss' extension in the search result url with '.json'==Für AJAX-Entwickler: Rufen Sie den RSS-Feed auf und ersetzen Sie '.rss' durch '.json' +Prefer mask==首选掩码 +Constraints==约束 +only index pages==仅索引页面 +"authentication required"=="需要认证" +Disable search function for users without authorization==禁止未授权用户搜索 +Enable web search to everyone==允许所有人搜索 +the peer-to-peer network==P2P网络 +only the local index==仅本地索引 +Query Operators==查询操作 +restrictions==限制 +only urls with the <phrase> in the url==仅包含<phrase>的URL +only urls with extension==仅带扩展名的URL +only urls from host==仅来自主机的URL +only pages with as-author-anotated==仅作者授权页面 +only pages from top-level-domains==仅来自顶级域名的页面 +only resources from http or https servers==仅来自http/https服务器的资源 +only resources from ftp servers==仅来自ftp服务器的资源 +they are rare==很少 +crawl them yourself==您需要crawl它们 +only resources from smb servers==仅来自smb服务器的资源 +Intranet Indexing must be selected==局域网索引必须被选中 +only files from a local file system==仅来自本机文件系统的文件 +ranking modifier==排名修改 +sort by date==按日期排序 +latest first==最新者居首 +multiple words shall appear near==引用多个字 +doublequotes==双引号 +prefer given language==首选语言 +an ISO639 2-letter code==ISO639标准的双字母代码 +heuristics==启发式 +add search results from scroogle==添加来自scroogle的搜索结果 +add search results from blekko==添加来自blekko的搜索结果 +Search Navigation==搜索导航 +keyboard shotcuts==快捷键 +tab or page-up==Tab或者Page Up +next result page==下一页 +page-down==Page Down +previous result page==上一页 +automatic result retrieval==自动结果检索 +browser integration==浏览集成 +after searching, click-open on the default search engine in the upper right search field of your browser and select 'Add "YaCy Search.."'==搜索后, 点击浏览器右上方区域中的默认搜索引擎, 并选择'添加"YaCy"' +search as rss feed==作为RSS-Feed搜索 +click on the red icon in the upper right after a search. this works good in combination with the '/date' ranking modifier. See an==搜索后点击右上方的红色图标. 配合'/date'排名修改, 能取得较好效果. +>example==>例 +json search results==JSON搜索结果 +for ajax developers: get the search rss feed and replace the '.rss' extension in the search result url with '.json'==对AJAX开发者: 获取搜索结果页的RSS-Feed, 并用'.json'替换'.rss'搜索结果链接中的扩展名 #----------------------------- #File: IndexCleaner_p.html #--------------------------- -Index Cleaner==Index Aufräumer ->URL-DB-Cleaner==>URL-DB-Aufräumer +Index Cleaner==索引清理 +>URL-DB-Cleaner==>URL-DB-清理 #ThreadAlive: #ThreadToString: -Total URLs searched:==Insgesamt durchsuchte URLs: -Blacklisted URLs found:==URLS auf Blacklist gefunden: -Percentage blacklisted:==Prozent auf Blacklist: -last searched URL:==zuletzt durchsuchte URL: -last blacklisted URL found:==zuletzt gefundene URL auf Blacklist: ->RWI-DB-Cleaner==>RWI-DB-Aufräumer -RWIs at Start:==RWIs beim Start: -RWIs now:==RWIs jetzt: -wordHash in Progress:==Wort-Hash in Benutzung: -last wordHash with deleted URLs:==letzter Wort-Hash mit gelöschten URLs: -Number of deleted URLs in on this Hash:==Anzahl an gelöschten URLs in diesem Hash: -URL-DB-Cleaner - Clean up the database by deletion of blacklisted urls:==URL-DB-Aufräumer - Räumen Sie Ihre Datenbank auf, indem Sie URLs, die auf Ihrer Blacklist stehen, löschen: -Start/Resume==Start/Fortsetzen -Stop==Stopp -Pause==Anhalten -RWI-DB-Cleaner - Clean up the database by deletion of words with reference to blacklisted urls:==RWI-DB-Aufräumer - Räumen Sie Ihre Datenbank auf, indem Sie Wörter, die mit Ihrer Blacklist verbunden sind, löschen: +Total URLs searched:==搜索到的全部URL: +Blacklisted URLs found:==搜索到的黑名单URL: +Percentage blacklisted:==黑名单占百分比: +last searched URL:==最近搜索到的URL: +last blacklisted URL found:==最近搜索到的黑名单URL: +>RWI-DB-Cleaner==>RWI-DB-清理 +RWIs at Start:==启动时RWIs: +RWIs now:==当前RWIs: +wordHash in Progress:==处理中的Hash值: +last wordHash with deleted URLs:==已删除URL的Hash值: +Number of deleted URLs in on this Hash:==此Hash中已删除的URL数: +URL-DB-Cleaner - Clean up the database by deletion of blacklisted urls:==URL-DB-清理 - 清理数据库, 会删除黑名单URl: +Start/Resume==开始/继续 +Stop==停止 +Pause==暂停 +RWI-DB-Cleaner - Clean up the database by deletion of words with reference to blacklisted urls:==RWI-DB-清理 - 清理数据库, 会删除与黑名单URL相关的信息: #----------------------------- #File: IndexControlRWIs_p.html #--------------------------- -Reverse Word Index Administration==Reverse Wort Indexverwaltung -The local index currently contains \#\[wcount\]\# reverse word indexes==Der lokale Index enthält im Moment #[wcount]# inverse Wort Indexe -RWI Retrieval \(= search for a single word\)==RWI Abfrage (= Suche nach einem einzelnen Wort) -Select Segment:==Segment Auswahl: -Retrieve by Word:<==Abfrage nach Wort:< -"Show URL Entries for Word"=="URL Einträge für Wort zeigen" -Retrieve by Word-Hash==Abfrage nach Wort-Hash -"Show URL Entries for Word-Hash"=="URL Einträge für Wort-Hash zeigen" -"Generate List"=="Liste erstellen" -Cleanup==Aufräumen ->Index Deletion<==>Index Löschung< ->Delete Search Index<==>Lösche Suchindex< -Stop Crawler and delete Crawl Queues==Crawler anhalten und Crawler Warteschlangen löschen -Delete HTTP & FTP Cache==Lösche HTTP & FTP Cache -Delete robots.txt Cache==Lösche robots.txt Cache -Delete cached snippet-fetching failures during search==Lösche gecachte Snippet-Holen Fehler während der Suche +Reverse Word Index Administration==详细索引字管理 +The local index currently contains \#\[wcount\]\# reverse word indexes==本地索引包含 #[wcount]# 个索引字 +RWI Retrieval \(= search for a single word\)==RWI接收(= 搜索单个单词) +Select Segment:==选择片段: +Retrieve by Word:<==输入单词:< +"Show URL Entries for Word"=="显示单词的入口URL" +Retrieve by Word-Hash==输入单词Hash值 +"Show URL Entries for Word-Hash"=="显示单词Hash值的入口URL" +"Generate List"=="生成列表" +Cleanup==清理 +>Index Deletion<==>删除索引< +>Delete Search Index<==>删除搜索索引< +Stop Crawler and delete Crawl Queues==停止crawl并删除crawl队列 +Delete HTTP & FTP Cache==删除HTTP & FTP缓存 +Delete robots.txt Cache==删除robots.txt缓存 +Delete cached snippet-fetching failures during search==删除已缓存的错误信息 "Delete"=="删除" -No entry for word \'\#\[word\]\#\'==Keinen Eintrag zu Wort '#[word]#' -No entry for word hash==Keinen Eintrag zu Wort-Hash -Search result==Suchergebnis -total URLs==insgesamte URLs -appearance in==kommt vor in -in link type==im Link-Typ -document type==Dokumenten-Typ -description==Beschreibung -title==Titel -creator==Erzeuger -subject==Thema +No entry for word \'\#\[word\]\#\'==无'#[word]#'的对应条目 +No entry for word hash==无条目对应 +Search result==搜索结果 +total URLs==全部URL +appearance in==出现在 +in link type==链接类型 +document type==文件类型 +description==描述 +title==标题 +creator==创建者 +subject==主题 url==URL -emphasized==betont -image==Bilder -audio==Audio -video==Video -app==Anwendung -index of==Index of ->Selection==>Auswahl -Display URL List==Anzeige der URL-Liste -Number of lines==Zeilenanzahl -all lines==alle Zeilen -"List Selected URLs"=="Ausgewählte URLs anzeigen" -Transfer RWI to other Peer==RWI Transfer an anderen Peer -Transfer by Word-Hash==Transfer per Wort-Hash -"Transfer to other peer"=="An anderen Peer senden" -to Peer==an Peer -
    select==
    auswählen -or enter a hash==oder Hash eingeben -Sequential List of Word-Hashes==aufeinanderfolgende Liste der URL-Hashes -No URL entries related to this word hash==Keine URL Einträge zugehörig zu diesem Wort Hash -\#\[count\]\# URL entries related to this word hash==#[count]# URL Einträge zugehörig zu diesem Wort Hash -Resource==Ressource -Negative Ranking Factors==Negative Ranking Faktoren -Positive Ranking Factors==Positive Ranking Faktoren -Reverse Normalized Weighted Ranking Sum==Inverse normalisierte gewichtete Ranking Summe +emphasized==高亮 +image==图像 +audio==音频 +video==视频 +app==应用 +index of==索引 +>Selection==>选择 +Display URL List==显示URL列表 +Number of lines==行数 +all lines==全部 +"List Selected URLs"=="列出选中URL" +Transfer RWI to other Peer==传递RWI给其他peer +Transfer by Word-Hash==按字Hash值传递 +"Transfer to other peer"=="传递" +to Peer==指定peer +
    select==
    选择 +or enter a hash==或者输入peer的Hash值 +Sequential List of Word-Hashes==字Hash值的顺序列表 +No URL entries related to this word hash==无对应入口URL对于字Hash +\#\[count\]\# URL entries related to this word hash==#[count]# 个入口URL与此字Hash相关 +Resource==资源 +Negative Ranking Factors==负向排名因素 +Positive Ranking Factors==正向排名因素 +Reverse Normalized Weighted Ranking Sum==反向常规加权排名和 hash==Hash -dom length==Domain Länge +dom length==域长度 ybr==YBR #url comps -url length==URL Länge -pos in text==Pos. im Text -pos of phrase==Pos. des Satzes -pos in phrase==Pos. im Satz -word distance==Wort Distanz -authority==Autorität -date==Datum -words in title==Wörter im Titel -words in text==Wörter im Text -local links==lokale Links -remote links==remote Links -hitcount==Trefferzahl +url length==URL长度 +pos in text==文中位置 +pos of phrase==短语位置 +pos in phrase==在短语中位置 +word distance==字间距离 +authority==权限 +date==日期 +words in title==标题字数 +words in text==内容字数 +local links==本地链接 +remote links==远程链接 +hitcount==命中数 #props== -unresolved URL Hash==ungelöster URL-Hash -Word Deletion==Wort Löschung -Deletion of selected URLs==Löschung von selektierten URLs -delete also the referenced URL \(recommended, may produce unresolved references==lösche ebenso die verwiesene URL (empfohlen, produziert eventuell ungelöste Referenzen -at other word indexes but they do not harm\)==an anderen Wort Indizes, aber es verursacht keinen Schaden -for every resolvable and deleted URL reference, delete the same reference at every other word where==für jede lösbare und gelöschte URL Referenz, lösche die selbe Referenz bei jedem anderen Wort, wo -the reference exists \(very extensive, but prevents further unresolved references\)==die Referenz existiert (sehr umfassend, aber bewahrt vor weiteren ungelösten Referenzen) -"Delete reference to selected URLs"=="Referenz und markierte URLs löschen" -"Delete Word"=="Wort löschen" -Blacklist Extension==Blacklist Erweiterung -"Add selected URLs to blacklist"=="Markierte URLs zu Blacklist hinzufügen" -"Add selected domains to blacklist"=="Markierte Domains zu Blacklist hinzufügen" +unresolved URL Hash==未解析URL Hash值 +Word Deletion==删除关键字 +Deletion of selected URLs==删除选中URL +delete also the referenced URL \(recommended, may produce unresolved references==同时删除关联URL (推荐, 虽然在索引时 +at other word indexes but they do not harm\)==会产生未解析关联, 但是不影响系统性能) +for every resolvable and deleted URL reference, delete the same reference at every other word where==对于已解析并已删除的URL关联来说, 则会删除它与其他关键字的关联 +the reference exists \(very extensive, but prevents further unresolved references\)==(很多, 但是会阻止未解析关联的产生) +"Delete reference to selected URLs"=="删除与选中URL的关联" +"Delete Word"=="删除关键字" +Blacklist Extension==黑名单扩展 +"Add selected URLs to blacklist"=="添加选中URL到黑名单" +"Add selected domains to blacklist"=="添加选中域到黑名单" #----------------------------- #File: IndexControlURLs_p.html #--------------------------- -URL References Administration==URL Referenzen Administration -The local index currently contains \#\[ucount\]\# URL references==Der lokale Index enthält im Moment #[ucount]# URL-Referenzen -URL Retrieval==URL Abfrage -Select Segment:==Segment Auswahl: -Retrieve by URL:<==Abfrage nach URL:< -"Show Details for URL"=="Details für URL zeigen" -Retrieve by URL-Hash==Abfrage nach URL-Hash -"Show Details for URL-Hash"=="Details für URL-Hash zeigen" -"Generate List"=="Liste erstellen" -Statistics about top-domains in URL Database==Statistik über die Top-Domains in der URL Datenbank -Show top==Zeige die -domains from all URLs.==Top-Domains aus allen URLs. -"Generate Statistics"=="Statistik erstellen" -Statistics about the top-\#\[domains\]\# domains in the database:==Statistik über die Top-#[domains]# Domains in der Datenbank: -"delete all"=="Alle 删除" +URL References Administration==URL关联管理 +The local index currently contains \#\[ucount\]\# URL references==目前本地索引含有 #[ucount]# 个URL关联 +URL Retrieval==URL获取 +Select Segment:==选择片段: +Retrieve by URL:<==输入URL:< +"Show Details for URL"=="显示细节" +Retrieve by URL-Hash==输入URL Hash值 +"Show Details for URL-Hash"=="显示细节" +"Generate List"=="生成列表" +Statistics about top-domains in URL Database==URL数据库中顶级域数据 +Show top==显示全部URL中的 +domains from all URLs.==个域. +"Generate Statistics"=="生成数据" +Statistics about the top-\#\[domains\]\# domains in the database:==数据库中头 #[domains]# 个域的数据: +"delete all"=="全部删除" #Domain==Domain #URLs==URLs -Sequential List of URL-Hashes==Sequentielle Liste der URL-Hashes -Loaded URL Export==Export geladener URLs -Export File==Export-Datei +Sequential List of URL-Hashes==URL Hash顺序列表 +Loaded URL Export==导出已加载URL +Export File==导出文件 #URL Filter==URL Filter #Export Format==Export Format #Only Domain \(superfast\)==Nur Domains (sehr schnell) -Only Domain:==Liste mit nur Domainnamen: -Full URL List:==Liste mit vollständiger URL: -Plain Text List \(domains only\)==Einfache Text Liste (nur Domains) -HTML \(domains as URLs, no title\)==HTML (Domains als URLs, kein Titel) +Only Domain:==仅域名: +Full URL List:==完整URL列表: +Plain Text List \(domains only\)==文本文件(仅域名) +HTML \(domains as URLs, no title\)==HTML (超链接格式的域名, 不包括标题) #Full URL List \(high IO\)==Vollständige URL Liste (hoher IO) -Plain Text List \(URLs only\)==Einfache Text Liste (nur URLs) -HTML \(URLs with title\)==HTML (URLs mit Titel) +Plain Text List \(URLs only\)==文本文件(仅URL) +HTML \(URLs with title\)==HTML (带标题的URL) #XML (RSS)==XML (RSS) -"Export URLs"=="URLs exportieren" -Export to file \#\[exportfile\]\# is running .. \#\[urlcount\]\# URLs so far==Export nach Datei #[exportfile]# läuft .. #[urlcount]# URLs bisher -Finished export of \#\[urlcount\]\# URLs to file==Export beendet und #[urlcount]# URLs gespeichert in Datei -Export to file \#\[exportfile\]\# failed:==Export in Datei #[exportfile]# fehlgeschlagen: -No entry found for URL-hash==Keinen Eintrag gefunden für URL-Hash +"Export URLs"=="导出URL" +Export to file \#\[exportfile\]\# is running .. \#\[urlcount\]\# URLs so far==正在导出到 #[exportfile]# .. 已经导出 #[urlcount]# 个URL +Finished export of \#\[urlcount\]\# URLs to file==已完成导出 #[urlcount]# 个URL到文件 +Export to file \#\[exportfile\]\# failed:==导出到文件 #[exportfile]# 失败: +No entry found for URL-hash==未找到合适条目对应URL-Hash #URL String==URL Adresse #Hash==Hash #Description==Beschreibung @@ -1400,172 +1400,172 @@ No entry found for URL-hash==Keinen Eintrag gefunden für URL-Hash #Language==Sprache #Size==Größe #Words==Wörter -"Show Content"=="Inhalt anzeigen" -"Delete URL"=="URL löschen" -this may produce unresolved references at other word indexes but they do not harm==dies mag ungelöste Referenzen an anderen Wort Indizes erzeugen, aber es richtet keinen Schaden an -"Delete URL and remove all references from words"=="URL löschen und alle Referenzen zu Wörtern entfernen" -delete the reference to this url at every other word where the reference exists \(very extensive, but prevents unresolved references\)==löscht die Referenz zu dieser URL und jedem anderen Wort, wo die Referenz existiert (sehr umfassend, aber bewahrt vor ungelösten Referenzen) +"Show Content"=="显示内容" +"Delete URL"=="删除URL" +this may produce unresolved references at other word indexes but they do not harm==这可能和其他关键字产生未解析关联, 但是这并不影响系统性能 +"Delete URL and remove all references from words"=="删除URl并从关键字中删除所有关联" +delete the reference to this url at every other word where the reference exists \(very extensive, but prevents unresolved references\)==删除指向此链接的关联字,(很多, 但是会阻止未解析关联的产生) #----------------------------- #File: IndexCreateLoaderQueue_p.html #--------------------------- -Loader Queue==Lade-Puffer -The loader set is empty==Der Lade-Puffer ist leer. -There are \#\[num\]\# entries in the loader set:==Es befinden sich #[num]# Einträge in dem Lade-Puffer: -Initiator==Initiator -Depth==Tiefe +Loader Queue==加载器 +The loader set is empty==无加载器 +There are \#\[num\]\# entries in the loader set:==加载器中有 #[num]# 个条目: +Initiator==发起者 +Depth==深度 #URL==URL #----------------------------- #File: IndexCreateParserErrors_p.html #--------------------------- -Parser Errors==Parser Fehler -Rejected URL List:==Liste der zurückgewiesenen URLs: -There are \#\[num\]\# entries in the rejected-urls list.==Es befinden sich #[num]# Einträge in Liste der zurückgewiesenen URLs. -Showing latest \#\[num\]\# entries.==Es werden die letzten #[num]# Einträge angezeigt. -"show more"=="Mehr anzeigen" -"clear list"=="Liste löschen" -There are \#\[num\]\# entries in the rejected-queue:==Es befinden sich #[num]# Einträge in der zurückgewiesenen URL Liste: +Parser Errors==解析错误 +Rejected URL List:==拒绝URL列表: +There are \#\[num\]\# entries in the rejected-urls list.==在拒绝URL列表中有 #[num]# 个条目. +Showing latest \#\[num\]\# entries.==显示最近的 #[num]# 个条目. +"show more"=="更多" +"clear list"=="清除列表" +There are \#\[num\]\# entries in the rejected-queue:==拒绝队列中有 #[num]# 个条目: #Initiator==Initiator -Executor==Ausführender +Executor==执行器 #URL==URL -Fail-Reason==Fehlermeldung +Fail-Reason==错误原因 #----------------------------- #File: ContentIntegrationPHPBB3_p.html #--------------------------- -Content Integration: Retrieval from phpBB3 Databases==Integration von Inhalt: Import aus phpBB3 Datenbanken -It is possible to extract texts directly from mySQL and postgreSQL databases.==Es ist möglich Texte direkt aus MySQL und PostgreSQL Datenbanken zu extrahieren. -Each extraction is specific to the data that is hosted in the database.==Jeder Vorgang extrahiert genau die Datensätze die in der Datenbank gehostet werden. -This interface gives you access to the phpBB3 forums software content.==Dieses Interface erlaubt den Zugriff auf die Inhalte der phpBB3 Forum Software. -If you read from an imported database, here are some hints to get around problems when importing dumps in phpMyAdmin:==Wenn aus einer importierten Datenbank gelesen werden soll sind hier einige Hinweise, um Probleme zu vermeiden wenn Datenbankdumps in phpMyAdmin importiert werden. -before importing large database dumps, set==Bevor große Datenbankdumps importiert werden die folgende Zeile -in phpmyadmin/config.inc.php and place your dump file in /tmp \(Otherwise it is not possible to upload files larger than 2MB\)==in die Datei phpmyadmin/config.inc.php schreiben und die Datenbank Datei in /tmp ablegen (Andernfalls ist es nicht möglich Dateien größer als 2MB hochzuladen) -deselect the partial import flag==Den teilweisen Import Flag abschalten -When an export is started, surrogate files are generated into DATA/SURROGATE/in which are automatically fetched by an indexer thread.==Wenn ein Export gestartet wird werden Hilfsdateien in DATA/SURROGATE/in erzeugt, die automatisch von einem Indexer Thread geholt und verarbeitet werden. -All indexed surrogate files are then moved to DATA/SURROGATE/out and can be re-cycled when an index is deleted.==Alle indexierten Hilfsdateien werden dann nach DATA/SURROGATE/out verschoben und können recycelt werden wenn ein Index gelöscht wird. -The URL stub==Der Teil der URL -like http://forum.yacy-websuche.de==wie z.B. http://forum.yacy-websuche.de -this must be the path right in front of '\/viewtopic.php\?'==dies muss den kompletten Pfad vor '\/viewtopic.php\?' enthalten -Type==Typ -> of database<==> der Datenbank< -use either 'mysql' or 'pgsql'==Verwende entweder 'mysql' oder 'pgsql' -Host=Hostname -> of the database<==> der Datenbank< -of database service==des Datenbank Dienstes -usually 3306 for mySQL==normalerweise 3306 für MySQL -Name of the database==Name der Datenbank -on the host==auf dem Host -Table prefix string==Tabellen Präfix -for table names==für Tabellennamen -User==Benutzer -that can access the database==mit Zugriff auf die Datenbank -Password==Passwort -for the account of that user given above==für den Zugang des oben angegebenen Benutzers -Posts per file==Beiträge pro Datei -in exported surrogates==in der exportierten Hilfsdatei -Check database connection==Datenbankverbindung überprüfen -Export Content to Surrogates==Exportiere Inhalt in Hilfsdateien -Import a database dump==Importieren eines Datenbankauszugs -Import Dump==Datenbankdump importieren -Posts in database==Beiträge in Datenbank -first entry==Erster Eintrag -last entry==Letzter Eintrag -Info failed:==Info Fehlgeschlagen: -Export successful! Wrote \#\[files\]\# files in DATA/SURROGATES/in==Export erfolgreich! #[files]# Dateien in DATA/SURROGATES/in geschrieben -Export failed:==Export fehlgeschlagen: -Import successful!==Import erfolgreich! -Import failed:==Import fehlgeschlagen: +Content Integration: Retrieval from phpBB3 Databases==内容集成: 从phpBB3数据库中导入 +It is possible to extract texts directly from mySQL and postgreSQL databases.==能直接从mysql或者postgresql中解压出内容. +Each extraction is specific to the data that is hosted in the database.==每次解压都针对主机数据库中的数据. +This interface gives you access to the phpBB3 forums software content.==通过此接口能访问phpBB3论坛软件内容. +If you read from an imported database, here are some hints to get around problems when importing dumps in phpMyAdmin:==如果从使用phpMyAdmin读取数据库内容, 您可能会用到以下建议: +before importing large database dumps, set==在导入尺寸较大的数据库时, +in phpmyadmin/config.inc.php and place your dump file in /tmp \(Otherwise it is not possible to upload files larger than 2MB\)==设置phpmyadmin/config.inc.php的内容, 并将您的数据库文件放到 /tmp 目录下(否则不能上传大于2MB的文件) +deselect the partial import flag==取消部分导入 +When an export is started, surrogate files are generated into DATA/SURROGATE/in which are automatically fetched by an indexer thread.==导出过程开始时, 在 DATA/SURROGATE/in 目录下自动生成备份文件, 并且会被索引器自动抓取. +All indexed surrogate files are then moved to DATA/SURROGATE/out and can be re-cycled when an index is deleted.==所有被索引的备份文件都在 DATA/SURROGATE/out 目录下, 并被索引器循环利用. +The URL stub==URL根域名 +like http://forum.yacy-websuche.de==比如链接 http://forum.yacy-websuche.de +this must be the path right in front of '\/viewtopic.php\?'==必须在'\/viewtopic.php\?'前面 +Type==数据库 +> of database<==> 类型< +use either 'mysql' or 'pgsql'==使用'mysql'或者'pgsql' +Host=数据库 +> of the database<==> 主机名< +of database service==数据库服务 +usually 3306 for mySQL==MySQL中通常是3306 +Name of the database==主机 +on the host==数据库 +Table prefix string==table +for table names==前缀 +User==数据库 +that can access the database==用户名 +Password==给定用户名的 +for the account of that user given above==访问密码 +Posts per file==导出备份中 +in exported surrogates==每个文件拥有的最多帖子数 +Check database connection==检查数据库连接 +Export Content to Surrogates==导出到备份 +Import a database dump==导入数据库 +Import Dump==导入 +Posts in database==数据库中帖子 +first entry==第一个 +last entry==最后一个 +Info failed:==错误信息: +Export successful! Wrote \#\[files\]\# files in DATA/SURROGATES/in==导出成功! #[files]# 已写入到 DATA/SURROGATES/in 目录 +Export failed:==导出失败: +Import successful!==导入成功! +Import failed:==导入失败: #----------------------------- #File: DictionaryLoader_p.html #--------------------------- -Dictionary Loader==Wörterbuch Download -YaCy can use external libraries to enable or enhance some functions. These libraries are not==YaCy kann externe Bibliotheken zum Erweitern oder Aktivieren bestimmter Funktionen verwenden. Diese Bibliotheken sind nicht -included in the main release of YaCy because they would increase the application file too much.==im Standard Release von YaCy enthalten weil diese die Anwendungsdatei zu stark vergrößern würden. -You can download additional files here.==Sie können zusätzliche Dateien hier herunterladen. ->Geolocalization<==>Geolokalisierung< -Geolocalization will enable YaCy to present locations from OpenStreetMap according to given search words.==Geolokalisierung erlaubt es YaCy bestimmte Orte auf OpenStreetMap zu bestimmten Suchbegriffen zu präsentieren. ->GeoNames<==>Geografische Namen< -With this file it is possible to find cities with a population > 1000 all over the world.==Mit dieser Datei ist es möglich Städte überall auf der Erde zu finden die mehr als 1000 Einwohner haben. ->Download from<==>Download von< ->Storage location<==>Speicherort< +Dictionary Loader==功能扩展 +YaCy can use external libraries to enable or enhance some functions. These libraries are not==您可以使用外部插件来增强一些功能. 考虑到程序大小问题, +included in the main release of YaCy because they would increase the application file too much.==这些插件并未被包含在主程序中. +You can download additional files here.==您可以在这下载扩展文件. +>Geolocalization<==>位置定位< +Geolocalization will enable YaCy to present locations from OpenStreetMap according to given search words.==根据关键字, YaCy能从OpenStreetMap获得的位置信息. +>GeoNames<==>位置< +With this file it is possible to find cities with a population > 1000 all over the world.==使用此文件能够找到全世界平均人口大于1000的城市. +>Download from<==>下载来源< +>Storage location<==>存储位置< #>Status<==>Status< ->not loaded<==>nicht geladen< ->loaded<==>geladen< -:deactivated==:deaktiviert ->Action<==>Aktion< ->Result<==>Resultat< -"Load"=="Laden" -"Deactivate"=="Deaktivieren" -"Remove"=="Entfernen" -"Activate"=="Aktivieren" ->loaded and activated dictionary file<==>Wörterbuch Datei geladen und aktiviert< ->loading of dictionary file failed: \#\[error\]\#<==>Laden der Wörterbuch Datei ist fehlgeschlagen: #[error]#< ->deactivated and removed dictionary file<==>Wörterbuch Datei deaktiviert und entfernt< ->cannot remove dictionary file: \#\[error\]\#<==>Wörterbuch Datei kann nicht entfernt werden: #[error]#< ->deactivated dictionary file<==>Wörterbuch Datei deaktiviert< ->cannot deactivate dictionary file: \#\[error\]\#<==>Wörterbuch Datei kann nicht deaktiviert werden: #[error]#< ->activated dictionary file<==>Wörterbuch Datei aktiviert< ->cannot activate dictionary file: \#\[error\]\#<==>Wörterbuch Datei kann nicht aktiviert werden: #[error]#< +>not loaded<==>为加载< +>loaded<==>已加载< +:deactivated==:已停用 +>Action<==>动作< +>Result<==>结果< +"Load"=="加载" +"Deactivate"=="停用" +"Remove"=="卸载" +"Activate"=="启用" +>loaded and activated dictionary file<==>加载并启用插件< +>loading of dictionary file failed: \#\[error\]\#<==>读取插件失败: #[error]#< +>deactivated and removed dictionary file<==>停用并卸载插件< +>cannot remove dictionary file: \#\[error\]\#<==>卸载插件失败: #[error]#< +>deactivated dictionary file<==>停用插件< +>cannot deactivate dictionary file: \#\[error\]\#<==>停用插件失败: #[error]#< +>activated dictionary file<==>已启用插件< +>cannot activate dictionary file: \#\[error\]\#<==>启用插件失败: #[error]#< #>OpenGeoDB<==>OpenGeoDB< ->With this file it is possible to find locations in Germany using the location \(city\) name, a zip code, a car sign or a telephone pre-dial number.<==>Mit dieser Datei ist es möglich, Orte in Deutschland anhand des (Stadt)Namens, der Postleitzahl, eines Autokennzeichens oder einer Telefonvorwahl zu finden.< +>With this file it is possible to find locations in Germany using the location \(city\) name, a zip code, a car sign or a telephone pre-dial number.<==>使用此插件, 则能通过查询城市名, 邮编, 车牌号或者电话区号得到德国任何地点的位置信息.< #----------------------------- #File: IndexCreateWWWGlobalQueue_p.html #--------------------------- -Global Crawl Queue==Globaler Crawl-Puffer -This queue stores the urls that shall be sent to other peers to perform a remote crawl.==Dieser Puffer enthält URLs, die an andere Peers gesendet werden sollen, um einen Remote Crawl durchzuführen. -If there is no peer for remote crawling available, the links are crawled locally.==Wenn kein Peer zum Remote Crawl vorhanden ist, werden die Links lokal gecrawlt. -The global crawler queue is empty==Der globale Crawler-Puffer ist leer. -"clear global crawl queue"=="Lösche globalen Crawler-Puffer" -There are \#\[num\]\# entries in the global crawler queue. Showing \#\[show-num\]\# most recent entries.==Es befinden sich #[num]# Einträge in dem globalen Crawler-Puffer. Gezeigt werden die #[show-num]# neuesten Einträge. -Show last==Zeige die letzten - entries.== Einträge. -Initiator==Initiator -Profile==Profil -Depth==Tiefe -Modified Date==Änderungsdatum -Anchor Name==Anker Name +Global Crawl Queue==全球crawl队列 +This queue stores the urls that shall be sent to other peers to perform a remote crawl.==此队列存储着需要发送到其他peer进行crawl的链接. +If there is no peer for remote crawling available, the links are crawled locally.==如果远端无可用crawl, 则此队列对本地有效. +The global crawler queue is empty==全球crawl队列为空. +"clear global crawl queue"=="清空全球crawl队列" +There are \#\[num\]\# entries in the global crawler queue. Showing \#\[show-num\]\# most recent entries.==全球crawler队列中有 #[num]# 个条目. 显示最近的 #[show-num]# 个. +Show last==显示最近 + entries.== 个. +Initiator==发起者 +Profile==资料 +Depth==深度 +Modified Date==修改日期 +Anchor Name==anchor名 #URL==URL #----------------------------- #File: IndexCreateWWWLocalQueue_p.html #--------------------------- -Local Crawl Queue==Lokaler Crawl-Puffer -This queue stores the urls that shall be crawled localy by this peer.==Dieser Puffer enthält URLs, die von diesem Peer lokal gecrawlt werden sollen. -It may also contain urls that are computed by the proxy-prefetch.==Sie enthält auch URLs, die vom Proxy durch tieferes Indexieren bereitgestellt werden. -The local crawler queue is empty==Der lokale Crawler-Puffer ist leer. -There are \#\[num\]\# entries in the local crawler queue. Showing \#\[show-num\]\# most recent entries.==Es befinden sich #[num]# Einträge in dem lokalen Crawler-Puffer. Gezeigt werden die #[show-num]# neuesten Einträge. -Show last==Zeige die letzten - entries.== Einträge. -Initiator==Initiator -Profile==Profil -Depth==Tiefe -Modified Date==Änderungsdatum -Anchor Name==Anker Name +Local Crawl Queue==本地crawl队列 +This queue stores the urls that shall be crawled localy by this peer.==此队列存储着本地peer要crawl的队列. +It may also contain urls that are computed by the proxy-prefetch.==此队列中也包含通过代理预取的链接. +The local crawler queue is empty==本地crawl队列为空. +There are \#\[num\]\# entries in the local crawler queue. Showing \#\[show-num\]\# most recent entries.==本地crawl队列中有 #[num]# 个条目. 显示最近的 #[show-num]# 个. +Show last==显示最近 + entries.== 个. +Initiator==发起者 +Profile==资料 +Depth==深度 +Modified Date==修改日期 +Anchor Name==anchor名 URL==URL \[Delete\]==[删除] -Delete Entries:==Lösche Einträge: +Delete Entries:==已删除条目: "Delete"=="删除" -This may take a quite long time.==Dies wird vielleicht einige Zeit dauern. +This may take a quite long time.==这会花费很长一段时间. #----------------------------- #File: IndexCreateWWWRemoteQueue_p.html #--------------------------- -Remote Crawl Queue==Remote Crawl Puffer -This queue stores the urls that other peers sent to you in order to perform a remote crawl for them.==Dieser Puffer enthält die URLS, die Ihnen andere Peers zugeschickt haben, um für diese einen Remote Crawl durchzuführen. -The remote crawler queue is empty==Der Remote Crawler-Puffer ist leer -"clear remote crawl queue"=="leere Remote Crawl Puffer" -There are \#\[num\]\# entries in the remote crawler queue.==Es befinden sich #[num]# Einträge in dem Remote Crawler-Puffer. -Showing \#\[show-num\]\# most recent entries.==Gezeigt werden die #[show-num]# neuesten Einträge. -Show last==Zeige die letzten - entries.== Einträge. -Initiator==Initiator -Profile==Profil -Depth==Tiefe -Modified Date==Änderungsdatum -Anchor Name==Anker Name +Remote Crawl Queue==远端Crawl队列 +This queue stores the urls that other peers sent to you in order to perform a remote crawl for them.==此队列存储着其他peer发送给您从而为他们进行crawl的链接. +The remote crawler queue is empty==远端crawl队列为空 +"clear remote crawl queue"=="清空远端crawl队列" +There are \#\[num\]\# entries in the remote crawler queue.==远端crawl队列中有 #[num]# 个条目. +Showing \#\[show-num\]\# most recent entries.==显示最近的 #[show-num]# 个. +Show last==显示最近 + entries.== 个. +Initiator==发起者 +Profile==资料 +Depth==深度 +Modified Date==修改日期 +Anchor Name==anchor名 URL==URL Delete==删除 #----------------------------- @@ -1574,87 +1574,87 @@ Delete==删除 #--------------------------- YaCy \'\#\[clientname\]\#\': Index Import==YaCy '#[clientname]#': Index Import #Crawling Queue Import==Crawling Puffer Import -Index DB Import==Index Datenbank Import -The local index currently consists of \(at least\) \#\[wcount\]\# reverse word indexes and \#\[ucount\]\# URL references.==Der lokale Index besteht zur Zeit aus (mindestens) #[wcount]# Wörtern und #[ucount]# URLs. -Import Job with the same path already started.==Ein Import mit dem selben Pfad ist bereits gestartet. -Starting new Job==Neuen Import starten -Import Type:==Import-Typ: -Cache Size==Cachegröße -Usage Examples==Benutzungs-
    beispiele -"Path to the PLASMADB directory of the foreign peer"=="Pfad zum PLASMADB Verzeichnis des fremden Peer" -Import Path:==Import-Pfad: -"Start Import"=="Import starten" -Attention:==Achtung: -Always do a backup of your source and destination database before starting to use this import function.==Machen Sie immer ein Backup von Ihrer Quell- und Zieldatenbank, bevor Sie die Import-Funktion nutzen. -Currently running jobs==Gerade laufende Aufgaben -Job Type==Job-Typ ->Path==>Pfad +Index DB Import==导入索引数据 +The local index currently consists of \(at least\) \#\[wcount\]\# reverse word indexes and \#\[ucount\]\# URL references.==本地索引当前至少有 #[wcount]# 个关键字索引和 #[ucount]# 个URL关联. +Import Job with the same path already started.==含有相同路径的导入任务已存在. +Starting new Job==开始新任务 +Import Type:==导入类型: +Cache Size==缓存大小 +Usage Examples==使用
    举例 +"Path to the PLASMADB directory of the foreign peer"=="其他peer的PLASMADB目录路径" +Import Path:==导入失败: +"Start Import"=="开始导入" +Attention:==注意: +Always do a backup of your source and destination database before starting to use this import function.==在使用此导入功能之前, 一定要备份您的源数据库和目的数据库. +Currently running jobs==当前运行任务 +Job Type==任务类型 +>Path==>路径 Status==Status -Elapsed
    Time==Verstrichene
    Zeit -Time
    Left==verbl.
    Zeit -Abort Import==Import abbrechen -Pause Import==Import pausieren -Finished::Running::Paused==Fertig::Laufend::Pausiert -"Abort"=="Abbrechen" +Elapsed
    Time==已用
    时间 +Time
    Left==剩余
    时间 +Abort Import==停止 +Pause Import==暂停 +Finished::Running::Paused==已完成::正在运行::已暂停 +"Abort"=="停止" #"Pause"=="Pause" -"Continue"=="Fortsetzen" -Finished jobs==Fertige Importierungen -"Clear List"=="Liste löschen" -Last Refresh:==Letzte Aktualisierung: -Example Path:==Beispielpfad: -Requirements:==Voraussetzungen: -You need to have at least the following directories and files in this path:==Sie müssen mindestens die folgenden Dateien und Ordner in diesem Pfad haben: ->Type==>Typ ->Writeable==>Schreibrechte ->Description==>Beschreibung ->File==>Datei ->Directory==>Verzeichnis ->Yes<==>Ja< ->No<==>Nein< -The LoadedURL Database containing all loaded and indexed URLs==Die 'geladene URLs'-Datenbank, enthält alle geladenen und indexierten URLs -The assortment directory containing parts of the word index.==Das Assortment-Verzeichnis, enthält Teile des Wort-Index. -The words directory containing parts of the word index.==Das Wort-Verzeichnis, enthält Teile des Wort-Index. -The assortment file that should be imported.==Die Assortment-Datei die importiert werden soll. -The assortment file must have the postfix==Die Assortment-Datei muss den Suffix -.db".==.db" haben. -If you would like to import an assortment file from the PLASMADB\\ACLUSTER\\ABKP== Wenn Sie eine Assortment-Datei aus PLASMADB\\ACLUSTER\\ABKP importieren wollen, -you have to rename it first.==müssen Sie sie zuerst umbenennen. ->Notes:==>Anmerkung: -Please note that the imported words are useless if the destination peer doesn't know==Bitte bedenken Sie, dass die importierten Wörter nutzlos sind, wenn der Ziel-Peer nicht weiß, -the URLs the imported words belongs to.==zu welchen URLs sie gehören. -Crawling Queue Import:==Crawler-Puffer-Import: -Contains data about the crawljob an URL belongs to==Enthält Daten über den Crawljob, zu dem eine URL gehört -The crawling queue==Der Crawler-Puffer -Various stack files that belong to the crawling queue==Verschiedene Stack-Dateien, die zum Crawler-Puffer gehören +"Continue"=="继续" +Finished jobs==已完成任务 +"Clear List"=="清空列表" +Last Refresh:==最近刷新: +Example Path:==示例路径: +Requirements:==要求: +You need to have at least the following directories and files in this path:==此路经中至少包含以下目录和文件: +>Type==>类型 +>Writeable==>可写 +>Description==>描述 +>File==>文件 +>Directory==>目录 +>Yes<==>是< +>No<==>否< +The LoadedURL Database containing all loaded and indexed URLs==已加载URL数据库中含有所有已加载并被索引的URL +The assortment directory containing parts of the word index.==分类目录中含有部分关键字索引. +The words directory containing parts of the word index.==关键字目录中含有部分关键字索引. +The assortment file that should be imported.==需要导入分类文件. +The assortment file must have the postfix==分类文件一定要有后缀名 +.db".==.db". +If you would like to import an assortment file from the PLASMADB\\ACLUSTER\\ABKP==如果您想从 PLASMADB\\ACLUSTER\\ABKP 中导入分类文件, +you have to rename it first.==则须先重命名. +>Notes:==>注意: +Please note that the imported words are useless if the destination peer doesn't know==如果目的peer不知道导入的关键字属于那些链接, +the URLs the imported words belongs to.==则导入的关键字无效. +Crawling Queue Import:==导入crawl队列: +Contains data about the crawljob an URL belongs to==含有crawl任务链接的数据 +The crawling queue==crawl队列 +Various stack files that belong to the crawling queue==属于crawl队列的各种栈文件 #----------------------------- #File: IndexImportMediawiki_p.html #--------------------------- #MediaWiki Dump Import==MediaWiki Dump Import -No import thread is running, you can start a new thread here==Sie können hier einen neuen Thread starten, da aktuell kein Import Thread läuft -Bad input data:==Ungültige Eingabedaten: -MediaWiki Dump File Selection: select a \'bz2\' file==MediaWiki Dump Datei Auswahl: Wähle eine 'bz2' Datei aus -You can import MediaWiki dumps here. An example is the file==Hier können Sie MediaWiki Dumps importieren. Als Beispiel dient die Datei -Dumps must be in XML format and may be compressed in gz or bz2. Place the file in the YaCy folder or in one of its sub-folders.==Dumps müssen im XML Format vorliegen und bz2 komprimiert sein. Legen Sie die Datei im YaCy-Verzeichnis oder einem Unterordner ab. -"Import MediaWiki Dump"=="Importiere MediaWiki Dump" -When the import is started, the following happens:==Wenn der Import gestartet wird passiert Folgendes: -The dump is extracted on the fly and wiki entries are translated into Dublin Core data format. The output looks like this:==Der Dump wird zur Laufzeit extrahiert und die Wiki Einträge werden in das Dublin Core Datenformat übersetzt. Die Ausgabe schaut wie folgt aus: -Each 10000 wiki records are combined in one output file which is written to /DATA/SURROGATES/in into a temporary file.==Je 10000 Wiki Einträge werden zusammen in eine Ausgabedatei geschrieben und in /DATA/SURROGATES/in temporär gespeichert. -When each of the generated output file is finished, it is renamed to a .xml file==Wenn jede der generierten Ausgabedateien abgearbeitet wurde wird diese in eine .xml Datei umbenannt. -Each time a xml surrogate file appears in /DATA/SURROGATES/in, the YaCy indexer fetches the file and indexes the record entries.==Immer wenn eine xml Surrogat Datei in /DATA/SURROGATES/in erscheint, holt der YaCy Indexer diese Datei und indexiert die enthaltenen Datensätze. -When a surrogate file is finished with indexing, it is moved to /DATA/SURROGATES/out==Wenn eine Surrogat Datei vollständig indexiert wurde, wird sie nach /DATA/SURROGATES/out verschoben -You can recycle processed surrogate files by moving them from /DATA/SURROGATES/out to /DATA/SURROGATES/in==Sie können schon abgearbeitete Surrogat Dateien durch Verschieben von /DATA/SURROGATES/out nach /DATA/SURROGATES/in recyclen. -Import Process==Import Prozess +No import thread is running, you can start a new thread here==当前无运行导入任务, 不过您可以在这开始 +Bad input data:==损坏数据: +MediaWiki Dump File Selection: select a \'bz2\' file==MediaWiki 备份文件: 选择一个 'bz2' 文件 +You can import MediaWiki dumps here. An example is the file==您可以在这导入MediaWiki副本. 示例 +Dumps must be in XML format and may be compressed in gz or bz2. Place the file in the YaCy folder or in one of its sub-folders.==副本文件必须是 XML 格式并用 bz2 压缩的. 将其放进YaCy目录或其子目录中. +"Import MediaWiki Dump"=="导入MediaWiki备份" +When the import is started, the following happens:==:开始导入时, 会进行以下工作 +The dump is extracted on the fly and wiki entries are translated into Dublin Core data format. The output looks like this:==备份文件即时被解压, 并被译为Dublin核心元数据格式: +Each 10000 wiki records are combined in one output file which is written to /DATA/SURROGATES/in into a temporary file.==每个输出文件都含有10000个wiki记录, 并都被保存在 /DATA/SURROGATES/in 的临时目录中. +When each of the generated output file is finished, it is renamed to a .xml file==生成的输出文件都以 .xml结尾 +Each time a xml surrogate file appears in /DATA/SURROGATES/in, the YaCy indexer fetches the file and indexes the record entries.==只要 /DATA/SURROGATES/in 中含有 xml文件, YaCy索引器就会读取它们并为其中的条目制作索引. +When a surrogate file is finished with indexing, it is moved to /DATA/SURROGATES/out==当索引完成时, xml文件会被移动到 /DATA/SURROGATES/out +You can recycle processed surrogate files by moving them from /DATA/SURROGATES/out to /DATA/SURROGATES/in==您可以将文件从/DATA/SURROGATES/out 移动到 /DATA/SURROGATES/in 以重复索引. +Import Process==导入进程 #Thread:==Thread: #Dump:==Dump: -Processed:==Bearbeitet: -Wiki Entries==Wiki Einträge -Speed:==Geschwindigkeit: -articles per second<==Artikel pro Sekunde< -Running Time:==Laufzeit: -hours,==Stunden, -minutes<==Minuten< -Remaining Time:==Verbleibende Zeit: +Processed:==已完成: +Wiki Entries==Wiki条目 +Speed:==速度: +articles per second<==个文章每秒< +Running Time:==运行时间: +hours,==小时, +minutes<==分< +Remaining Time:==剩余时间: #hours,==Stunden, #minutes<==Minuten< #----------------------------- @@ -1662,307 +1662,307 @@ Remaining Time:==Verbleibende Zeit: #File: IndexImportOAIPMH_p.html #--------------------------- #OAI-PMH Import==OAI-PMH Import -Results from the import can be monitored in the indexing results for surrogates==Ergebnisse aus dem Import finden Sie auf der Seite Ergebnisse aus dem Surrogat Import -Single request import==Einfacher Anfrage Import -This will submit only a single request as given here to a OAI-PMH server and imports records into the index==Mit dieser Methode wird nur eine einzelne Abfrage an einen OAI-PMH Server geschickt und die Datensätze in den Index aufgenommen -"Import OAI-PMH source"=="Importiere OAI-PMH Quelle" -Source:==Quelle: -Processed:==Bearbeitet: -records<==Datensätze< +Results from the import can be monitored in the indexing results for surrogates==导入结果监视 +Single request import==单个导入请求 +This will submit only a single request as given here to a OAI-PMH server and imports records into the index==向OAI-PMH服务器提交如下导入请求, 并将返回记录导入索引 +"Import OAI-PMH source"=="导入OAI-PMH源" +Source:==源: +Processed:==已处理: +records<==返回记录< #ResumptionToken:==ResumptionToken: -Import failed:==Import fehlgeschlagen: -Import all Records from a server==Importiere alle Datensätze von einem Server -Import all records that follow according to resumption elements into index==Importiere alle folgenden Datensätze die Wiederaufnahme Elementen entsprechen in den Index -"import this source"=="Importiere diese Quelle" -::or ==::oder  -"import from a list"=="Importiere von einer Liste" -Import started!==Import gestartet! -Bad input data:==Ungültige Eingabedaten: +Import failed:==导入失败: +Import all Records from a server==从服务器导入全部记录 +Import all records that follow according to resumption elements into index==根据恢复元素导入服务器记录 +"import this source"=="导入此源" +::or ==::o或  +"import from a list"=="从列表导入" +Import started!==已开始导入! +Bad input data:==损坏数据: #----------------------------- #File: IndexImportOAIPMHList_p.html #--------------------------- -List of \#\[num\]\# OAI-PMH Servers==Liste von #[num]# OAI-PMH Servern -"Load Selected Sources"=="Lade ausgewählte Quellen" -OAI-PMH source import list==OAI-PMH Quellen Import Liste +List of \#\[num\]\# OAI-PMH Servers==#[num]# 个OAI-PMH服务器 +"Load Selected Sources"=="加载选中源" +OAI-PMH source import list==导入OAI-PMH源 #OAI Source List==OAI Quellen Liste ->Source<==>Quelle< -Import List==Importierte Liste +>Source<==>源< +Import List==导入列表 #>Thread<==>Thread< #>Source<==>Quelle< ->Processed
    Chunks<==>Bearbeitete
    Datenblöcke< ->Imported
    Records<==>Importierte
    Datensätze< ->Speed
    \(records/second\)==>Geschwindigkeit
    ==(Datensätze/Sekunde) +>Processed
    Chunks<==>已处理
    块< +>Imported
    Records<==>已导入
    记录< +>Speed
    \(records/second\)==>速度
    ==(记录/每秒) #----------------------------- #File: Load_MediawikiWiki.html #--------------------------- -YaCy \'\#\[clientname\]\#\': Configuration of a Wiki Search==YaCy '#[clientname]#': Konfiguration einer Wiki Suche +YaCy \'\#\[clientname\]\#\': Configuration of a Wiki Search==YaCy '#[clientname]#': Wiki搜索配置 #Integration in MediaWiki==Integration in MediaWiki -It is possible to insert wiki pages into the YaCy index using a web crawl on that pages.==Es ist möglich Wiki Seiten in den YaCy Index aufzunehmen, indem man diese Seiten crawlen läßt. -This guide helps you to crawl your wiki and to insert a search window in your wiki pages.==Diese Anleitung hilft Ihnen, Ihr Wiki zu crawlen und ein Suchfeld in die Wiki Seiten einzubauen. -Retrieval of Wiki Pages==Abrufen der Wiki Seiten -The following form is a simplified crawl start that uses the proper values for a wiki crawl.==Das folgende Eingabeformular ist eine vereinfachte Crawl Startseite die passende Werte für eine Wiki Suche voreingestellt hat. -Just insert the front page URL of your wiki.==Fügen Sie einfach die Start URL Ihres Wikis ein. -After you started the crawl you may want to get back==Nachdem Sie den Crawl gestartet haben sollten Sie nochmals zurück -to this page to read the integration hints below.==auf diese Seite gehen, um die Integrationshinweise weiter unten zu lesen. -URL of the wiki main page==URL der Wiki Hauptseite -This is a crawl start point==Das ist der Ausgangspunkt des Crawls -"Get content of Wiki: crawl wiki pages"=="Hole den Inhalt des Wiki: Crawle die Wiki Seiten" -Inserting a Search Window to MediaWiki==Einfügen eines Suchfeldes in ein MediaWiki -To integrate a search window into a MediaWiki, you must insert some code into the wiki template.==Um ein Suchfeld in das MediWiki einzufügen, müssen Sie einigen Code in Ihr Wiki Template einfügen. -There are several templates that can be used for MediaWiki, but in this guide we consider that==Es gibt einige Templates die für ein MediaWiki verwendet werden können. Aber in dieser Anleitung setzen wir voraus, dass -you are using the default template, \'MonoBook.php\':==Sie das Standard Template einsetzen, 'MonoBook.php': -open skins/MonoBook.php==Öffnen Sie skins/MonoBook.php -find the line where the default search window is displayed, there are the following statements:==Finden Sie die Zeile in der die Standard Suchmaschine angezeigt wird, erkennbar an folgenden Anweisungen: -Remove that code or set it in comments using \'<!--\' and \'-->\'==Entfernen Sie diesen Code oder setzen sie ihn zwischen Kommentar Klammern mit '<!--' und '-->' -Insert the following code:==Fügen Sie folgenden Code ein: -Search with YaCy in this Wiki:==Mit YaCy in diesem Wiki suchen: -value=\"Search\"==value="Suche" -Check all appearances of static IPs given in the code snippet and replace it with your own IP, or your host name==Überprüfen Sie alle in diesem Codeschnipsel vorkommenden statischen IP Adressen und ersetzen Sie diese mit Ihrer eigenen IP oder dem eigenen Hostnamen. -You may want to change the default text elements in the code snippet==Sie können auch die Standard Textelemente in dem Code Ausschnitt gegen eigene Texte austauschen. -To see all options for the search widget, look at the more generic description of search widgets at==Um alle Optionen für das Suchfeld zu sehen, schauen Sie sich die generische Beschreibung des Such Widgets auf -the
    configuration for live search.==der Seite Integration eines Suchfelds für Live Suche an. +It is possible to insert wiki pages into the YaCy index using a web crawl on that pages.==使用网页crawl, 能将wiki网页添加到YaCy主页中. +This guide helps you to crawl your wiki and to insert a search window in your wiki pages.==此向导帮助您crawl您的wiki网页, 在其中添加一个搜索框. +Retrieval of Wiki Pages==接收Wiki网页 +The following form is a simplified crawl start that uses the proper values for a wiki crawl.==下栏是使用某一值的Wiki crawl起始点. +Just insert the front page URL of your wiki.==请填入Wiki的URL. +After you started the crawl you may want to get back==crawl开始后, +to this page to read the integration hints below.==您可能需要返回此页面阅读以下提示. +URL of the wiki main page==Wiki主页URL +This is a crawl start point==将作为crawl起始点 +"Get content of Wiki: crawl wiki pages"=="获取Wiki内容: crawl Wiki页面" +Inserting a Search Window to MediaWiki==在MediaWiki中添加搜索框 +To integrate a search window into a MediaWiki, you must insert some code into the wiki template.==在wiki模板中添加以下代码以将搜索框集成到MediaWiki中. +There are several templates that can be used for MediaWiki, but in this guide we consider that==MediaWiki中有多种模板, +you are using the default template, \'MonoBook.php\':==在此我们使用默认模板 'MonoBook.php': +open skins/MonoBook.php==打开 skins/MonoBook.php +find the line where the default search window is displayed, there are the following statements:==找到搜索框显示部分代码, 如下: +Remove that code or set it in comments using \'<!--\' and \'-->\'==删除以上代码或者用 '<!--' '-->' 将其注释掉 +Insert the following code:==插入以下代码: +Search with YaCy in this Wiki:==在此Wiki中使用YaCy搜索: +value=\"Search\"==value="搜索" +Check all appearances of static IPs given in the code snippet and replace it with your own IP, or your host name==用您自己的IP或者主机名替代代码中给出的IP地址 +You may want to change the default text elements in the code snippet==您可以更改代码中的文本元素 +To see all options for the search widget, look at the more generic description of search widgets at==搜索框详细设置, 请参见 +the configuration for live search.==搜索栏集成: 即时搜索. #----------------------------- #File: Load_PHPBB3.html #--------------------------- -Configuration of a phpBB3 Search==Konfiguration einer phpBB3 Suche +Configuration of a phpBB3 Search==phpBB3搜索配置 #Integration in phpBB3==Integration in phpBB3 -It is possible to insert forum pages into the YaCy index using a database import of forum postings.==Es ist möglich die Forumsseiten mit YaCy zu indexieren, indem die Datenbank mit den Forumseinträgen importiert wird. -This guide helps you to insert a search window in your phpBB3 pages.==Diese Anleitung hilft Ihnen ein YaCy Suchfeld in Ihre phpBB3 Forenseiten einzubinden. -Retrieval of phpBB3 Forum Pages using a database export==Extraktion der phpBB3 Forenseiten durch Datenbank Export -Forum posting contain rich information about the topic, the time, the subject and the author.==Forenbeiträge enthalten reichaltige Informationen über das Thema, die Zeit, den Betreff und den Autor. -This information is in an bad annotated form in web pages delivered by the forum software.==Diese Information wird in einem schlecht kommentierten Format in Form von Webseiten ausgeliefert, die von der Forumssoftware erzeugt werden. -It is much better to retrieve the forum postings directly from the database.==Es ist viel besser die Forenbeiträge direkt aus der Datenbank zu extrahieren. -This will cause that YaCy is able to offer nice navigation features after searches.==Durch den Direktimport kann YaCy nach einer Suche auch hilfreiche Features zur Navigation anbieten. -YaCy has a phpBB3 extraction feature, please go to the phpBB3 content integration servlet for direct database imports.==YaCy kann bereits Daten aus einer phpBB3 Installation extrahieren. Auf der Seite Import aus phpBB3 Datenbanken finden Sie ein Servlet für den direkten Datenbank Import. -Retrieval of phpBB3 Forum Pages using a web crawl==Extraktion der phpBB3 Forenseiten durch Web Crawling -The following form is a simplified crawl start that uses the proper values for a phpbb3 forum crawl.==Das folgende Eingabeformular ist eine vereinfachte Crawl Startseite, die passende Werte für eine phpBB3 Forensuche voreingestellt hat. -Just insert the front page URL of your forum. After you started the crawl you may want to get back==Fügen Sie einfach die Startseite Ihres Forums ein. Nachdem Sie den Crawl gestartet haben sollten Sie zurück -to this page to read the integration hints below.==auf die Seite kommen, um die Integrationshinweise unten zu lesen. -URL of the phpBB3 forum main page==URL der Hauptseite des phpBB3 Forums -This is a crawl start point==Das ist der Ausgangspunkt für den Crawl -"Get content of phpBB3: crawl forum pages"=="Hole den phpBB3 Foreninhalt: Crawlen der Forenseiten" -Inserting a Search Window to phpBB3==Einfügen eines Suchfeldes in das phpBB3 Forum -To integrate a search window into phpBB3, you must insert some code into a forum template.==Um ein Suchfeld in Ihr phpBB3 Forum einzubauen, müssen Sie folgende Zeilen Code in das Forums Template einbauen. -There are several templates that can be used for phpBB3, but in this guide we consider that==Da es viele verschiedene Templates für phpBB3 Foren gibt, gehen wir in dieser Anleitung davon aus, dass -you are using the default template, \'prosilver\'==Sie das Standard Template 'prosilver' verwenden. -open styles/prosilver/template/overall_header.html==Öffnen Sie die Datei styles/prosilver/template/overall_header.html -find the line where the default search window is displayed, thats right behind the
    \<div id=\"search-box\"\>
    statement==Finden Sie die Zeile in der das Standard Suchfeld angezeigt wird, das sich gleich hinter der Anweisung
    <div id="search-box">
    befindet -Insert the following code right behind the div tag==Fügen Sie folgenden Code gleich nach dem div Tag ein -YaCy Forum Search==YaCy Foren Suche -;YaCy Search==;YaCy Suche -Check all appearances of static IPs given in the code snippet and replace it with your own IP, or your host name==Überprüfen Sie alle in diesem Codeschnipsel vorkommenden statischen IP Adressen und ersetzen Sie diese mit Ihrer eigenen IP oder dem eigenen Hostnamen. -You may want to change the default text elements in the code snippet==Sie können auch die Standard Textelemente in dem Code Ausschnitt gegen eigene Texte austauschen. -To see all options for the search widget, look at the more generic description of search widgets at==Um alle Optionen für das Suchfeld zu sehen, schauen Sie sich die generische Beschreibung des Such Widgets auf -the configuration for live search.==der Seite Integration eines Suchfelds für Live Suche an. +It is possible to insert forum pages into the YaCy index using a database import of forum postings.==导入含有论坛帖子的数据库, 能在YaCy主页显示论坛内容. +This guide helps you to insert a search window in your phpBB3 pages.==此向导能帮助您在您的phpBB3论坛页面中添加搜索框. +Retrieval of phpBB3 Forum Pages using a database export==phpBB3论坛页面需使用数据库导出 +Forum posting contain rich information about the topic, the time, the subject and the author.==论坛帖子中含有话题, 时间, 主题和作者等丰富信息. +This information is in an bad annotated form in web pages delivered by the forum software.==此类信息往往由论坛散播, 并且对于搜索引擎来说, 它们的标注很费解. +It is much better to retrieve the forum postings directly from the database.==所以, 直接从数据库中获取帖子内容效果更好. +This will cause that YaCy is able to offer nice navigation features after searches.==这会使得YaCy在每次搜索后提供较好引导特性. +YaCy has a phpBB3 extraction feature, please go to the phpBB3 content integration servlet for direct database imports.==YaCy能够解析phpBB3关键字, 参见 phpBB3内容集成 直接导入数据库方法. +Retrieval of phpBB3 Forum Pages using a web crawl==使用网页crawl接收phpBB3论坛页面 +The following form is a simplified crawl start that uses the proper values for a phpbb3 forum crawl.==下栏是使用某一值的phpBB3论坛crawl起始点. +Just insert the front page URL of your forum. After you started the crawl you may want to get back==将论坛首页填入表格. 开始crawl后, +to this page to read the integration hints below.==您可能需要返回此页面阅读以下提示. +URL of the phpBB3 forum main page==phpBB3论坛主页 +This is a crawl start point==这是crawl起始点 +"Get content of phpBB3: crawl forum pages"=="获取phpBB3内容: crawl论坛页面" +Inserting a Search Window to phpBB3==在phpBB3中添加搜索框 +To integrate a search window into phpBB3, you must insert some code into a forum template.==在论坛模板中添加以下代码以将搜索框集成到phpBB3中. +There are several templates that can be used for phpBB3, but in this guide we consider that==phpBB3中有多种模板, +you are using the default template, \'prosilver\'==在此我们使用默认模板 'prosilver'. +open styles/prosilver/template/overall_header.html==打开 styles/prosilver/template/overall_header.html +find the line where the default search window is displayed, thats right behind the
    \<div id=\"search-box\"\>
    statement==找到搜索框显示代码部分, 它们在
    <div id="search-box">
    下面 +Insert the following code right behind the div tag==在div标签后插入以下代码 +YaCy Forum Search==YaCy论坛搜索 +;YaCy Search==;YaCy搜索 +Check all appearances of static IPs given in the code snippet and replace it with your own IP, or your host name==用您自己的IP或者主机名替代代码中给出的IP地址 +You may want to change the default text elements in the code snippet==您可以更改代码中的文本元素 +To see all options for the search widget, look at the more generic description of search widgets at==搜索框详细设置, 请参见 +the configuration for live search.==der Seite 搜索栏集成: 即时搜索. #----------------------------- #File: Load_RSS_p.html #--------------------------- -Configuration of a RSS Search==Konfiguration einer RSS Suche -Loading of RSS Feeds<==Laden eines RSS Feeds< -RSS feeds can be loaded into the YaCy search index.==RSS Feeds können in den YaCy Suchindex geladen werden. -This does not load the rss file as such into the index but all the messages inside the RSS feeds as individual documents.==Dabei wird nicht die RSS Datei als solche in den Index geladen aber dafür alle Nachrichten innerhalb des RSS Feeds als einzelne Dokumente. -URL of the RSS feed==URL des RSS Feeds ->Preview<==>Vorschau< -"Show RSS Items"=="Zeige RSS Objekte" -Available after successful loading of rss feed in preview==Verfügbar nach dem erfolgreichen Laden des RSS Feeds in der Vorschau -"Add All Items to Index \(full content of url\)"=="Füge alle Objekte zum Index hinzu (Voller Inhalt der URL)" ->once<==>einmalig< ->load this feed once now<==>Lade diesen Feed nun einmalig< ->scheduled<==>geplant< ->repeat the feed loading every<==>Wiederhole das Laden dieses Feeds alle< ->minutes<==>Minuten< ->hours<==>Stunden< ->days<==>Tage< -> automatically.==> automatisch. ->List of Scheduled RSS Feed Load Targets<==>Liste aller geplanten RSS Feed Ziele< ->Title<==>Titel< +Configuration of a RSS Search==RSS搜索配置 +Loading of RSS Feeds<==正在读取RSS feed< +RSS feeds can be loaded into the YaCy search index.==YaCy能够读取RSS feed. +This does not load the rss file as such into the index but all the messages inside the RSS feeds as individual documents.==但不是直接读取RSS文件, 而是将RSS feed中的所有信息分别当作单独的文件来读取. +URL of the RSS feed==RSS feed链接 +>Preview<==>预览< +"Show RSS Items"=="显示RSS条目" +Available after successful loading of rss feed in preview==仅在读取rss feed后有效 +"Add All Items to Index \(full content of url\)"=="添加所有条目到索引中(URL中的全部内容)" +>once<==>立即< +>load this feed once now<==>立即读取此feed< +>scheduled<==>定时< +>repeat the feed loading every<==>读取此feed每隔< +>minutes<==>分钟< +>hours<==>小时< +>days<==>天< +> automatically.==>. +>List of Scheduled RSS Feed Load Targets<==>定时任务列表< +>Title<==>标题< #>URL/Referrer<==>URL/Referrer< ->Recording<==>Eintrag< ->Last Load<==>Zuletzt Geladen< ->Next Load<==>Nächster Ladevorgang< ->Last Count<==>Letzter Zähler< ->All Count<==>Gesamter Zähler< ->Avg. Update/Day<==>Durchschnittliche Updates pro Tag< -"Remove Selected Feeds from Scheduler"=="Entferne ausgewählte Feeds aus der geplanten Liste" -"Remove All Feeds from Scheduler"=="Entferne alle Feeds aus der geplanten Liste" ->Available RSS Feed List<==>Liste mit verfügbaren RSS Feeds< -"Remove Selected Feeds from Feed List"=="Entferne ausgewählte Feeds aus der Feed Liste" -"Remove All Feeds from Feed List"=="Entferne alle Feeds aus der Feed Liste" -"Add Selected Feeds to Scheduler"=="Füge ausgewählte Feeds zur geplanten Liste hinzu" ->new<==>Neu< ->enqueued<==>Geplant< ->indexed<==>Indexiert< ->RSS Feed of==>RSS Feed von ->Author<==>Autor< ->Description<==>Beschreibung< ->Language<==>Sprache< ->Date<==>Datum< ->Time-to-live<==>TTL (Zeit zu Leben)< ->Docs<==>Dokumente< +>Recording<==>正在记录< +>Last Load<==>上次读取< +>Next Load<==>将要读取< +>Last Count<==>目前计数< +>All Count<==>全部计数< +>Avg. Update/Day<==>每天平均更新次数< +"Remove Selected Feeds from Scheduler"=="删除选中feed" +"Remove All Feeds from Scheduler"=="删除所有feed" +>Available RSS Feed List<==>可用RSS feed列表< +"Remove Selected Feeds from Feed List"=="删除选中feed" +"Remove All Feeds from Feed List"=="删除所有feed" +"Add Selected Feeds to Scheduler"=="添加选中feed到定时任务" +>new<==>新< +>enqueued<==>已加入队列< +>indexed<==>已索引< +>RSS Feed of==>RSS Feed +>Author<==>作者< +>Description<==>描述< +>Language<==>语言< +>Date<==>日期< +>Time-to-live<==>TTL< +>Docs<==>文件< >State<==>< #>URL<==>URL< -"Add Selected Items to Index \(full content of url\)"=="Füge ausgewählte Objekte zum Index hinzu (Voller Inhalt der URL)" +"Add Selected Items to Index \(full content of url\)"=="添加选中条目到索引(URL中全部内容)" #----------------------------- #File: Messages_p.html #--------------------------- ->Messages==>Nachrichten -Date==Datum -From==Von -To==An ->Subject==>Betreff -Action==Aktion -From:==Von: -To:==An: -Date:==Datum: +>Messages==>短消息 +Date==日期 +From==来自 +To==发送至 +>Subject==>主题 +Action==动作 +From:==来自: +To:==发送至: +Date:==日期: #Subject:==Betreff: ->view==>anzeigen -reply==antworten ->delete==>löschen -Compose Message==Nachrichtenerstellung -Send message to peer==Sende eine Nachricht an Peer -"Compose"=="Erstellen" -Message:==Nachricht: -inbox==Posteingang +>view==>查看 +reply==回复 +>delete==>删除 +Compose Message==撰写短消息 +Send message to peer==发送消息至peer +"Compose"=="撰写" +Message:==短消息: +inbox==收件箱 #----------------------------- #File: MessageSend_p.html #--------------------------- -Send message==Nachricht versenden -You cannot send a message to==Sie können keine Nachricht schicken an -The peer does not respond. It was now removed from the peer-list.==Der Peer antwortet nicht. Er ist nicht mehr in der Peer-Liste vorhanden. -The peer ==Der Peer -is alive and responded:==ist online und antwortet: -You are allowed to send me a message==Es ist Ihnen erlaubt, mir eine Nachricht zu senden -kb and an==KB und einen -attachment ≤==Anhang ≤ -Your Message==Ihre Nachricht -Subject:==Betreff: -Text:==Inhalt: -"Enter"=="Nachricht senden" -"Preview"=="Vorschau" -You can use==Sie können hier -Wiki Code here.==Wiki Code benutzen. -Preview message==Nachricht Vorschau -The message has not been sent yet!==Die Nachricht wurde noch nicht gesendet! -The peer is alive but cannot respond. Sorry.==Der Peer ist nicht online und kann nicht antworten. Entschuldigung. -Your message has been sent. The target peer responded:==Ihre Nachricht wurde erfolgreich versandt. Der Ziel-Peer antwortet: -The target peer is alive but did not receive your message. Sorry.==Der Ziel-Peer ist online, hat aber Ihre Nachricht nicht erhalten. Entschuldigung. -Here is a copy of your message, so you can copy it to save it for further attempts:==Hier ist eine Kopie Ihrer Nachricht. Sie können diese kopieren, speichern und es später nochmal versuchen: -You cannot call this page directly. Instead, use a link on the Network page.==Sie können diese Seite nicht direkt aufrufen. Benutzen Sie stattdessen einen Link auf der Netzwerk Seite. +Send message==发送短消息 +You cannot send a message to==不能发送消息至 +The peer does not respond. It was now removed from the peer-list.==远端peer未响应, 将从peer列表中删除. +The peer ==peer +is alive and responded:==可用: +You are allowed to send me a message==您现在可以给我发送消息 +kb and an==kb和一个 +attachment ≤==附件 ≤ +Your Message==您的短消息 +Subject:==主题: +Text:==内容: +"Enter"=="发送" +"Preview"=="预览" +You can use==您可以在这使用 +Wiki Code here.==Wiki Code . +Preview message==预览消息 +The message has not been sent yet!==短消息未发送! +The peer is alive but cannot respond. Sorry.==peer属于活动状态但是无响应. +Your message has been sent. The target peer responded:==您的短消息已发送. 接收peer返回: +The target peer is alive but did not receive your message. Sorry.==抱歉, 接收peer属于活动状态但是没有接收到您的消息. +Here is a copy of your message, so you can copy it to save it for further attempts:==这是您的消息副本, 可被保存已备用: +You cannot call this page directly. Instead, use a link on the Network page.==您不能直接使用此页面. 请使用 网络 页面的对应功能. #----------------------------- #File: Network.html #--------------------------- -YaCy Search Network==YaCy Suche Netzwerk -YaCy Network<==YaCy Netzwerk< -The information that is presented on this page can also be retrieved as XML==Die Informationen auf dieser Seite können auch im XML Format abgerufen werden -Click the API icon to see the XML.==Klicken Sie auf das API Symbol, um das XML anzeigen zu lassen. -To see a list of all APIs, please visit the API wiki page.==Um eine Liste aller APIs zu sehen, besuchen Sie die API Seite im Wiki. -Network Overview==Netzwerkübersicht -Active Peers==Aktive Peers -Passive Peers==Passive Peers -Potential Peers==Potenzielle Peers -Active Peers in \'\#\[networkName\]\#\' Network==Aktive Peers im '#[networkName]#' Netzwerk -Passive Peers in \'\#\[networkName\]\#\' Network==Passive Peers im '#[networkName]#' Netzwerk -Potential Peers in \'\#\[networkName\]\#\' Network==Potentielle Peers im '#[networkName]#' Netzwerk -Manually contacting Peer==Kontaktiere Peer manuell -no remote \#\[peertype\]\# peer for this list known==Kein remote Peer #[peertype]# bekannt oder online. -Showing \#\[num\]\# entries from a total of \#\[total\]\# peers.==Gezeigt werden #[num]# Einträge von insgesamt #[total]# Peers. -send Message/
    show Profile/
    edit Wiki/
    browse Blog==Sende Nachricht (m)/
    Zeige Profil (p)/
    Ändere Wiki (w)/
    Durchsuche Blog (b) -Search for a peername \(RegExp allowed\)==Suche nach Peernamen (RegExp erlaubt) -"Search"=="Suche" -Name==Name -Address==Adresse +YaCy Search Network==YaCy搜索网络 +YaCy Network<==YaCy网络< +The information that is presented on this page can also be retrieved as XML==此页信息也可表示为XML +Click the API icon to see the XML.==点击API图标查看XML. +To see a list of all APIs, please visit the API wiki page.==查看所有API列表, 请访问API wiki. +Network Overview==网络一览 +Active Peers==活动peer +Passive Peers==被动peer +Potential Peers==潜在peer +Active Peers in \'\#\[networkName\]\#\' Network=='#[networkName]#'网络中的活动peer +Passive Peers in \'\#\[networkName\]\#\' Network=='#[networkName]#'网络中的被动peer +Potential Peers in \'\#\[networkName\]\#\' Network=='#[networkName]#'网络中的潜在peer +Manually contacting Peer==手动联系peer +no remote \#\[peertype\]\# peer for this list known==当前列表中无远端 #[peertype]# peer. +Showing \#\[num\]\# entries from a total of \#\[total\]\# peers.==显示全部 #[total]# 个peer中的 #[num]# 个. +send Message/
    show Profile/
    edit Wiki/
    browse Blog==发送消息(m)/
    显示资料(p)/
    编辑wiki(w)/
    浏览博客(b) +Search for a peername \(RegExp allowed\)==搜索peer名称(允许正则表达式) +"Search"=="搜索" +Name==名称 +Address==地址 Hash==Hash -Type==Typ -Release/
    SVN==YaCy Version/
    SVN -Last
    Seen==Zuletzt
    online -Location==Ort ->URLs for
    Remote
    Crawl<==>URLs zum
    Remote
    Crawlen< -Offset==Versatz -Send message to peer==Sende Nachricht an Peer -View profile of peer==Zeige Profil des Peers -Read and edit wiki on peer==Lese und ändere Wiki des Peers -Browse blog of peer==Durchsuche den Blog von Peer -#"Ranking Receive: no"=="Ranking Empfang: nein" -#"no ranking receive"=="kein Ranking Empfang" -#"Ranking Receive: yes"=="Ranking Empfang: ja" -#"Ranking receive enabled"=="Ranking Empfang aktiv" -"DHT Receive: yes"=="DHT Empfang: ja" -"DHT receive enabled"=="DHT Empfang aktiv" -"DHT Receive: no; \#\[peertags\]\#"=="DHT Empfang: nein; #[peertags]#" -"DHT Receive: no"=="DHT Empfang: nein" +Type==类型 +Release/
    SVN==YaCy版本/
    SVN +Last
    Seen==最后
    上线 +Location==位置 +>URLs for
    Remote
    Crawl<==>用于
    远端
    crawl的URL< +Offset==偏移 +Send message to peer==发送消息至peer +View profile of peer==查看peer资料 +Read and edit wiki on peer==查看并编辑wiki +Browse blog of peer==查看博客 +#"Ranking Receive: no"=="接收排名: 否" +#"no ranking receive"=="无接收排名" +#"Ranking Receive: yes"=="接收排名: 是" +#"Ranking receive enabled"=="打开排名接收" +"DHT Receive: yes"=="接收DHT: 是" +"DHT receive enabled"=="打开DHT接收" +"DHT Receive: no; \#\[peertags\]\#"=="接收DHT: 否; #[peertags]#" +"DHT Receive: no"=="接收DHT: 否" #no tags given==keine Tags angegeben -"no DHT receive"=="kein DHT Empfang" -"Accept Crawl: no"=="Akzeptiert Crawl: nein" -"no crawl"=="kein Crawl" -"Accept Crawl: yes"=="Akzeptiert Crawl: ja" -"crawl possible"=="Crawl möglich" -Contact: passive==Kontakt: passiv -Contact: direct==Kontakt: direkt -Seed download: possible==Seed Download: möglich -runtime:==Laufzeit: +"no DHT receive"=="无接收DHT" +"Accept Crawl: no"=="接受crawl: 否" +"no crawl"=="无crawl" +"Accept Crawl: yes"=="接受crawl: 是" +"crawl possible"=="可用crawl" +Contact: passive==通信: 被动 +Contact: direct==通信: 直接 +Seed download: possible==Seed下载: 可用 +runtime:==运行时间: #Peers==Peers #YaCy Cluster==YaCy Cluster ->Network<==>Netzwerk< +>Network<==>网络< #>Online Peers<==>Online Peers< ->Number of
    Documents<==>Anzahl der
    Dokumente< -Indexing Speed:==Indexiergeschwindigkeit: -Pages Per Minute \(PPM\)==Seiten pro Minute (PPM) -Query Frequency:==Abfragegeschwindigkeit: -Queries Per Hour \(QPH\)==Abfragen pro Stunde (QPH) ->Today<==>Heute< ->Last Week<==>Letzte Woche< ->Last Month<==>Letzter Monat< ->Now<==>Jetzt< ->Active<==>Aktiv< ->Passive<==>Passiv< ->Potential<==>Potentiell< ->This Peer<==>Dieser Peer< -URLs for
    Remote Crawl==URLs zum
    Remote Crawlen -"The YaCy Network"=="Das YaCy Netzwerk" - -Indexing
    PPM==Indexier
    PPM -\(public local\)==öffentlich lokal -\(remote\)==(extern) -Your Peer:==Ihr Peer: +>Number of
    Documents<==>文件
    数目< +Indexing Speed:==索引速度: +Pages Per Minute \(PPM\)==页面每分钟(PPM) +Query Frequency:==请求频率: +Queries Per Hour \(QPH\)==请求每小时(QPH) +>Today<==>今天< +>Last Week<==>最近 一周< +>Last Month<==>最近 一月< +>Now<==>现在< +>Active<==>活动< +>Passive<==>被动< +>Potential<==>潜在< +>This Peer<==>此peer< +URLs for
    Remote Crawl==用于远端
    crawl的URL +"The YaCy Network"=="YaCy网络" + +Indexing
    PPM==索引
    PPM +\(public local\)==公共 本地 +\(remote\)==(远程) +Your Peer:==您的peer: #>Name<==>Name< #>Info<==>Info< #>Version<==>Version< #>UTC<==>UTC< ->Uptime<==>Laufzeit< +>Uptime<==>开机时间< #>Links<==>Links< #>RWIs<==>RWIs< -Sent
    Words==Gesendete
    Wörter -Sent
    URLs==Gesendete
    URLs -Received
    Words==Empfangene
    Wörter -Received
    URLs==Empfangene
    URLs -Known
    Seeds==Bekannte
    Seeds -Connects
    per hour==Verbindungen
    pro Stunde +Sent
    Words==已发送
    关键字 +Sent
    URLs==已发送
    URL +Received
    Words==已接收
    关键字 +Received
    URLs==已接收
    URL +Known
    Seeds==已知
    Seeds +Connects
    per hour==联系
    每小时 #Version==Version #Own/Other==Eigene/Andere ->dark green font<==>dunkelgrüne Schrift< -senior/principal peers==Senior/Principal Peers ->light green font<==>hellgrüne Schrift< ->passive peers<==>passive Peers< ->pink font<==>pinke Schrift< -junior peers==Junior Peers -red point==roter Punkt -this peer==Ihr Peer ->grey waves<==>graue Wellen< ->crawling activity<==>Crawl Aktivität< ->green radiation<==>grüne Strahlung< ->strong query activity<==>starke Abfrage Aktivität< ->red lines<==>rote Linien< ->DHT-out<==>DHT ausgehend< ->green lines<==>grüne Linien< ->DHT-in<==>DHT eingehend< +>dark green font<==>深绿色字< +senior/principal peers==高级/主要 peer +>light green font<==>浅绿色字< +>passive peers<==>主动peer< +>pink font<==>粉色字< +junior peers==次级peer +red point==红点 +this peer==此peer +>grey waves<==>灰色波浪< +>crawling activity<==>crawl活动< +>green radiation<==>绿色辐射圆< +>strong query activity<==>强烈请求活动< +>red lines<==>红线< +>DHT-out<==>DHT输出< +>green lines<==>绿线< +>DHT-in<==>DHT输入< #DHT-out==DHT-out #You are in online mode, but probably no internet resource is available.==Sie befinden sich im Online-Modus, aber zur Zeit besteht keine Internetverbindung.You are in online mode, but probably no internet resource is available. #Please check your internet connection.==Bitte überprüfen Sie Ihre Internetverbindung. @@ -1972,324 +1972,324 @@ this peer==Ihr Peer #File: News.html #--------------------------- -Overview==Überblick -Incoming News==eingehende News -Processed News==gelesene News -Outgoing News==ausgehende News -Published News==veröffentlichte News -This is the YaCyNews system \(currently under testing\).==Dies ist das YaCy News-System (zur Zeit noch im Test). -The news service is controlled by several entry points:==Dieser News Service wird von folgenden Punkten initiiert: -A crawl start with activated remote indexing will automatically create a news entry.==Wird ein neuer Crawl mit aktivierter Remote-Crawling-Funktion gestartet, dann wird automatisch ein News-Eintrag erstellt. -Other peers may use this information to prevent double-crawls from the same start point.==Andere Peers können diese Informationen benutzen, um einen doppelten Crawl vom selben Startpunkt zu vermeiden. -A table with recently started crawls is presented on the Index Create - page==Eine Tabelle mit gerade gestarteten Crawls wird auf der "Index erzeugen"-Seite angezeigt. -A change in the personal profile will create a news entry. You can see recently made changes of==Bei einer Änderung im Profil wird auch ein News-Eintrag erstellt. -profile entries on the Network page, where that profile change is visualized with a '\*' beside the 'P' \(profile\) - selector.==Profil Einträge auf der Netzwerk Seite werden nach einer Änderung mit einem '*' neben dem 'P' (Profil) gekennzeichnet. -More news services will follow.==Mehr News Services werden folgen. - -Above you can see four menues:==Sie können diese vier Menüs sehen: -Incoming News \(\#\[insize\]\#\): latest news that arrived your peer.==Eingehende News(#[insize]#): Die neuesten News, die Ihren Peer erreicht haben. -Only these news will be used to display specific news services as explained above.==Nur diese News werden benutzt, um spezifische News Services anzuzeigen. -You can process these news with a button on the page to remove their appearance from the IndexCreate and Network page==Sie können diese News mit einem Button auf der Seite abarbeiten (als "gelesen" markieren). Dann werden diese Nachrichten nicht mehr auf der Netzwerk und der Index Create Seite erscheinen. -Processed News \(\#\[prsize\]\#\): this is simply an archive of incoming news that you removed by processing.==Gelesene News (#[prsize]#): Hier ist ein simples Archiv der bereits gelesenen News. -Outgoing News \(\#\[ousize\]\#\): here your can see news entries that you have created. These news are currently broadcasted to other peers.==Ausgehende News (#[ousize]#): Hier können Sie die News sehen, die durch Sie enstanden sind. Diese News werden sofort an andere Peers übertragen. -you can stop the broadcast if you want.==Sie können die Weiterverteilung stoppen, wenn Sie wollen. -Published News \(\#\[pusize\]\#\): your news that have been broadcasted sufficiently or that you have removed from the broadcast list.==Veröffentlichte News (#[pusize]#): Ihre News, die genügend verbreitet oder aus der Verbreitungsliste gelöscht wurden. -Originator==Initiator -Created==Geschaffen -Category==Kategorie -Received==Empfangen -Distributed==Verteilt -Attributes==Attribute -"\#\(page\)\#::Process Selected News::Delete Selected News::Abort Publication of Selected News::Delete Selected News\#\(/page\)\#"=="#(page)#::Gewählte News als gelesen markieren::Gewählte News löschen::Verbreitung gewählter News abbrechen::Gewählte News löschen#(/page)#" -"\#\(page\)\#::Process All News::Delete All News::Abort Publication of All News::Delete All News\#\(/page\)\#"=="#(page)#::Alle News als gelesen markieren::Alle News löschen::Verbreitung von allen News abbrechen::Alle News löschen#(/page)#" +Overview==概述 +Incoming News==已接收 +Processed News==已处理 +Outgoing News==已生成 +Published News==已发布 +This is the YaCyNews system \(currently under testing\).==这是YaCy新闻系统(测试中). +The news service is controlled by several entry points:==新闻服务由以下动作控制: +A crawl start with activated remote indexing will automatically create a news entry.==使用活动远程索引作为起始点的crawl会自动创建一个新闻条目. +Other peers may use this information to prevent double-crawls from the same start point.==其他的peer能利用此信息以防止相同起始点的二次crawl. +A table with recently started crawls is presented on the Index Create - page=="创建首页"-页面会显示最近启动的crawl. +A change in the personal profile will create a news entry. You can see recently made changes of==个人信息的改变会创建一个新闻条目, 可以在网络页面查看, +profile entries on the Network page, where that profile change is visualized with a '\*' beside the 'P' \(profile\) - selector.==以带有 '*' 的 'P' (资料)标记出. +More news services will follow.==接下来会有更多的新闻服务. + +Above you can see four menues:==上面四个菜单选项分别为: +Incoming News \(\#\[insize\]\#\): latest news that arrived your peer.==已接收新闻(#[insize]#): 发送至您peer的新闻. +Only these news will be used to display specific news services as explained above.==这些消息含有上述的特定新闻服务. +You can process these news with a button on the page to remove their appearance from the IndexCreate and Network page==您可以使用'创建首页'和'网络'页面的设置隐藏它们. +Processed News \(\#\[prsize\]\#\): this is simply an archive of incoming news that you removed by processing.==已处理新闻(#[prsize]#): 此页面显示您已删除的新闻. +Outgoing News \(\#\[ousize\]\#\): here your can see news entries that you have created. These news are currently broadcasted to other peers.==已生成新闻(#[ousize]#): 此页面显示您的peer创建的新闻条目, 默认发布给其他peer. +you can stop the broadcast if you want.==您也可以选择停止发布. +Published News \(\#\[pusize\]\#\): your news that have been broadcasted sufficiently or that you have removed from the broadcast list.==已发布新闻(#[pusize]#): 显示已经完全发布出去的新闻或者已经从发布列表删除的新闻. +Originator==拥有者 +Created==创建时间 +Category==分类 +Received==接收时间 +Distributed==已发布 +Attributes==属性 +"\#\(page\)\#::Process Selected News::Delete Selected News::Abort Publication of Selected News::Delete Selected News\#\(/page\)\#"=="#(page)#::处理选中新闻::删除选中新闻::停止发布选中新闻::删除选中新闻#(/page)#" +"\#\(page\)\#::Process All News::Delete All News::Abort Publication of All News::Delete All News\#\(/page\)\#"=="#(page)#::处理所有新闻::删除所有新闻::停止发布所有新闻::删除所有新闻#(/page)#" #----------------------------- #File: Performance_p.html #--------------------------- -Performance Settings==Leistungseinstellungen -Memory Settings==Speicher Einstellungen -Memory reserved for JVM==Für JVM reservierter Speicher -"Set"=="Setzen" -Resource Observer==Ressourcen Beobachter -DHT-Trigger==DHT-Umschalter -not triggered:==nicht ausgelöst: ->triggered==>ausgelöst -reset state==Status zurücksetzen -HDD==Festplattenspeicher -disable crawls below==Deaktivere Crawls unter -free space==freiem Speicher -disable DHT-in below==Deaktivere eingehende DHT Transfers unter -RAM==Arbeitsspeicher -Accepted change. This will take effect after restart of YaCy==Änderung akzeptiert. Diese werden erst nach einem Neustart von YaCy wirksam -restart now==jetzt neustarten -Confirm Restart==Bestätige Neustart -refresh graph==aktualisiere Diagramm +Performance Settings==性能设置 +Memory Settings==内存设置 +Memory reserved for JVM==JVM内存设置 +"Set"=="设置" +Resource Observer==资源查看 +DHT-Trigger==DHT-触发 +not triggered:==未触发: +>triggered==>已触发 +reset state==重置 +HDD==硬盘 +disable crawls below==停止crawl当低于 +free space==空闲空间 +disable DHT-in below==停止接收DHT当低于 +RAM==内存 +Accepted change. This will take effect after restart of YaCy==已接受改变. 在YaCy重启后生效 +restart now==立即重启 +Confirm Restart==确定重启 +refresh graph==刷新图表 #show memory tables==Zeige Speicher-Tabellen -Use Default Profile:==Standard Profil benutzen: -and use==und nutze -of the defined performance.==der vorgegebenen Geschwindigkeit. -Save==Speichern -Changes take effect immediately==Änderungen werden sofort wirksam -YaCy Priority Settings==YaCy Priorität Einstellungen -YaCy Process Priority==YaCy Prozess Priorität +Use Default Profile:==使用默认配置: +and use==并使用 +of the defined performance.==中的默认性能设置. +Save==保存 +Changes take effect immediately==改变立即生效 +YaCy Priority Settings==YaCy优先级设置 +YaCy Process Priority==YaCy进程优先级 #Normal==Normal -Below normal==unter Normal -Idle==untätig -"Set new Priority"=="Neue Priorität speichern" -Changes take effect after restart of YaCy==Änderungen werden erst nach einem Neustart von YaCy wirksam. -Online Caution Settings==Onlinezugriff Verzögerung Einstellungen -This is the time that the crawler idles when the proxy is accessed, or a local or remote search is done.==Dies ist die Zeit die der Crawler pausiert, wenn auf den Proxy zugegriffen wird, oder eine lokale oder globale Suche durchgeführt wird. -The delay is extended by this time each time the proxy is accessed afterwards.==Die normale Verzögerung wird um diese Zeit verlängert, wenn auf den Proxy zugegriffen wird. -This shall improve performance of the affected process \(proxy or search\).==Dies soll die Performance des betroffenen Prozesses (Proxy oder Suche) erhöhen. -\(current delta is==(Seit dem letzten Zugriff auf Proxy/Lokale-Suche/Globale-Suche sind -seconds since last proxy/local-search/remote-search access.\)==Sekunden vergangen.) -Online Caution Case==Onlinezugriff Typ -indexer delay \(milliseconds\) after case occurency==Indexierer Verzögerung (Millisekunden) nach Onlinezugriff +Below normal==低于普通 +Idle==空闲 +"Set new Priority"=="置为新优先级" +Changes take effect after restart of YaCy==在YaCy重启后生效. +Online Caution Settings==在线警告设置 +This is the time that the crawler idles when the proxy is accessed, or a local or remote search is done.==这是代理被访问或者搜索完成后的一段crawl空闲时间. +The delay is extended by this time each time the proxy is accessed afterwards.==在访问代理后, 会触发此延时, +This shall improve performance of the affected process \(proxy or search\).==从而提高相关进程(代理或者搜索)的性能. +\(current delta is==(当前设置为 +seconds since last proxy/local-search/remote-search access.\)==秒.) +Online Caution Case==触发事件 +indexer delay \(milliseconds\) after case occurency==事件触发后的索引延时(毫秒) #Proxy:==Proxy: -Local Search:==Lokale Suche: -Remote Search:==Remote Suche: -"Enter New Parameters"=="Neue Parameter eintragen" +Local Search:==本地搜索: +Remote Search:==远端搜索: +"Enter New Parameters"=="使用新参数" #----------------------------- #File: PerformanceMemory_p.html #--------------------------- -Performance Settings for Memory==Performanceeinstellungen für Speicher -refresh graph==aktualisiere Diagramm -Memory Usage:==Speichernutzung: -After Startup==Nach Start -After Initializations==Nach Initialisierungen -before GC==vor GC -after GC==nach GC ->Now==>Jetzt -before <==vor < -Description==Beschreibung -maximum memory that the JVM will attempt to use==maximaler Speicher den die JVM nutzen wird ->Available<==>Verfügbar< -total available memory including free for the JVM within maximum==gesamter verfügbarer Speicher für die JVM innerhalb des Maximums. ->Total<==>Gesamt< -total memory taken from the OS==gesamter vom Betriebssystem zugewiesener Speicher ->Free<==>Frei< -free memory in the JVM within total amount==freier Speicher in der JVM innerhalb des Gesamten Speichers ->Used<==>Belegt< -used memory in the JVM within total amount==genutzter Speicher in der JVM innerhalb des Gesamten Speichers +Performance Settings for Memory==内存性能设置 +refresh graph==刷新图表 +Memory Usage:==内存使用: +After Startup==启动后 +After Initializations==初始化后 +before GC==GC前 +after GC==GC前 +>Now==>现在 +before <==未< +Description==描述 +maximum memory that the JVM will attempt to use==JVM使用的最大内存 +>Available<==>可用< +total available memory including free for the JVM within maximum==当前JVM可用剩余内存 +>Total<==>全部< +total memory taken from the OS==操作系统分配内存 +>Free<==>空闲< +free memory in the JVM within total amount==JVM空闲内存 +>Used<==>已用< +used memory in the JVM within total amount==JVM已用内存 #EcoTable RAM Index:==EcoTabelle RAM Index: -Table RAM Index:==Tabelle RAM Speicher Index: ->Size==>Größe ->Key==>Schlüssel ->Value==>Wert +Table RAM Index:==Table使用内存: +>Size==>大小 +>Key==>关键字 +>Value==>值 #FlexTable RAM Index:==FlexTabelle RAM Index: -Table==Tabelle -Chunk Size<==Chunk Größe< +Table==Table +Chunk Size<==块大小< #Count==Anzahl -Used Memory<==Benutzter Speicher< +Used Memory<==已用内存< #Node Caches:==Knoten Cache: -Object Index Caches:==Objekt Index Caches: -Needed Memory==Benötigter Speicher - -Object Read Caches==Objekt Lese Caches ->Read Hit Cache<==>Lese Treffer Cache< ->Read Miss Cache<==>Lese Miss Cache< ->Read Hit<==>Lese Hit< ->Read Miss<==>Lese Verfehler< -Write Unique<==Schreiben einzigartig< -Write Double<==Schreiben mehrfach< -Deletes<==Löschungen< -Flushes<==Leerungen< -Total Mem==Gesamter Speicher -MB \(hit\)==MB (Treffer) -MB \(miss\)==MB (Verfehler) -Stop Grow when less than \#\[objectCacheStopGrow\]\# MB available left==Beende Erweiterung wenn weniger als #[objectCacheStopGrow]# MB verfügbar sind -Start Shrink when less than \#\[objectCacheStartShrink\]\# MB availabe left==Starte Verkleinerung wenn weniger als #[objectCacheStartShrink]# MB verfügbar sind - -Other Caching Structures:==Andere Zwischenspeicher Strukturen: -Type==Typ ->Hit<==>Treffer< ->Miss<==>Verfehler< -Insert<==Einfügen< +Object Index Caches:==Object索引缓存: +Needed Memory==所需内存大小 + +Object Read Caches==Object读缓存 +>Read Hit Cache<==>命中缓存< +>Read Miss Cache<==>丢失缓存< +>Read Hit<==>读命中< +>Read Miss<==>读丢失< +Write Unique<==写入< +Write Double<==写回< +Deletes<==删除< +Flushes<==清理< +Total Mem==全部内存 +MB \(hit\)==MB (命中) +MB \(miss\)==MB (丢失) +Stop Grow when less than \#\[objectCacheStopGrow\]\# MB available left==可用内存低于 #[objectCacheStopGrow]# MB时停止增长 +Start Shrink when less than \#\[objectCacheStartShrink\]\# MB availabe left==可用内存低于 #[objectCacheStartShrink]# MB开始减少 + +Other Caching Structures:==其他缓存结构: +Type==类型 +>Hit<==>命中< +>Miss<==>丢失< +Insert<==插入< Delete<==删除< #DNSCache==DNSCache #DNSNoCache==DNSNoCache #HashBlacklistedCache==HashBlacklistedCache -Search Event Cache<==Suchereignis Cache< +Search Event Cache<==搜索事件缓存< #----------------------------- #File: PerformanceQueues_p.html #--------------------------- -Performance Settings of Queues and Processes==Performanceeinstellungen für Puffer und Prozesse -Scheduled tasks overview and waiting time settings:==Übersicht geplanter Aufgaben und Wartezeiteinstellungen: -Queue Size==Warteschl.-
    länge ->Total==>gesamte +Performance Settings of Queues and Processes==队列和进程性能设置 +Scheduled tasks overview and waiting time settings:==定时任务一览与等待时间设置: +Queue Size==队列.-
    大小 +>Total==>全部 #Block Time== #Sleep Time== #Exec Time== -Idle==untät. ->Busy==>beschäft. -Short Mem
    Cycles==Durchl.
    ohne ausr. Speicher ->per Cycle==>pro Durchlauf ->per Busy-Cycle==>pro beschäft. Durchl. ->Memory Use==>Speicher-
    nutzung ->Delay between==>Verzögerung zwischen ->idle loops==>untät. Durchl. ->busy loops==>beschäft. Durchl. -Minimum of
    Required Memory==Mindestens
    benötigter Speicher -Full Description==Vollständige Beschreibung -Submit New Delay Values==Neue Verzögerungswerte speichern -Changes take effect immediately==Änderungen werden sofort wirksam -Cache Settings:==Cache Einstellungen: +Idle==空闲 +>Busy==>忙碌 +Short Mem
    Cycles==小内存
    周期 +>per Cycle==>每周期 +>per Busy-Cycle==>每次忙碌周期 +>Memory Use==>内存
    使用 +>Delay between==>延时 +>idle loops==>空闲循环 +>busy loops==>忙碌循环 +Minimum of
    Required Memory==最小
    需要内存 +Full Description==完整描述 +Submit New Delay Values==提交新延时值 +Changes take effect immediately==改变立即生效 +Cache Settings:==缓存设置: #RAM Cache==RAM Cache -Description==Beschreibung -URLs in RAM buffer:==URLs im RAM Puffer: -This is the size of the URL write buffer. Its purpose is to buffer incoming URLs==Dies ist die Größe des URL Schreibpuffers. Seine Aufgabe ist es die eingehenden URLs zu puffern -in case of search result transmission and during DHT transfer.==im Falle von Suchergebnisübertragung und während des DHT Transfers. -Words in RAM cache:==Wörter im RAM-Cache -This is the current size of the word caches.==Dies ist die momentane Größe des Wort-Caches. -The indexing cache speeds up the indexing process, the DHT cache holds indexes temporary for approval.==Der Indexing Cache beschleunigt den Indexier Prozess, der DHT Cache enthält temporäre Indizes zum Bestätigen. -The maximum of this caches can be set below.==Das Maximum dieses Cache kann unten festgesetzt werden. -Maximum URLs currently assigned
    to one cached word:==höchste Anzahl URLs die derzeit einem Wort im Zwischenspeicher zugewiesen wurde: -This is the maximum size of URLs assigned to a single word cache entry.==Dies ist die maximale Menge an URLs, die einem einzelnen Wort-Cache Eintrag zugewiesen wurden. -If this is a big number, it shows that the caching works efficiently.==Wenn diese Zahl hoch ist, heißt das, dass der Wort-Cache effizient arbeitet. -Maximum age of a word:==Maximales Alter eines Wortes: -This is the maximum age of a word in an index in minutes.==Dies ist das maximale Alter eines Wortes in einem Index in Minuten. -Minimum age of a word:==Minimales Alter eines Wortes: -This is the minimum age of a word in an index in minutes.==Dies ist das minimale Alter eines Wortes in einem Index in Minuten. -Maximum number of words in cache:==Maximale Wortzahl im Cache: -This is is the number of word indexes that shall be held in the==Dies ist die Anzahl der Wort-indexe die während des Indexierens im -ram cache during indexing. When YaCy is shut down, this cache must be==RAM-Cache gehalten werden sollen. Sobald YaCy herunterfährt muss dieser Cache -flushed to disc; this may last some minutes.==auf die Festplatte gesichert werden; dies kann einige Minuten dauern. +Description==描述 +URLs in RAM buffer:==缓存中URL: +This is the size of the URL write buffer. Its purpose is to buffer incoming URLs==这是URL写缓冲的大小.作用是缓冲接收URL, +in case of search result transmission and during DHT transfer.==以利于结果转移和DHT传递. +Words in RAM cache:==缓存中关键字 +This is the current size of the word caches.==这是当前关键字缓存的大小. +The indexing cache speeds up the indexing process, the DHT cache holds indexes temporary for approval.==此缓存能加速索引进程, 也能用于DHT. +The maximum of this caches can be set below.==此缓存最大值能从下面设置. +Maximum URLs currently assigned
    to one cached word:==关键字拥有最大URL数: +This is the maximum size of URLs assigned to a single word cache entry.==这是单个关键字缓存条目所能分配的最多URL数目. +If this is a big number, it shows that the caching works efficiently.==如果此数值较大, 则表示缓存效率很高. +Maximum age of a word:==关键字最长寿命: +This is the maximum age of a word in an index in minutes.==这是索引内关键字所能存在的最长时间. +Minimum age of a word:==关键字最短寿命: +This is the minimum age of a word in an index in minutes.==这是索引内关键字所能存在的最短时间. +Maximum number of words in cache:==缓存中关键字最大数目: +This is is the number of word indexes that shall be held in the==这是索引时缓存中存在的最大关键字索引数目. +ram cache during indexing. When YaCy is shut down, this cache must be==当YaCy停止时, +flushed to disc; this may last some minutes.==它们会被冲刷到硬盘中, 可能会花费数分钟. #Initial space of words in cache:==Anfangs Freiraum im Word Cache: #This is is the init size of space for words in cache.==Dies ist die Anfangsgröße von Wörtern im Cache. -Enter New Cache Size==Neue Cachegröße eintragen -Balancer Settings==Balancer Einstellungen -This is the time delta between accessing of the same domain during a crawl.==Das ist die Zeitdifferenz zwischen zwei Zugriffen auf dieselbe Domäne während eines Crawls. -The crawl balancer tries to avoid that domains are==Der Crawl Balancer versucht zu vermeiden, dass Domains -accessed too often, but if the balancer fails \(i.e. if there are only links left from the same domain\), then these minimum==zu oft abgefragt werden. Aber wenn der Balancer nicht mehr greift \(z.B. wenn nur noch Links von derselben Domain übrig sind), werden diese Minimum -delta times are ensured.==Zeitdifferenzen eingehalten. +Enter New Cache Size==使用新缓存大小 +Balancer Settings==平衡器设置 +This is the time delta between accessing of the same domain during a crawl.==这是在crawl期间, 访问同一域名的间歇值. +The crawl balancer tries to avoid that domains are==crawl平衡器能够避免频繁地访问同一域名, +accessed too often, but if the balancer fails \(i.e. if there are only links left from the same domain\), then these minimum==如果平衡器失效\(比如相同域名下只剩链接了), 则此有此间歇 +delta times are ensured.==提供访问保障. #>Crawler Domain<==>Crawler Domain< ->Minimum Access Time Delta<==>Minimum Zeitdifferenz zwischen Zugriffen< ->local \(intranet\) crawls<==>Lokale (Intranet) Crawls< ->global \(internet\) crawls<==>Globale (Internet) Crawls< -"Enter New Parameters"=="Neue Parameter Setzen" -Thread Pool Settings:==Threadpool Einstellungen: -maximum Active==max. aktiv -current Active==derzeit aktiv -Enter new Threadpool Configuration==neue Threadpoolkonfiguration eintragen +>Minimum Access Time Delta<==>最小访问间歇< +>local \(intranet\) crawls<==>本地(局域网)crawl< +>global \(internet\) crawls<==>全球(广域网)crawl< +"Enter New Parameters"=="使用新参数" +Thread Pool Settings:==线程池设置: +maximum Active==最大活动 +current Active==当前活动 +Enter new Threadpool Configuration==使用新配置 #----------------------------- #File: PerformanceConcurrency_p.html #--------------------------- -Performance of Concurrent Processes==Performance gleichzeitig laufender Prozesse -serverProcessor Objects==serverProcessor Objekte +Performance of Concurrent Processes==并行进程性能查看 +serverProcessor Objects==处理器对象 #Thread==Thread -Queue Size
    Current==Größe der Warteschlange
    Aktuell -Queue Size
    Current==Größe der Warteschlange
    Maximum -Concurrency:
    Number of Threads==Gleichzeitigkeit:
    Anzahl der Threads -Childs==Kindprozesse -Average
    Block Time
    Reading==Durchschnittlich
    reservierte Zeit
    lesend -Average
    Exec Time==Durchschnittliche Ausführungszeit -Average
    Block Time
    Writing==Durchschnittlich
    reservierte Zeit
    schreibend -Total
    Cycles==Gesamtanzahl Zyklen -Full Description==Volle Beschreibung +Queue Size
    Current==当前队列
    大小 +Queue Size
    Current==当前队列
    大小 +Concurrency:
    Number of Threads==并行:
    线程数 +Childs==子进程 +Average
    Block Time
    Reading==平均
    读取阻塞
    时间 +Average
    Exec Time==平均运行时间 +Average
    Block Time
    Writing==平均
    写阻塞
    时间 +Total
    Cycles==运行次数 +Full Description==完整描述 #----------------------------- #File: PerformanceSearch_p.html #--------------------------- -Performance Settings of Search Sequence==Performanceeinstellungen des Suchablaufs -Search Sequence Timing==Timing des Suchablaufs -Timing results of latest search request:==Timing-Ergebnisse der letzten Suchanfrage: -Query==Abfrage -Event<==Ereignis< -Comment<==Kommentar< -Time<==Zeit< -Duration \(ms\)==Dauer (Millisekunden) -Result-Count==Anzahl Ergebnisse -The network picture below shows how the latest search query was solved by asking corresponding peers in the DHT:==Das Netzwerkbild zeigt wie die letzte Suche durch Anfragen bei zuständigen Peers im DHT gelöst wurde. -red -> request list alive==rot -> Request Liste aktiv -green -> request has terminated==grün -> Request wurde beendet -grey -> the search target hash order position\(s\) \(more targets if a dht partition is used\)<==grau -> Das Suchergebnis hash order position(s) (Mehrere Ziele wenn eine DHT Partition verwendet wird)< -"Search event picture"=="Such Ereignis Bild" +Performance Settings of Search Sequence==搜索时间性能设置 +Search Sequence Timing==搜索时间测量 +Timing results of latest search request:==最近一次搜索请求时间测量结果: +Query==请求 +Event<==事件< +Comment<==注释< +Time<==时间< +Duration \(ms\)==耗时(毫秒) +Result-Count==结果数目 +The network picture below shows how the latest search query was solved by asking corresponding peers in the DHT:==下图显示了通过询问DHT中peer解析的最近搜索请求情况: +red -> request list alive==红色 -> 活动请求列表 +green -> request has terminated==绿色 -> 已终结请求列表 +grey -> the search target hash order position\(s\) \(more targets if a dht partition is used\)<==灰色 -> 搜索目标hash序列位置(如果使用dht会产生更多目标)< +"Search event picture"=="搜索时间图况" #----------------------------- #File: ProxyIndexingMonitor_p.html #--------------------------- -Indexing with Proxy==Indexierung per Proxy -YaCy can be used to 'scrape' content from pages that pass the integrated caching HTTP proxy.==YaCy kann dazu verwendet werden den Inhalt aller Webseiten zu 'crawlen', die den eingebauten HTTP Proxy Server passieren. -When scraping proxy pages then no personal or protected page is indexed;==Beim Indexieren von Seiten aus der Proxy Nutzung werden keine persönlichen oder geschützten Seiten indexiert! +Indexing with Proxy==代理索引 +YaCy can be used to 'scrape' content from pages that pass the integrated caching HTTP proxy.==YaCy能够通过集成缓存HTTP代理进行搜索. +When scraping proxy pages then no personal or protected page is indexed;==当通过代理进行搜索时不会索引私有或者受保护页面; # This is the control page for web pages that your peer has indexed during the current application run-time==Dies ist die Kontrollseite für Internetseiten, die Ihr Peer während der aktuellen Sitzung # as result of proxy fetch/prefetch.==durch Besuchen einer Seite indexiert. # No personal or protected page is indexed==Persönliche Seiten und geschütze Seiten werden nicht indexiert -those pages are detected by properties in the HTTP header \(like Cookie-Use, or HTTP Authorization\)==Solche Seiten werden entweder durch Merkmale im HTTP Header (Kopf der Seite) (z.B.: Cookies oder HTTP Authorisierung) -or by POST-Parameters \(either in URL or as HTTP protocol\)==oder durch POST-Parameter (z.B. in einer URL oder im HTTP Protokoll) erkannt -and automatically excluded from indexing.==und automatisch von der Indexierung ausgeschlossen. - -Proxy Auto Config:==Automatische Proxy Konfiguration: -this controls the proxy auto configuration script for browsers at http://localhost:8090/autoconfig.pac==Diese Einstellung regelt das Automatische Proxy Konfigurationsskript unter http://localhost:8090/autoconfig.pac -.yacy-domains only==nur .yacy Domains -whether the proxy should only be used for .yacy-Domains==Soll der Proxy nur für .yacy Domains verwendet werden diese Checkbox aktivieren. -Proxy pre-fetch setting:==Proxy Indexier Einstellung: -this is an automated html page loading procedure that takes actual proxy-requested==Dies ist eine automatische Web Seiten Lade Funktion, die aktuell besuchte -URLs as crawling start points for crawling.==URLs als Startpunkt zum Indexieren benutzt. -Prefetch Depth==Indexier Tiefe -A prefetch of 0 means no prefetch; a prefetch of 1 means to prefetch all==Bei einer Tiefe von 0 wird nur die besuchte Seite indexiert; eine Tiefe von 1 bedeutet, dass alle Seiten -embedded URLs, but since embedded image links are loaded by the browser==die auf dieser Seite verlinkt sind, geladen und indexiert werden; Da Links auf Bilder sowieso schon vom Browser geladen werden, -this means that only embedded href-anchors are prefetched additionally.==trifft dies nur auf eingebettet HREF-Anker zu. -Store to Cache==Speicher im Cache -It is almost always recommended to set this on. The only exception is that you have another caching proxy running as secondary proxy and YaCy is configured to used that proxy in proxy-proxy - mode.==Es wird empfohlen diese Option immer zu aktivieren. Einzige Ausnahme: Sie haben einen zweiten Proxy als Cache laufen und YaCy soll im "Proxy-zu-Proxy"-Modus laufen. -Do Local Text-Indexing==Lokales Text-Indexieren -If this is on, all pages \(except private content\) that passes the proxy is indexed.==Wenn dieses aktiviert ist, werden alle Seiten (ausser private), die den Proxy passieren, indexiert. -Do Local Media-Indexing==Lokales Medien-Indexieren -This is the same as for Local Text-Indexing, but switches only the indexing of media content on.==Dies ist fast das Gleiche wie beim lokalen Text-Indexieren, nur, dass medialer Inhalt indexiert wird. -Do Remote Indexing==Remote Indexierung -If checked, the crawler will contact other peers and use them as remote indexers for your crawl.==Wenn aktiviert, wird der Crawler andere Peers anfragen und als remote Indexierer für Ihren Crawl nutzen. -If you need your crawling results locally, you should switch this off.==Sollten Sie Ihre Crawling Ergebnisse lokal benötigen, dann deaktivieren Sie diese Funktion. -Only senior and principal peers can initiate or receive remote crawls.==Nur Senior und Principal Peers können einen remote Crawl starten oder empfangen. -Please note that this setting only take effect for a prefetch depth greater than 0.==Bitte berücksichtigen Sie, dass diese Einstellung nur wirkt, wenn Ihre Indexier Tiefe größer als 0 ist. -Proxy generally==Proxy Allgemein -Path==Verzeichnis -The path where the pages are stored \(max. length 300\)==Verzeichnis in dem der Cache sein soll (max. 300 Zeichen) -Size==Größe -The size in MB of the cache.==Die Größe des Cache in MB. -"Set proxy profile"=="Proxy Profil speichern" -The file DATA/PLASMADB/crawlProfiles0.db is missing or corrupted.==Die Datei DATA/PLASMADB/crawlProfiles0.db fehlt entweder oder ist defekt. -Please delete that file and restart.==Bitte löschen Sie diese Datei und starten Sie YaCy neu. -Pre-fetch is now set to depth==Proxy Indexierung erfolgt nun bis zu einer Tiefe von -Caching is now \#\(caching\)\#off\:\:on\#\(/caching\)\#.==Proxy Speichern im Cache ist nun #(caching)#aus::an#(/caching)#. -Local Text Indexing is now \#\(indexingLocalText\)\#off::on==Lokales Text Indexieren ist nun #(indexingLocalText)#aus::an -Local Media Indexing is now \#\(indexingLocalMedia\)\#off::on==Lokales Medien Indexieren ist nun #(indexingLocalMedia)#aus::an -Remote Indexing is now \#\(indexingRemote\)\#off::on==Remote-Indexieren ist nun #(indexingRemote)#aus::an -Cachepath is now set to \'\#\[return\]\#\'. Please move the old data in the new directory.==Der Cache ist nun im Verzeichnis '#[return]#'. Bitte verschieben Sie Ihre alten Daten in das neue Verzeichnis. -Cachesize is now set to \#\[return\]\#MB.==Die Cache Größe ist nun auf #[return]#MB gesetzt. -Changes will take effect after restart only.==Änderungen werden erst nach einem Neustart von YaCy wirksam. -An error has occurred:==Es trat ein Fehler auf: -You can see a snapshot of recently indexed pages==Sie können sich Voransichten von frisch indexierten Seiten -on the==auf der -Page.==Seite ansehen. +those pages are detected by properties in the HTTP header \(like Cookie-Use, or HTTP Authorization\)==通过检测HTTP头部属性(比如cookie用途或者http认证) +or by POST-Parameters \(either in URL or as HTTP protocol\)==或者提交参数(链接或者http协议) +and automatically excluded from indexing.==能够检测出此类网页并在索引时排除. + +Proxy Auto Config:==自动配置代理: +this controls the proxy auto configuration script for browsers at http://localhost:8090/autoconfig.pac==这会影响浏览器代理自动配置脚本 http://localhost:8090/autoconfig.pac +.yacy-domains only==仅 .yacy 域名 +whether the proxy should only be used for .yacy-Domains==代理是否只对 .yacy 域名有效. +Proxy pre-fetch setting:==代理预读设置: +this is an automated html page loading procedure that takes actual proxy-requested==这是一个自动预读网页的过程 +URLs as crawling start points for crawling.==期间会将请求代理的URL作为crawl起始点. +Prefetch Depth==预读深度 +A prefetch of 0 means no prefetch; a prefetch of 1 means to prefetch all==设置为0则不预读; 设置为1预读所有嵌入链接, +embedded URLs, but since embedded image links are loaded by the browser==但是嵌入图像链接是由浏览器读取, +this means that only embedded href-anchors are prefetched additionally.==这意味着只预读嵌入式链接的顶层部分. +Store to Cache==存储至缓存 +It is almost always recommended to set this on. The only exception is that you have another caching proxy running as secondary proxy and YaCy is configured to used that proxy in proxy-proxy - mode.==推荐打开此项设置. 唯一的例外是您有另一个缓存代理作为二级代理并且YaCy设置为使用'代理到代理'模式. +Do Local Text-Indexing==进行本地文本索引 +If this is on, all pages \(except private content\) that passes the proxy is indexed.==如果打开此项设置, 所有通过代理的网页(除了私有内容)都会被索引. +Do Local Media-Indexing==进行本地媒体索引 +This is the same as for Local Text-Indexing, but switches only the indexing of media content on.==与本地文本索引类似, 但是仅当'索引媒体内容'打开时有效. +Do Remote Indexing==进行远程索引 +If checked, the crawler will contact other peers and use them as remote indexers for your crawl.==如果被选中, crawler会联系其他peer并将之作为远程索引器. +If you need your crawling results locally, you should switch this off.==如果仅需要本地索引结果, 可以关闭此项. +Only senior and principal peers can initiate or receive remote crawls.==只有高级peer和主要peer能初始化和接收远端crawl. +Please note that this setting only take effect for a prefetch depth greater than 0.==请注意, 此设置仅在预读深度大于0时有效. +Proxy generally==代理杂项设置 +Path==路径 +The path where the pages are stored \(max. length 300\)==存储页面的路径(最大300个字符长度) +Size==大小 +The size in MB of the cache.==缓存大小(MB). +"Set proxy profile"=="保存设置" +The file DATA/PLASMADB/crawlProfiles0.db is missing or corrupted.==文件 DATA/PLASMADB/crawlProfiles0.db 丢失或者损坏. +Please delete that file and restart.==请删除此文件并重启. +Pre-fetch is now set to depth==预读深度现为 +Caching is now \#\(caching\)\#off\:\:on\#\(/caching\)\#.==缓存现已 #(caching)#关闭::打开#(/caching)#. +Local Text Indexing is now \#\(indexingLocalText\)\#off::on==本地文本索引现已 #(indexingLocalText)#关闭::打开 +Local Media Indexing is now \#\(indexingLocalMedia\)\#off::on==本地媒体索引现已 #(indexingLocalMedia)#关闭::打开 +Remote Indexing is now \#\(indexingRemote\)\#off::on==远程索引现已 #(indexingRemote)#关闭::打开 +Cachepath is now set to \'\#\[return\]\#\'. Please move the old data in the new directory.==缓存路径现为 '#[return]#'. 请将旧文件移至此目录. +Cachesize is now set to \#\[return\]\#MB.==缓存大小现为 #[return]#MB. +Changes will take effect after restart only.==改变仅在重启后生效. +An error has occurred:==发生错误: +You can see a snapshot of recently indexed pages==你可以在 +on the== +Page.==页面查看最近索引页面快照. #----------------------------- #File: QuickCrawlLink_p.html #--------------------------- -Quick Crawl Link==Schnell Crawl Link -Quickly adding Bookmarks:==Schnell Crawl Lesezeichen: -Simply drag and drop the link shown below to your Browsers Toolbar/Link-Bar.==Ziehen Sie einfach den unten stehenden Link auf Ihre Browser Toolbar/Linkbar. -If you click on it while browsing, the currently viewed website will be inserted into the YaCy crawling queue for indexing.==Wenn Sie, während Sie surfen, auf dieses Lesezeichen klicken, wird die gerade betrachtete Seite zum YaCy Crawler-Puffer hinzugefügt, um indexiert zu werden. -Crawl with YaCy==Mit YaCy crawlen -Title:==Titel: -Link:==link: -Status:==Status: -URL successfully added to Crawler Queue==Die Url wurde erfolgreich zum Crawler-Puffer hinzugefügt. -Malformed URL==Fehler in der URL -Unable to create new crawling profile for URL:==Es ist nicht möglich für diese URL ein Crawling Profil zu erstellen: -Unable to add URL to crawler queue:==Es ist nicht möglich die URL zum Crawler-Puffer hinzuzufügen: +Quick Crawl Link==快速crawl链接 +Quickly adding Bookmarks:==快速添加书签: +Simply drag and drop the link shown below to your Browsers Toolbar/Link-Bar.==仅需拖动以下链接至浏览器工具栏/书签栏. +If you click on it while browsing, the currently viewed website will be inserted into the YaCy crawling queue for indexing.==如果在浏览网页时点击, 当前查看页面会被插入到crawl队列已用于索引 +Crawl with YaCy==用YaCy进行crawl +Title:==标题: +Link:==链接: +Status:==状态: +URL successfully added to Crawler Queue==已成功添加链接到crawl队列. +Malformed URL==异常链接 +Unable to create new crawling profile for URL:==创建链接crawl信息失败: +Unable to add URL to crawler queue:==添加链接到crawl队列失败: #----------------------------- #File: Ranking_p.html #--------------------------- -Ranking Configuration==Ranking Einstellungen -The document ranking influences the order of the search result entities.==Das Dokument Ranking beeinflusst die Reihenfolge der Suchergebnis Datensätze. -A ranking is computed using a number of attributes from the documents that match with the search word.==Ein Ranking wird berechnet mit einer Anzahl von Attributen aus den Dokumenten die das gesuchte Wort enthalten. -The attributes are first normalized over all search results and then the normalized attribut is multiplied with the ranking coefficient computed from this list.==Die Attribute werden zuerst über alle Suchergebnisse normalisiert und dann wird das normalisierte Attribut multpliziert mit dem Ranking Koeffizienten der aus dieser Liste errechnet wird. -The ranking coefficient grows exponentially with the ranking levels given in the following table.==Der Ranking Koeffizient wächst exponential mit den Ranking Werten die in der folgenden Tabelle festgelegt werden. -If you increase a single value by one, then the strength of the parameter doubles.==Wenn Sie einen einzelnen Wert um eins erhöhen wird die Stärke des Parameters verdoppelt. -Pre-Ranking==Vor-Ranking +Ranking Configuration==排名配置 +The document ranking influences the order of the search result entities.==排名影响到搜索结果的排列顺序. +A ranking is computed using a number of attributes from the documents that match with the search word.==通过计算所有符合搜索关键字的文件属性, 从而得到排名. +The attributes are first normalized over all search results and then the normalized attribut is multiplied with the ranking coefficient computed from this list.==第一次搜索时, 所有结果的文件属性会被初始化, 然后计算列表中排名系数并更改这些数值. +The ranking coefficient grows exponentially with the ranking levels given in the following table.==排名系数根据下表排名级别呈指数增长. +If you increase a single value by one, then the strength of the parameter doubles.==如果值加1, 则参数影响强度加倍. +Pre-Ranking==预排名 # Aktuell sind die Werte und Hover over Information in der Ranking_p.java hartcodiert und können nicht übersetzt werden # @@ -2297,647 +2297,647 @@ Pre-Ranking==Vor-Ranking #a higher ranking level prefers younger documents.==Ein höherer Ranking Level bevorzugt jüngere Dokumente #The age of a document is measured using the date submitted by the remote server as document date==Das Alter eines Dokuments wird gemessen anhand des Dokument Datums das der Remote Server übermittelt -There are two ranking stages:==Es gibt zwei Phasen beim Ranking. -first all results are ranked using the pre-ranking and from the resulting list the documents are ranked again with a post-ranking.==Zuerst werden alle Resultate nach dem Vor-Ranking geranked und aus der resultierenden Liste werden die Dokumente erneut im Nach-Ranking sortiert. -The two stages are separated because they need statistical information from the result of the pre-ranking.==Die zwei Phasen sind getrennt weil statistische Informationen aus dem Ergebnis des Vor-Rankings benötigt werden. +There are two ranking stages:==有两个排名阶段: +first all results are ranked using the pre-ranking and from the resulting list the documents are ranked again with a post-ranking.==首先对搜索结果进行一次排名, 然后再对首次排名结果进行二次排名. +The two stages are separated because they need statistical information from the result of the pre-ranking.==两个结果是分开的, 因为它们都需要上次排名的统计结果. -Post-Ranking==Nach-Ranking +Post-Ranking==二次排名 #Application Of Prefer Pattern==Anwendung eines bevorzugten Musters #a higher ranking level prefers documents where the url matches the prefer pattern given in a search request.==Ein höherer Ranking Level bevorzugt Dokumente deren URL auf das bevorzugte Muster einer Suchanfrage passt. -"Set as Default Ranking"=="Als Standard Ranking speichern" -"Re-Set to Built-In Ranking"=="Auf ursprüngliche Werte zurücksetzen" +"Set as Default Ranking"=="保存为默认排名" +"Re-Set to Built-In Ranking"=="重置排名设置" #----------------------------- #File: RemoteCrawl_p.html #--------------------------- -Remote Crawl Configuration==Remote Crawl Konfiguration +Remote Crawl Configuration==远端crawl配置 #>Remote Crawler<==>Remote Crawler< -The remote crawler is a process that requests urls from other peers.==Der Remote Crawler ist ein Prozess der URLs bei anderen Peer anfragt. -Peers offer remote-crawl urls if the flag \'Do Remote Indexing\'==Peers bieten Remote Crawls an wenn das Flag 'Nutze Remote Indexierung' -is switched on when a crawl is started.==gesetzt ist wenn ein Crawl gestartet wird. -Remote Crawler Configuration==Remote Crawler Konfiguration ->Accept Remote Crawl Requests<==>Akzeptiere Remote Crawl Anfragen< -Perform web indexing upon request of another peer.==Führe auf Anfragen eines anderen Peers Web Indexing durch. -Load with a maximum of==Lade mit einem Maximum an -pages per minute==Seiten pro Minute -"Save"=="Speichern" -Crawl results will appear in the==Die Anzeige der Crawl Ergebnisse erfolgt im ->Crawl Result Monitor<==>Crawl Ergebnis Monitor< -Peers offering remote crawl URLs==Peers die Remote Crawl URLs anbieten -If the remote crawl option is switched on, then this peer will load URLs from the following remote peers:==Wenn die Remote Crawl Option aktiviert ist, dann wird dieser Peer URLs von den folgenden Remote Peers laden: +The remote crawler is a process that requests urls from other peers.==远端crawler是一个请求来自其他peer url的进程. +Peers offer remote-crawl urls if the flag \'Do Remote Indexing\'==如果选中了'进行远程索引', 则peer在开始crawl时 +is switched on when a crawl is started.==能够进行远端crawl. +Remote Crawler Configuration==远端crawler配置 +>Accept Remote Crawl Requests<==>接受远端crawl请求< +Perform web indexing upon request of another peer.==收到另一peer请求时进行网页索引. +Load with a maximum of==最多每分钟读取 +pages per minute==个页面 +"Save"=="保存" +Crawl results will appear in the==crawl会出现在 +>Crawl Result Monitor<==>crawl结果监视< +Peers offering remote crawl URLs==提供远端crawl的peer +If the remote crawl option is switched on, then this peer will load URLs from the following remote peers:==如果选中了远端crawl选项, 则此peer会从以下远端peer读取链接: #>Name<==>Name< #>Remote
    Crawl<==>Remote
    Crawl< #>Release/
    SVN<==>Version/
    SVN< ->PPM<==>==>Seiten pro Minute (PPM)< ->QPH<==>Anfragen pro Stunde (QPH)< ->Last
    Seen<==>Zuletzt
    Gesehen< ->UTC
    Offset<==>UTC
    Abweichung< +>PPM<==>==>页面每分钟(PPM)< +>QPH<==>请求每小时(QPH)< +>Last
    Seen<==>上次
    出现< +>UTC
    Offset<==>UTC
    时区< #>Uptime<==>Uptime< #>Links<==>Links< #>RWIs<==>RWIs< ->Age<==>Alter< +>Age<==>寿命< #----------------------------- #File: Settings_p.html #--------------------------- -Advanced Settings==Erweiterte Einstellungen -If you want to restore all settings to the default values,==Wenn Sie alle Einstellungen auf die ursprünglichen Werte zurücksetzen wollen, -but forgot your administration password, you must stop the proxy,==aber Ihr Administatorpasswort vergessen haben, müssen Sie YaCy stoppen, -delete the file 'DATA/SETTINGS/yacy.conf' in the YaCy application root folder and start YaCy again.==die Datei 'DATA/SETTINGS/yacy.conf' im YaCy Hauptordner löschen und YaCy neu starten. +Advanced Settings==高级设置 +If you want to restore all settings to the default values,==如果要恢复所有默认设置, +but forgot your administration password, you must stop the proxy,==但是忘记了管理员密码, 则您必须首先停止代理, +delete the file 'DATA/SETTINGS/yacy.conf' in the YaCy application root folder and start YaCy again.==删除YaCy根目录下的 'DATA/SETTINGS/yacy.conf' 并重启. #Performance Settings of Queues and Processes==Performanceeinstellungen für Puffer und Prozesse -Performance Settings of Busy Queues==Performanceeinstellungen für Puffer und Prozesse -Performance of Concurrent Processes==Performance der gleichzeitig laufenden Prozesse -Performance Settings for Memory==Performanceeinstellungen für Speicher -Performance Settings of Search Sequence==Performanceeinstellungen des Suchablaufs +Performance Settings of Busy Queues==忙碌队列性能设置 +Performance of Concurrent Processes==并行进程性能 +Performance Settings for Memory==内存性能设置 +Performance Settings of Search Sequence==搜索时间性能设置 ### --- Those 3 items are removed in latest SVN BEGIN -Viewer and administration for database tables==Administration der Datenbank Tabellen -Viewer for Peer-News==Einstellungen Peer Nachrichten -Viewer for Cookies in Proxy==Einstellung Cookie Überwachung +Viewer and administration for database tables==查看与管理数据库表格 +Viewer for Peer-News==查看peer新闻 +Viewer for Cookies in Proxy==查看代理cookie ### --- Those 3 items are removed in latest SVN END -Server Access Settings==Server Zugangs-Einstellungen -Proxy Access Settings==Proxy Zugangs-Einstellungen +Server Access Settings==服务器访问设置 +Proxy Access Settings==代理访问设置 #Content Parser Settings==Inhalt Parser Einstellungen -Crawler Settings==Crawler Einstellungen -HTTP Networking==HTTP Netzwerk +Crawler Settings==Crawler设置 +HTTP Networking==HTTP网络 #Remote Proxy \(optional\)==Remote Proxy (optional) -Seed Upload Settings==Seed Upload Einstellungen -Message Forwarding \(optional\)==Nachrichten Weiterleitung (optional) +Seed Upload Settings==Seed上传设置 +Message Forwarding \(optional\)==消息发送(可选) #----------------------------- #File: Settings_Crawler.inc #--------------------------- -Generic Crawler Settings==Allgemeine Crawler Einstellungen -Connection timeout in ms==Verbindungs-Timeout in ms -means unlimited==schaltet die Begrenzung ab -HTTP Crawler Settings:==HTTP Crawler Einstellungen: -Maximum Filesize==Maximale Dateigröße -FTP Crawler Settings==FTP Crawler Einstellungen -SMB Crawler Settings==SMB Crawler Einstellungen -Local File Crawler Settings==Lokales Dateisystem Crawler Einstellungen -Maximum allowed file size in bytes that should be downloaded==Maximale Größe der herunterzuladenden Datei in Byte -Larger files will be skipped==Größere Dateien werden übersprungen -Please note that if the crawler uses content compression, this limit is used to check the compressed content size==Beachten Sie, dass beim Herunterladen der Dateien mittels "Content-Compression" die komprimierte Dateigröße maßgeblich ist -Submit==Speichern -Changes will take effect immediately==Änderungen sind sofort aktiv +Generic Crawler Settings==普通crawler设置 +Connection timeout in ms==连接超时(ms) +means unlimited==表示无超时 +HTTP Crawler Settings:==HTTP crawler设置: +Maximum Filesize==文件最大尺寸 +FTP Crawler Settings==FTP crawler设置 +SMB Crawler Settings==SMB crawler设置 +Local File Crawler Settings==本地文件crawler设置 +Maximum allowed file size in bytes that should be downloaded==允许下载的最大文件尺寸(字节) +Larger files will be skipped==超出此限制的文件将被忽略 +Please note that if the crawler uses content compression, this limit is used to check the compressed content size==请注意, 如果crawler使用内容压缩, 则此限制对压缩后文件大小有效. +Submit==提交 +Changes will take effect immediately==改变立即生效 #----------------------------- #File: Settings_Http.inc #--------------------------- -HTTP Networking==HTTP Netzwerk -Transparent Proxy==Transparenter Proxy -With this you can specify if YaCy can be used as transparent proxy.==Hiermit können Sie festlegen ob YaCy als transparenter Proxy genutzt werden kann. -Hint: On linux you can configure your firewall to transparently redirect all http traffic through yacy using this iptables rule==Hinweis: Unter Linux können Sie Ihre Firewall darauf einstellen, alle HTTP-Verbindungen transparent an YaCy weiterzuleiten indem Sie diese iptables-Regel verwenden. -Connection Keep-Alive==Verbindung halten -With this you can specify if YaCy should support the HTTP connection keep-alive feature.==Hiermit können Sie festlegen ob YaCy die HTTP connection keep-alive Funktionalität unterstützen soll. -Send "Via" Header==Sende "Via" Header -Specifies if the proxy should send the Via==Gibt an, ob der Proxy den Via-HTTP-Header -http header according to RFC 2616 Sect 14.45.==gemäß RFC 2616 Sect 14.45 senden soll. -Send "X-Forwarded-For" Header== Sende "X-Forward-For" Header -Specifies if the proxy should send the X-Forwarded-For http header.==Gibt an, ob der Proxy den X-forwarded-For HTTP-Header setzen soll. -"Submit"=="Speichern" -Changes will take effect immediately.==Änderungen sind sofort wirksam. +HTTP Networking==HTTP网络 +Transparent Proxy==透明代理 +With this you can specify if YaCy can be used as transparent proxy.==选此指定YaCy作为透明代理. +Hint: On linux you can configure your firewall to transparently redirect all http traffic through yacy using this iptables rule==提示: Linux系统中, 您可以使用如下iptables规则转发所有http流量 +Connection Keep-Alive==保持连接 +With this you can specify if YaCy should support the HTTP connection keep-alive feature.==选此指定YaCy支持HTTP连接保持特性. +Send "Via" Header==发送"Via"头 +Specifies if the proxy should send the Via==选此指定代理是否发送"Via"HTTP头 +http header according to RFC 2616 Sect 14.45.==根据RFC 2616 Sect14.45. +Send "X-Forwarded-For" Header== 发送"X-Forward-For"头 +Specifies if the proxy should send the X-Forwarded-For http header.==指定代理是偶发送"X-Forward-For"头. +"Submit"=="提交" +Changes will take effect immediately.==改变立即生效. #----------------------------- #File: Settings_Proxy.inc #--------------------------- -YaCy can use another proxy to connect to the internet. You can enter the address for the remote proxy here:==YaCy kann einen anderen Proxy nutzen um sich zum Internet zu verbinden. Sie können die Adresse für den Remote Proxy hier eingeben. -Use remote proxy==Nutze Remote Proxy -Enables the usage of the remote proxy by yacy==Aktiviert die Nutzung des Remote Proxies durch YaCy -Use remote proxy for yacy <-> yacy communication==Nutze Remote Proxy für YaCy <-> YaCy Kommunikation -Specifies if the remote proxy should be used for the communication of this peer to other yacy peers.==Gibt an, ob der Remote Proxy für Kommunikation zwischen diesem und anderen YaCy-Peers genutzt werden soll. -Hint: Enabling this option could cause this peer to remain in junior status.==Hinweis: Dies könnte dazu führen, dass dieser Peer im Junior-Status verbleibt. -Use remote proxy for HTTPS==Nutze Remote Proxy für HTTPS -Specifies if YaCy should forward ssl connections to the remote proxy.==Gibt an, ob YaCy SSL-Verbindungen zum Remote Proxy weiterleiten soll. -Remote proxy host==Remote Proxy Host -The ip address or domain name of the remote proxy==Die IP-Adresse oder der Domainname des Remote Proxy -Remote proxy port==Remote Proxy Port -the port of the remote proxy==Der Port des Remote Proxy -Remote proxy user==Remote Proxy Benutzer -Remote proxy password==Remote Proxy Passwort -No-proxy adresses==Proxylose Adressen -IP addresses for which the remote proxy should not be used==IP-Adressen für die der Remote Proxy nicht genutzt werden soll -"Submit"=="Speichern" -Changes will take effect immediately.==Änderungen sind sofort wirksam. +YaCy can use another proxy to connect to the internet. You can enter the address for the remote proxy here:==YaCy能够通过第二代理连接到网络, 在此输入远程代理地址. +Use remote proxy==使用远程代理 +Enables the usage of the remote proxy by yacy==打开以支持远程代理 +Use remote proxy for yacy <-> yacy communication==为YaCy <-> YaCy 通信使用代理 +Specifies if the remote proxy should be used for the communication of this peer to other yacy peers.==选此指定远程代理是否支持YaCy peer间通信. +Hint: Enabling this option could cause this peer to remain in junior status.==提示: 打开此选项后本地peer会被置为次级peer. +Use remote proxy for HTTPS==为HTTPS使用远程代理 +Specifies if YaCy should forward ssl connections to the remote proxy.==选此指定YaCy是否使用SSL代理. +Remote proxy host==远程代理主机 +The ip address or domain name of the remote proxy==远程代理的IP地址或者域名 +Remote proxy port==远程代理端口 +the port of the remote proxy==远程代理使用的端口 +Remote proxy user==远程代理用户 +Remote proxy password==远程代理用户密码 +No-proxy adresses==无代理地址 +IP addresses for which the remote proxy should not be used==指定不使用代理的IP地址 +"Submit"=="提交" +Changes will take effect immediately.==改变立即生效. #----------------------------- #File: Settings_ProxyAccess.inc #--------------------------- -Proxy Access Settings==Proxyzugangs Einstellungen -These settings configure the access method to your own http proxy and server.==Diese Einstellungen beeinflussen den Zugriff auf Ihren HTTP-Proxy und -Server. -All traffic is routed throug one single port, for both proxy and server.==Alle Verbindungen werden durch einen einzigen Port hergestellt, für beides (Proxy und Server). -Server/Proxy Port Configuration==Server/Proxy Port Konfiguration -The socket addresses where YaCy should listen for incoming connections from other YaCy peers or http clients.==Die Socket-Adressen auf denen YaCy auf eingehende Verbindungen von anderen YaCy-Peers oder HTTP-Clients warten soll. -You have four possibilities to specify the address:==Sie haben vier Möglichkeiten die Adresse anzugeben: -defining a port only==nur einen Port angeben -e.g. 8090==z.B. 8090 -defining IP address and port==eine IP-Adresse und Port angeben -e.g. 192.168.0.1:8090==z.B. 192.168.0.1:8090 -defining host name and port==einen Hostnamen und Port angeben -e.g. home:8090==z.B. home:8090 -defining interface name and port==einen Interface-namen und Port angeben +Proxy Access Settings==代理访问设置 +These settings configure the access method to your own http proxy and server.==设定http代理和服务器的访问方式. +All traffic is routed throug one single port, for both proxy and server.==代理和服务器流量均从同一端口流过. +Server/Proxy Port Configuration==服务器/代理 端口设置 +The socket addresses where YaCy should listen for incoming connections from other YaCy peers or http clients.==指定YaCy需要监听的socket地址. +You have four possibilities to specify the address:==可以设置以下四个地址: +defining a port only==仅指定一个端口 +e.g. 8090==比如 8090 +defining IP address and port==指定IP地址和端口 +e.g. 192.168.0.1:8090==比如 192.168.0.1:8090 +defining host name and port==指定域名和端口 +e.g. home:8090==比如 home:8090 +defining interface name and port==指定网络接口和端口 e.g. #eth0:8090==z.B. #eth0:8090 -Hint: Dont forget to change your firewall configuration after you have changed the port.==Hinweis: Denken Sie daran Ihre Firewalleinstellungen zu ändern nachdem Sie den Port geändert haben. -Proxy and http-Server Administration Port==Proxy und HTTP-Server Administrations Port -Changes will take effect in 5-10 seconds==Die Änderungen werden in 5-10 Sekunden wirksam -Server Access Restrictions==Server Zugangsbeschränkungen -You can restrict the access to this proxy/server using a two-stage security barrier:==Sie können den Zugang zu diesem Proxy/Server mit einer 2-stufigen Sicherheitsbarriere einschränken: -define an access domain with a list of granted client IP-numbers or with wildcards==geben Sie einen Netzwerkadressraum mithilfe einer Liste zugelassener Client-IP-Adressen oder mit Platzhaltern an -define an user account with an user:password - pair==geben Sie einen Nutzeraccount mit einem nutzer:passwort-Paar an -This is the account that restricts access to the proxy function.==Dies sind die Nutzer denen der Zugriff auf die Proxyfunktion gewährt wird. -You probably don't want to share the proxy to the internet, so you should set the==Sie wollen den Proxy vermutlich nicht im Internet zur Verfügung stellen, deshalb sollten Sie -IP-Number Access Domain to a pattern that corresponds to you local intranet.==den IP-Adressraum so einstellen, dass er auf Ihr lokales Intranet zutrifft. -The default setting should be right in most cases. If you want, you can also set a proxy account==Die Standardwerte sollten in den meisten Fällen richtig sein. Wenn Sie wollen können Sie auch Proxyaccounts erstellen -so that every proxy user must authenticate first, but this is rather unusual.==, sodass sich jeder Proxynutzer zuerst anmelden muss, aber das ist eher unüblich. -IP-Number filter==IP-Adressen Filter -Use access domain with a list of granted client IP-numbers or with wildcards==定义一个带有授权IP名单或者通配符的访问域 +define an user account with an user:password - pair==创建一个需要密码的用户账户 +This is the account that restricts access to the proxy function.==这是一个限制代理访问功能的账户. +You probably don't want to share the proxy to the internet, so you should set the==如果不想在互联网上共享代理, +IP-Number Access Domain to a pattern that corresponds to you local intranet.==请定义一个对应本地局域网的IP访问域表达式. +The default setting should be right in most cases. If you want, you can also set a proxy account==默认设置适用于大多数情况. 如果需要共享代理, +so that every proxy user must authenticate first, but this is rather unusual.==请先设置需要授权的代理账户. +IP-Number filter==IP地址过滤 +Use ==Pfad -The remote path on the FTP server, like==Der Remote-Pfad auf dem FTP-Server, wie -Missing sub-directories are NOT created automatically.==Fehlende Unterverzeichnisse werden NICHT automatisch erstellt. -Username==Benutzername -Your log-in at the FTP server==Ihr Login auf dem FTP-Server -Password==Passwort -The password==Das Passwort -"Submit"=="Speichern" +Uploading via FTP:==通过FTP上传: +This is the account for a FTP server where you can host a seed-list file.==此账户能够访问FTP服务器以存储seed列表文件. +If you set this, you will become a principal peer.==如果设置了此选项, 本地peer会被置为主要peer. +Your peer will then upload the seed-bootstrap information periodically,==您的peer会定期上传seed启动信息, +but only if there had been changes to the seed-list.==前提是seed列表有变更. +The host where you have a FTP account, like==ftp服务器, 比如 +Path==路径 +The remote path on the FTP server, like==ftp服务器上传路径, 比如 +Missing sub-directories are NOT created automatically.==不会自动创建缺少的子目录. +Username==用户名 +Your log-in at the FTP server==ftp服务器用户名 +Password==密码 +The password==用户密码 +"Submit"=="提交" #----------------------------- #File: Settings_Seed_UploadScp.inc #--------------------------- -Uploading via SCP:==Upload per SCP: -This is the account for a server where you are able to login via ssh.==Dies ist der Account für einen Server, auf dem Sie sich per SSH anmelden müssen. +Uploading via SCP:==通过SCP上传: +This is the account for a server where you are able to login via ssh.==设置通过ssh访问服务器的账户. #Server==Server -The host where you have an account, like 'my.host.net'==Der Host auf dem Sie einen Account haben, wie z.B. 'mein.host.net' +The host where you have an account, like 'my.host.net'==主机, 比如'my.host.net' #Server Port==Server Port -The sshd port of the host, like '22'==Der SSHD Port vom Host z.B. '22' -Path==Pfad -The remote path on the server, like '~/yacy/seed.txt'. Missing sub-directories are NOT created automatically.==Der Remote Pfad auf dem Server z.B. '~/yacy/seed.txt'. Fehlende Unterverzeichnise werden NICHT automatisch erstellt. -Username==Benutzername -Your log-in at the server==Ihr Login auf dem Server -Password==Passwort -The password==Das Passwort -"Submit"=="Speichern" +The sshd port of the host, like '22'==ssh端口, 比如'22' +Path==路径 +The remote path on the server, like '~/yacy/seed.txt'. Missing sub-directories are NOT created automatically.==ssh服务器上传路径, 比如'~/yacy/seed.txt'. 不会自动创建缺少的子目录. +Username==用户名 +Your log-in at the server==ssh服务器用户名 +Password==密码 +The password==用户密码 +"Submit"=="提交" #----------------------------- #File: Settings_ServerAccess.inc #--------------------------- -Server Access Settings==Serverzugangs Einstellungen -IP-Number filter:==IP-Addressfilter: -Here you can restrict access to the server.==Hier können Sie den Zugang zum Server beschränken. -By default, the access is not limited,==Standardmäßig ist der Zugang unbeschränkt, -because this function is needed to spawn the p2p index-sharing function.==da dies notwendig ist um den P2P-Indextausch zu ermöglichen. -If you block access to your server \(setting anything else than \'\*\'\), then you will also be blocked==Wenn Sie den Zugang zu Ihrem Server blockieren (Einstellen von irgendetwas anderem als '*') dann werden Sie auch davon ausgeschlossen -from using other peers' indexes for search service.==den Index anderer Peers zur Suche zu verwenden. -However, blocking access may be correct in enterprise environments where you only want to index your==Wie auch immer, in Unternehmensumgebungen kann ein Blockieren richtig sein, -company's own web pages.==wenn Sie nur die Unternehmenseigenen Websites indexieren wollen. -staticIP \(optional\):==statische IP (optional): -The staticIP can help that your peer can be reached by other peers in case that your==Die statische IP kann helfen Ihren Peer für andere Peers erreichbar zu machen, falls Sie -peer is behind a firewall or proxy. You can create a tunnel through the firewall/proxy==hinter einer Firewall oder einem Proxy sind. Sie können einen Tunnel durch die Firewall/Proxy erzeugen -\(look out for 'tunneling through https proxy with connect command'\) and create==(sehen Sie nach "Tunnelung durch einen https Proxy mit verbinden-Befehl") und erzeugen Sie -an access point for incoming connections.==einen Zugriffspunkt für eingehende Verbindungen. -This access address can be set here \(either as IP number or domain name\).==Diese Zugrifssadresse kann hier angegeben werden (oder als IP Nummer oder Domain-Name). -If the address of outgoing connections is equal to the address of incoming connections,==Wenn die Zugriffsadresse der ausgehenden Verbindungen dieselbe ist wie die der eingehenden Verbindungen, -you don't need to set anything here, please leave it blank.==brauchen Sie hier nichts angeben. Bitte lassen Sie das Feld leer. -ATTENTION: Your current IP is recognized as "#\[clientIP\]#".==ACHTUNG: Ihre aktuelle IP wird als "#[clientIP]#" erkannt. -If the value you enter here does not match with this IP,==Wenn der Wert, den Sie hier eingegeben haben, nicht mit dieser IP übereinstimmt, -you will not be able to access the server pages anymore.==wird es nicht möglich sein auf die Serverseiten zuzugreifen. -value="Submit"==value="speichern" +Server Access Settings==服务器访问设置 +IP-Number filter:==IP地址过滤: +Here you can restrict access to the server.==通过此限制访问服务器的IP. +By default, the access is not limited,==默认情况下, 不对访问作限制, +because this function is needed to spawn the p2p index-sharing function.==否则会影响p2p索引共享功能. +If you block access to your server \(setting anything else than \'\*\'\), then you will also be blocked==如果作了访问限制(不要设置'*'), +from using other peers' indexes for search service.==不能使用其他peer的索引. +However, blocking access may be correct in enterprise environments where you only want to index your==然而, 在企业环境中, 如果仅需要索引公司内部网页, +company's own web pages.==则可作相应限制. +staticIP \(optional\):==静态IP (可选): +The staticIP can help that your peer can be reached by other peers in case that your==如果您在防火墙或者代理后, +peer is behind a firewall or proxy. You can create a tunnel through the firewall/proxy==静态IP能够确保其他peer能够找到您. 您可以创建一个穿过防火墙/代理的通道, +\(look out for 'tunneling through https proxy with connect command'\) and create==(查找"通过connect命令创建https代理通道") +an access point for incoming connections.==以给其他peer提供访问点. +This access address can be set here \(either as IP number or domain name\).==在此设置访问地址(IP地址或者域名). +If the address of outgoing connections is equal to the address of incoming connections,==如果流出链接的地址和流入链接的相同, +you don't need to set anything here, please leave it blank.==请留空此栏. +ATTENTION: Your current IP is recognized as "#\[clientIP\]#".==注意: 当前您的为"#[clientIP]#". +If the value you enter here does not match with this IP,==如果您输入的IP与此IP不符, +you will not be able to access the server pages anymore.==那么您就不能访问服务器页面了. +value="Submit"==value="提交" #----------------------------- #File: SettingsAck_p.html #--------------------------- -YaCy \'\#\[clientname\]\#\': Settings Acknowledge==YaCy '#[clientname]#': Einstellung Verarbeitung -Settings Receipt:==Einstellungen angenommen: -No information has been submitted==Es wurden keine Informationen übertragen. -Error with submitted information.==Es gab einen Fehler bei der Übertragung der Informationen. -Nothing changed.

    ==Nichts wurde verändert.

    -The user name must be given.==Der User Name muss angegeben werden -Your request cannot be processed.==Ihre Anfrage konnte nicht bearbeitet werden. -The password redundancy check failed. You have probably misstyped your password.==Die Passwortüberprüfung schlug fehl. Sie haben sich wahrscheinlich vertippt. -Shutting down.
    Application will terminate after working off all crawling tasks.==Runterfahren
    Die Anwendung wird geschlossen, nachdem alle Crawls abgearbeitet wurden. -Your administration account setting has been made.==Ihre Administrator Account Einstellungen wurden gespeichert. -Your new administration account name is \#\[user\]\#. The password has been accepted.
    If you go back to the Settings page, you must log-in again.==Ihr neuer Administrator Account Name ist #[user]#. Das Passwort wurde akzeptiert.
    Wenn Sie zurück zu den Einstellungen gehen wollen, müssen Sie sich neu einloggen. -Your proxy access setting has been changed.==Die Proxy Zugangs Einstellungen wurden geändert. -Your proxy account check has been disabled, since you did not supply a password.==Ihr Proxy Account Test wurde deaktiviert, weil sie kein Passwort eingegeben haben. -The new proxy IP filter is set to==Der neue Proxy IP-Filter ist -The proxy port is:==Der Proxy Port ist: -Port rebinding will be done in a few seconds.==Die Port Neubindung wird in wenigen Sekunden abgeschlossen sein. -You can reach your YaCy server under the new location==Sie können Ihren YaCy Server unter folgender neuer Adresse erreichen: -Your proxy access setting has been changed.==Ihre Proxy Zugangs Einstellung wurden geändert. -Your server access filter is now set to==Ihr Proxy Zugangs Filter ist nun gesetzt auf -Auto pop-up of the Status page is now disabled==Das automatisches Pop-Up der Status Seite beim Browserstart ist nun deaktiviert. -Auto pop-up of the Status page is now enabled==Das automatisches Pop-Up der Status Seite beim Browserstart ist nun aktiviert. -You are now permanently online.==Sie sind nun im permanenten Online Modus. -After a short while you should see the effect on the====Nach kurzer Zeit können Sie die Änderungen auf der -status page.==Status-Seite sehen. -The Peer Name is:==Der Name dieses Peers ist: -Your static Ip\(or DynDns\) is:==Ihre statische IP(oder DynDns) ist: -Seed Settings changed.\#\(success\)\#::You are now a principal peer.==Seed Einstellungen wurden geändert.#(success)#::Sie sind nun ein Principal Peer. -Seed Settings changed, but something is wrong.==Seed Einstellungen wurden geändert, aber etwas stimmt nicht. -Seed Uploading was deactivated automatically.==Seed Upload wurde automatisch deaktiviert. -Please return to the settings page and modify the data.==Bitte kehren Sie zu den Einstellungen zurück und modifizieren Sie die Daten. -The remote-proxy setting has been changed==Die remote-proxy Einstellungen wurden geändert. -The new setting is effective immediately, you don't need to re-start.==Die neuen Einstellungen wirken sofort. Sie brauchen den Peer nicht neu zu starten. -The submitted peer name is already used by another peer. Please choose a different name. The Peer name has not been changed.==Der eingegebene Peername wird bereits von einem anderen Peer benutzt. Bitte wählen Sie einen anderen Namen. Der Peername wurde nicht geändert. -Your Peer Language is:==Ihre Peer Sprache ist: +YaCy \'\#\[clientname\]\#\': Settings Acknowledge==YaCy '#[clientname]#': 设置 +Settings Receipt:==菜单设置: +No information has been submitted==未提交信息. +Error with submitted information.==提交信息发生错误. +Nothing changed.

    ==无任何改变.

    +The user name must be given.==必须给出用户名. +Your request cannot be processed.==不能响应请求. +The password redundancy check failed. You have probably misstyped your password.==密码冗余检查错误. +Shutting down.
    Application will terminate after working off all crawling tasks.==正在关闭
    所有crawl任务完成后程序会关闭. +Your administration account setting has been made.==已创建管理账户设置. +Your new administration account name is \#\[user\]\#. The password has been accepted.
    If you go back to the Settings page, you must log-in again.==新帐户名是 #[user]#. 密码输入正确.
    如果返回设置页面, 需要再次输入密码. +Your proxy access setting has been changed.==代理访问设置已改变. +Your proxy account check has been disabled, since you did not supply a password.==不能进行代理账户检查, 密码不正确. +The new proxy IP filter is set to==代理IP过滤设置为 +The proxy port is:==代理端口号: +Port rebinding will be done in a few seconds.==端口在几秒后绑定完成. +You can reach your YaCy server under the new location==可以通过新位置访问YaCy服务器: +Your proxy access setting has been changed.==代理访问设置已改变. +Your server access filter is now set to==服务器访问过滤为 +Auto pop-up of the Status page is now disabled==自动弹出状态页面关闭. +Auto pop-up of the Status page is now enabled==自动弹出状态页面打开. +You are now permanently online.==您现在处于永久在线状态. +After a short while you should see the effect on the====一会儿可以在 +status page.==Status 页面看到变化. +The Peer Name is:==peer名: +Your static Ip\(or DynDns\) is:==静态IP(或DynDns)为: +Seed Settings changed.\#\(success\)\#::You are now a principal peer.==seed设置已改变.#(success)#::本地peer已成为主要peer. +Seed Settings changed, but something is wrong.==seed设置已改变, 但是未完全成功. +Seed Uploading was deactivated automatically.==seed上传自动关闭. +Please return to the settings page and modify the data.==请返回设置页面修改参数. +The remote-proxy setting has been changed==远程代理设置已改变. +The new setting is effective immediately, you don't need to re-start.==新设置立即生效. +The submitted peer name is already used by another peer. Please choose a different name. The Peer name has not been changed.==提交的peer名已存在, 请更改. peer名未改变. +Your Peer Language is:==peer语言: The submitted peer name is not well-formed. Please choose a different name. The Peer name has not been changed. Peer names must not contain characters other than (a-z, A-Z, 0-9, '-', '_') and must not be longer than 80 characters. #The new parser settings where changed successfully.==Die neuen Parser Einstellungen wurden erfolgreich gespeichert. Parsing of the following mime-types was enabled: -Seed Upload method was changed successfully.==Seed Upload Methode wurde erfolgreich geändert. -You are now a principal peer.==Sie sind nun ein Principal Peer. -Seed Upload Method:==Seed Upload Methode: -Seed File URL:==Seed Datei URL: -Your proxy networking settings have been changed.==Ihre Proxy Netzwerk Einstellungen wurden geändert. -Transparent Proxy Support is:==Durchsichtige Proxy Unterstützung ist: -Connection Keep-Alive Support is:==Verbindung aufrecht erhalten Unterstützung ist: -Your message forwarding settings have been changed.==Ihre Nachrichten Weiterleitungseinstellungen haben sich geändert. -Message Forwarding Support is:==Nachrichten Weiterleitungs Unterstützung: -Message Forwarding Command:==Nachrichten Weiterleitungskommando: -Recipient Address:==Empfänger Adresse: -Please return to the settings page and modify the data.==Bitte kehren Sie zu den Einstellungen zurück und modifizieren Sie die Daten. -You are now event-based online.==Sie sind nun im aktivitätsbasierten Modus. -After a short while you should see the effect on the==Nach kurzer Zeit können Sie die Änderungen auf der -You are now in Cache Mode.==Sie sind nun im Cache Modus. -Only Proxy-cache ist available in this mode.==Nur der Proxy Cache ist in diesem Modus verfügbar. -After a short while you should see the effect on the==Nach kurzer Zeit können Sie die Änderungen auf der -You can now go back to the==Sie können nun zurück zu den -Settings page if you want to make more changes.==Einstellungen gehen, um weitere Änderungen vorzunehmen. -You can reach your YaCy server under the new location==Dieser YaCy-Peer kann nun unter seiner neuen Adresse erreicht werden: +Seed Upload method was changed successfully.==seed上传方式改变成功. +You are now a principal peer.==本地peer已成为主要peer. +Seed Upload Method:==seed上传方式: +Seed File URL:==seed文件URL: +Your proxy networking settings have been changed.==代理网络设置已改变. +Transparent Proxy Support is:==透明代理支持: +Connection Keep-Alive Support is:==连接保持支持: +Your message forwarding settings have been changed.==消息发送设置已改变. +Message Forwarding Support is:==消息发送支持: +Message Forwarding Command:==消息: +Recipient Address:==收件人地址: +Please return to the settings page and modify the data.==请返回设置页面修改参数. +You are now event-based online.==您现在处于事件驱动在线. +After a short while you should see the effect on the==查看变化 +You are now in Cache Mode.==您现在处于Cache模式. +Only Proxy-cache ist available in this mode.==此模式下仅代理缓存可用. +After a short while you should see the effect on the==查看变化 +You can now go back to the==现在可返回 +Settings page if you want to make more changes.==设置 页面, 如果需要更改更多参数的话. +You can reach your YaCy server under the new location==现在可以通过新位置访问YaCy服务器: #----------------------------- #File: Settings_MessageForwarding.inc #--------------------------- -Message Forwarding==Nachrichten Weiterleitung -With this settings you can activate or deactivate forwarding of yacy-messages via email.==Mit diesen Einstellungen können Sie die Weiterleitung von YaCy-Nachrichten per E-Mail aktivieren oder deaktivieren. -Enable message forwarding==Aktiviere Nachrichten Weiterleitung -Enabling/Disabling message forwarding via email.==Aktivieren/Deaktivieren der Nachrichten Weiterleitung per E-Mail. -Forwarding Command==Weiterleitungskommando -The command-line program that should be used to forward the message.
    ==Das Kommandozeilenprogramm, das verwendet werden soll um die Nachricht weiterzuleiten.
    -Forwarding To==Weiterleiten An -The recipient email-address.
    ==Die E-Mail Adresse des Empfängers.
    -e.g.:==z.B.: -"Submit"=="Speichern" -Changes will take effect immediately.==Änderungen sind sofort wirksam. +Message Forwarding==消息发送 +With this settings you can activate or deactivate forwarding of yacy-messages via email.==此设置能打开或关闭电邮发送yacy消息. +Enable message forwarding==打开消息发送 +Enabling/Disabling message forwarding via email.==打开/关闭email发送. +Forwarding Command==发送命令 +The command-line program that should be used to forward the message.
    ==将用于发送消息的命令行程序.
    +Forwarding To==发送给 +The recipient email-address.
    ==收件人email地址.
    +e.g.:==比如: +"Submit"=="提交" +Changes will take effect immediately.==改变立即生效. #----------------------------- #File: sharedBlacklist_p.html #--------------------------- -Shared Blacklist==Freigegebene Blacklist -Add Items to Blacklist==添加 von Daten zur Blacklist -Unable to store the items into the blacklist file:==Es war nicht möglich in folgender Blacklist Datei die Daten zu speichern: +Shared Blacklist==共享黑名单 +Add Items to Blacklist==添加条目到黑名单 +Unable to store the items into the blacklist file:==不能存储条目到黑名单文件: #File Error! Wrong Path?==Datei Fehler! Falscher Pfad? -YaCy-Peer "\#\[name\]\#" not found.==YaCy Peer YaCy-Peer "#[name]#" nicht gefunden. -not found or empty list.==nicht gefunden oder leere Liste. -Wrong Invocation! Please invoke with==Falscher Aufruf! Bitte nur so aufrufen -Blacklist source:==Blacklist Quelle: -Blacklist target:==Blacklist Ziel: -Blacklist item==Blacklist Eintrag -"select all"=="alle auswählen" -"deselect all"=="alle abwählen" -value="add"==value="hinzufügen" +YaCy-Peer "\#\[name\]\#" not found.==YaCy peer"#[name]#" 未找到. +not found or empty list.==未找到或者列表为空. +Wrong Invocation! Please invoke with==调用错误! 请使用配合 +Blacklist source:==黑名单源: +Blacklist target:==黑名单目的: +Blacklist item==黑名单条目 +"select all"=="全部选择" +"deselect all"=="全部反选" +value="add"==value="添加" #----------------------------- #File: Status.html #--------------------------- -Console Status==Konsolen Status -Log-in as administrator to see full status==Als Administrator einloggen, für kompletten Status -Welcome to YaCy!==Willkommen bei YaCy! -Your settings are _not_ protected!==Ihre Einstellungen sind _nicht_ mit einem Kennwort geschützt! -Please open the accounts configuration page immediately==Bitte öffnen Sie die Benutzerverwaltung sofort -and set an administration password.==und geben Sie ein Administrator Passwort ein. -You have not published your peer seed yet. This happens automatically, just wait.==Ihr Peer ist dem Netzwerk noch nicht bekannt. Warten Sie noch ein wenig, dies geschieht automatisch. -The peer must go online to get a peer address.==Ihr Peer muss online gehen, um eine Adresse zu bekommen. -You cannot be reached from outside.==Ihr Peer kann nicht von außen erreicht werden. -A possible reason is that you are behind a firewall, NAT or Router.==Ein möglicher Grund ist, dass Sie sich hinter einer Firewall, NAT oder einem Router befinden. -But you can search the internet using the other peers'==Trotzdem können Sie das Internet durchsuchen, indem Sie den globalen Index -global index on your own search page.==der anderen Peers von Ihrer Suchseite aus benutzen. -"bad"=="schlecht" -"idea"="idee" -"good"="gut" -"Follow YaCy on Twitter"=="Folge YaCy auf Twitter" -We encourage you to open your firewall for the port you configured \(usually: 8090\),==Wir möchten Sie ermutigen den Port, den Sie für YaCy eingestellt haben (Vorgabe: 8090) in Ihrer Firewall zu öffnen, -or to set up a 'virtual server' in your router settings \(often called DMZ\).==oder einen "virtuellen Server" in Ihrem Router aufzusetzten (oft auch DMZ genannt). -Please be fair, contribute your own index to the global index.==Bitte seien Sie fair und tragen Sie Ihren Teil zum globalen Index bei! -Free disk space is lower than \#\[minSpace\]\#. Crawling has been disabled. Please fix==Der freie Festplattenspeicher ist geringer als #[minSpace]#. Crawling wurde deaktiviert. Bitte beheben Sie -it as soon as possible and restart YaCy.==dieses Problem so schnell wie möglich und starten Sie YaCy neu. -Free memory is lower than \#\[minSpace\]\#. DHT has been disabled. Please fix==Es steht weniger als #[minSpace]# Arbeitsspeicher zur Verfügung. DHT wurde deaktiviert. Bitte beheben Sie -Latest public version is==Die neueste stabile Version ist -You can download a more recent version of YaCy. Click here to install this update and restart YaCy:==Sie können eine aktuellere Version von YaCy herunterladen. Klicken Sie hier, um dieses Update zu installieren und YaCy neu zu starten: +Console Status==控制台状态 +Log-in as administrator to see full status==登录管理用户以查看完整状态 +Welcome to YaCy!==欢迎使用YaCy! +Your settings are _not_ protected!==您的设置未受保护! +Please open the accounts configuration page immediately==请打开账户设置 页面 +and set an administration password.==并设置管理密码. +You have not published your peer seed yet. This happens automatically, just wait.==尚未发布您的peer seed. 将会自动发布, 请稍候. +The peer must go online to get a peer address.==peer必须上线获得peer地址. +You cannot be reached from outside.==外部不能访问您的peer. +A possible reason is that you are behind a firewall, NAT or Router.==很可能是您在防火墙, NAT或者路由的后面. +But you can search the internet using the other peers'==但是您依然能进行搜索 +global index on your own search page.==, 需要通过其他peer的全球索引. +"bad"=="坏" +"idea"="主意" +"good"="好" +"Follow YaCy on Twitter"=="在Twitter上关注YaCy" +We encourage you to open your firewall for the port you configured \(usually: 8090\),==我们推荐您开发防火墙端口(通常是: 8090), +or to set up a 'virtual server' in your router settings \(often called DMZ\).==或者在路由设置中(DMZ)建立一个"虚拟服务器". +Please be fair, contribute your own index to the global index.==请公平地贡献您的索引给全球索引. +Free disk space is lower than \#\[minSpace\]\#. Crawling has been disabled. Please fix==空闲磁盘空间低于 #[minSpace]#. crawl已被关闭, +it as soon as possible and restart YaCy.==请尽快修复并重启YaCy. +Free memory is lower than \#\[minSpace\]\#. DHT has been disabled. Please fix==空闲内存低于 #[minSpace]#. DHT已被关闭, +Latest public version is==最新版本为 +You can download a more recent version of YaCy. Click here to install this update and restart YaCy:==您可以下载最新版本YaCy, 点此进行升级并重启: #"Update YaCy"=="Update YaCy" -Install YaCy==Installiere YaCy -You are running a server in senior mode and you support the global internet index,==Sie lassen YaCy bei sich im Senior Modus laufen und unterstützen den globalen Index, -which you can also search yourself.==den Sie auch selbst durchsuchen können. -You have a principal peer because you publish your seed-list to a public accessible server==Sie haben einen Principal Peer, weil Sie Ihre Seed-Liste auf einen öffentlich zugänglichen Server hoch laden, -where it can be retrieved using the URL==von wo aus sie unter folgender Adresse erreichbar ist: -Your Web Page Indexer is idle. You can start your own web crawl here==Ihr Webseiten Indexierer ist untätig. Sie können hier einen Web Crawl starten -Your Web Page Indexer is busy. You can monitor your web crawl here.==Ihr Webseiten Indexierer ist beschäftigt. Sie können Ihren Web Crawl hier kontrollieren +Install YaCy==安装YaCy +You are running a server in senior mode and you support the global internet index,==服务器运行在高级模式, 并支持全球索引, +which you can also search yourself.==在其中您也能进行本地搜索. +You have a principal peer because you publish your seed-list to a public accessible server==您拥有一个主要peer, 因为您向公共服务器公布了您的seed列表, +where it can be retrieved using the URL==可使用此URL进行接收: +Your Web Page Indexer is idle. You can start your own web crawl here==网页索引器当前空闲. 可以点击这里开始网页crawl +Your Web Page Indexer is busy. You can monitor your web crawl here.==网页索引器当前忙碌. 点击这里查看状态. #----------------------------- #File: Status_p.inc #--------------------------- #System Status==System Status -Process==Prozess -Unknown==unbekannt -Uptime==Online seit -System Resources==Systemressourcen -Processors:==Prozessoren: -Protection==Sicherheit -Password is missing==Kein Passwort -password-protected==Passwort-geschützt -Unrestricted access from localhost==Uneingeschränkter Zugriff von localhost -Address==Adresse -peer address not assigned==Peer Adresse nicht zugewiesen -Public Address:==Öffentliche Adresse: -YaCy Address:==YaCy Adresse: +Process==进程 +Unknown==未知 +Uptime==运行时间 +System Resources==系统资源 +Processors:==处理器: +Protection==保护 +Password is missing==无密码 +password-protected==受密码保护 +Unrestricted access from localhost==本地无限制访问 +Address==地址 +peer address not assigned==未分配peer地址 +Public Address:==公共地址: +YaCy Address:==YaCy地址: #Peer Host==Peer Host #Port Forwarding Host==Port Forwarding Host -not used==nicht benutzt -broken==unterbrochen -connected==verbunden +not used==未使用 +broken==已损坏 +connected==已连接 #Remote Proxy==Remote Proxy -not used==nicht benutzt -Used for YaCy -> YaCy communication:==Benutzt zur YaCy -> YaCy Kommunikation: -WARNING:==WARNUNG: -You do this on your own risk.==Sie verwenden diese Einstellung auf Ihr eigenes Risiko. -If you do this without YaCy running on a desktop-pc or without Java 6 installed, this will possibly break startup.==Wenn Sie diese Option verwenden, ohne dass YaCy auf einem Desktop PC läuft, oder ohne installiertes Java 6, wird YaCy vermutlich nicht mehr starten. -In this case, you will have to edit the configuration manually in DATA/SETTINGS/yacy.conf==In dem Fall müssen Sie die Konfiguration manuell in der folgenden Konfigurationsdatei ändern DATA/SETTINGS/yacy.conf ->Experimental<==>Experimentell< -Yes==Ja -No==Nein -Auto-popup on start-up==Auto-Popup beim Starten -Disabled==Deaktiviert -Enable\]==Aktivieren] -Enabled ==Zurücksetzen -Incoming Connections==Eingehende Verbindungen -Active:==Aktiv: +not used==未使用 +Used for YaCy -> YaCy communication:==用于YaCy -> YaCy通信: +WARNING:==注意: +You do this on your own risk.==此动作危险. +If you do this without YaCy running on a desktop-pc or without Java 6 installed, this will possibly break startup.==如果您不是在台式机上或者已安装Java6的机器上运行, 可能会破坏开机程序. +In this case, you will have to edit the configuration manually in DATA/SETTINGS/yacy.conf==在此情况下, 您需要手动修改配置文件 DATA/SETTINGS/yacy.conf +>Experimental<==>实验性< +Yes==是 +No==否 +Auto-popup on start-up==启动时自动弹出 +Disabled==关闭 +Enable\]==打开] +Enabled ==重启 +Incoming Connections==流入连接 +Active:==活动: #Max:Max: #Indexing Queue==Indexier Puffer -Loader Queue==Lade Puffer -paused==angehalten -Queues==Puffer -Local Crawl==Lokales Crawlen -Remote triggered Crawl==eingehende Remote-Crawls -Pre-Queueing==Vor-Pufferung -Seed server==Seed Server -Configure==Konfigurieren -Enabled: Updating to server==Aktiviert, Seed Server: +Loader Queue==加载器队列 +paused==已暂停 +Queues==队列 +Local Crawl==本地crawl +Remote triggered Crawl==引入远端crawl +Pre-Queueing==预排序 +Seed server==seed服务器 +Configure==配置 +Enabled: Updating to server==已打开, 与服务器同步: Last upload: #\[lastUpload\]# ago.==Letzte Aktualisierung vor: #\[lastUpload\]# -Enabled: Updating to file==Aktiviert: Aktualisiere die Datei +Enabled: Updating to file==已打开: 与文件同步 #----------------------------- #File: Steering.html #--------------------------- -Steering==Steuerung -Checking peer status...==Überprüfe Peer Status ... -Peer is online again, forwarding to status page...==Peer ist wieder online. Weiterleitung auf Status Seite ... -Peer is not online yet, will check again in a few seconds...==Peer ist noch nicht online. Nächste Prüfung in wenigen Sekunden ... -No action submitted==Keine Aktion übermittelt -Go back to the Settings page==Zurück zur Seite mit den Erweiterten Einstellungen -Your system is not protected by a password==Ihr System wird nicht von einem Passwort geschützt -Please go to the User Administration page and set an administration password.==Bitte legen Sie ein Administrator Passwort auf der Seite Benutzerverwaltung fest. -You don't have the correct access right to perform this task.==Sie haben nicht die Erlaubnis diese Anwendung auszuführen. -Please log in.==Bitte melden Sie sich an. -You can now go back to the Settings page if you want to make more changes.==Sie können nun zurück auf die Einstellungen Seite gehen, wenn Sie weitere Änderungen vornehmen wollen. -See you soon!==Bis bald! -Just a moment, please!==Einen Moment bitte! -Application will terminate after working off all scheduled tasks.==YaCy Proxy wird beendet, nachdem alle ausstehenden Aufgaben abgearbeitet wurden. -Then YaCy will restart.==Dann wird YaCy neu gestartet. -If you can't reach YaCy's interface after 5 minutes restart failed.==Wenn Sie nach 5 Minuten nicht auf das YaCy Interface zugreifen können, dann ist der Neustart fehlgeschlagen. -Installing release==Installiere Release -YaCy will be restarted after installation==YaCy wird nach der Installation neugestartet +Steering==向导 +Checking peer status...==正在检查peer状态... +Peer is online again, forwarding to status page...==peer再次上线, 正在传输状态... +Peer is not online yet, will check again in a few seconds...==peer尚未上线, 几秒后重新检测... +No action submitted==未提交动作 +Go back to the Settings page==将返回设置页面 +Your system is not protected by a password==您的系统未受密码保护 +Please go to the User Administration page and set an administration password.==请在用户管理页面设置管理密码. +You don't have the correct access right to perform this task.==无执行此任务权限. +Please log in.==请登录. +You can now go back to the Settings page if you want to make more changes.==您现在可以返回设置页面进行详细设置. +See you soon!==See you soon! +Just a moment, please!==请稍候. +Application will terminate after working off all scheduled tasks.==程序在所有任务完成后将停止, +Then YaCy will restart.==然后YaCy会重新启动. +If you can't reach YaCy's interface after 5 minutes restart failed.==如果5分钟后不能访问此页面说明重启失败. +Installing release==正在安装 +YaCy will be restarted after installation==YaCy在安装完成后会重新启动 #----------------------------- #File: Supporter.html #--------------------------- -Supporter<==Unterstützer< +Supporter<==参与者< "Please enter a comment to your link recommendation. (Your Vote is also considered without a comment.)" -Supporter are switched off for users without authorization==Die Unterstützer-Seiten sind ausgeschaltet für Benutzer ohne Erlaubnis -"bookmark"=="Lesezeichen" -"Add to bookmarks"=="Zu den Lesezeichen hinzufügen" -"positive vote"=="Positive Bewertung" -"Give positive vote"=="Link positiv bewerten" -"negative vote"=="Negative Bewertung" -"Give negative vote"=="Link negativ bewerten" -provided by YaCy peers with an URL in their profile. This shows only URLs from peers that are currently online.==bereitgestellt durch YaCy Peers mit einer URL in ihrem Profil. Es werden nur URLs von Peers angezeigt, die online sind. +Supporter are switched off for users without authorization==未授权用户不属于参与者范畴 +"bookmark"=="书签" +"Add to bookmarks"=="添加到书签" +"positive vote"=="好评" +"Give positive vote"=="给予好评" +"negative vote"=="差评" +"Give negative vote"=="给予差评" +provided by YaCy peers with an URL in their profile. This shows only URLs from peers that are currently online.==由各peer提供. 仅显示peer中当前在线的URL. #----------------------------- #File: Surftips.html #--------------------------- -Surftips==Surftipps -Surftips==Surftipps -Surftips are switched off==Surftipps sind ausgeschaltet -title="bookmark"==title="Lesezeichen" -alt="Add to bookmarks"==alt="Zu den Lesezeichen hinzufügen" -title="positive vote"==title="Positive Bewertung" -alt="Give positive vote"==alt="Link positiv bewerten" -title="negative vote"==title="Negative Bewertung" -alt="Give negative vote"==alt="Link negativ bewerten" -YaCy Supporters<==YaCy Unterstützer< ->a list of home pages of yacy users<==>Eine Liste von Homepages von YaCy Nutzern< -provided by YaCy peers using public bookmarks, link votes and crawl start points==automatisch erzeugt durch öffentliche Lesezeichen, Link-Bewertungen und Crawl-Startpunkte anderer YaCy-Peers -"Please enter a comment to your link recommendation. \(Your Vote is also considered without a comment.\)"=="Bitte geben Sie zu Ihrer Linkempfehlung einen Kommentar ein. (Ihre Stimme wird auch ohne Kommentar angenommen.)" -"authentication required"=="Autorisierung erforderlich" -Hide surftips for users without autorization==Verberge Surftipps für Benutzer ohne Autorisierung -Show surftips to everyone==Zeige Surftipps allen Benutzern +Surftips==建议 +Surftips==建议 +Surftips are switched off==建议已关闭 +title="bookmark"==title="书签" +alt="Add to bookmarks"==alt="添加到书签" +title="positive vote"==title="好评" +alt="Give positive vote"==alt="给予好评" +title="negative vote"==title="差评" +alt="Give negative vote"==alt="给予差评" +YaCy Supporters<==YaCy参与者< +>a list of home pages of yacy users<==>YaCy用户的主页< +provided by YaCy peers using public bookmarks, link votes and crawl start points==由使用公共书签, 链接评价和crawl起始点的peer提供 +"Please enter a comment to your link recommendation. \(Your Vote is also considered without a comment.\)"=="输入推荐链接备注. (可留空.)" +"authentication required"=="需要认证" +Hide surftips for users without autorization==隐藏非认证用户的建议功能 +Show surftips to everyone==所有人均可使用建议 #----------------------------- #File: Table_API_p.html #--------------------------- -: Peer Steering==: Peer Steuerung -Steering of API Actions<==Steuerung der API Aktionen< -This table shows actions that had been issued on the YaCy interface==Diese Tabelle zeigt Aktionen, die auf dem YaCy Interface ausgelöst wurden, -to change the configuration or to request crawl actions.==um Konfigurationen zu ändern oder Crawl Aktionen anzufordern. -These recorded actions can be used to repeat specific actions and to send them==Diese aufgezeichneten Aktionen können dazu verwendet werden, bestimmte Aktionen wiederholt auszuführen und um sie -to a scheduler for a periodic execution.==einem Scheduler für periodische Ausführung zu übergeben. ->Recorded Actions<==>Aufgezeichnete Aktionen< -"next page"=="Nächste Seite" -"previous page"=="Vorherige Seite" -"next page"=="Keine nächste Seite" -"previous page"=="Keine vorherige Seite" - of \#\[of\]\#== von #[of]# ->Date==>Datum ->Type==>Typ ->Comment==>Kommentar -Call
    Count<==Aufruf
    Zähler< -Recording<==Aufzeichnungs< -Last Exec==Letzte Ausführung -Next Exec==Nächste Ausführung ->Scheduler<==>Geplante Ausführung< +: Peer Steering==: Peer向导 +Steering of API Actions<==API动作向导< +This table shows actions that had been issued on the YaCy interface==此表显示YaCy用于 +to change the configuration or to request crawl actions.==改变配置或者请求crawl的动作接口函数. +These recorded actions can be used to repeat specific actions and to send them==它们用于重复执行某一指定动作, +to a scheduler for a periodic execution.==或者用于周期执行一系列动作. +>Recorded Actions<==>已记录动作< +"next page"=="下一页" +"previous page"=="上一页" +"next page"=="下一页" +"previous page"=="上一页" + of \#\[of\]\#== 共 #[of]# +>Date==>日期 +>Type==>类型 +>Comment==>注释 +Call
    Count<==调用
    次数< +Recording<==正在记录< +Last Exec==上次 执行 +Next Exec==下次 执行 +>Scheduler<==>定时器< #>URL<==>URL ->no repetition<==>keine Wiederholung< ->activate scheduler<==>Ausführung planen< -"Execute Selected Actions"=="Führe ausgewählte Aktionen aus" -"Delete Selected Actions"=="Lösche ausgewählte Aktionen" ->Result of API execution==>Ergebnis der API Ausführung +>no repetition<==>无安排< +>activate scheduler<==>激活定时器< +"Execute Selected Actions"=="执行选中活动" +"Delete Selected Actions"=="删除选中活动" +>Result of API execution==>API执行结果 #>Status<==>Status> #>URL<==>URL< ->minutes<==>Minuten< ->hours<==>Stunden< ->days<==>Tage< -Scheduled actions are executed after the next execution date has arrived within a time frame of \#\[tfminutes\]\# minutes.==Geplante Aktionen werden innerhalb eines #[tfminutes]# Minuten Zeitfensters ausgeführt wenn der nächste Ausführungszeitpunkt erreicht wurde. +>minutes<==>分钟< +>hours<==>小时< +>days<==>天< +Scheduled actions are executed after the next execution date has arrived within a time frame of \#\[tfminutes\]\# minutes.==已安排动作会在 #[tfminutes]# 分钟后执行. #----------------------------- #File: Table_RobotsTxt_p.html #--------------------------- -Table Viewer==Tabellenanzeige -The information that is presented on this page can also be retrieved as XML==Die Informationen auf dieser Seite können auch im XML Format abgerufen werden -Click the API icon to see the XML.==Klicken Sie auf das API Symbol, um das XML anzeigen zu lassen. -To see a list of all APIs, please visit the API wiki page.==Um eine Liste aller APIs zu sehen, besuchen Sie die API Seite im Wiki. ->robots.txt table<==>robots.txt Tabelle< +Table Viewer==表格查看 +The information that is presented on this page can also be retrieved as XML==此页信息也可表示为XML +Click the API icon to see the XML.==点击API图标查看XML. +To see a list of all APIs, please visit the API wiki page.==查看所有API列表, 请访问API wiki. +>robots.txt table<==>robots.txt 列表< #----------------------------- ### This Tables section is removed in current SVN Versions #File: Tables_p.html #--------------------------- -Table Administration==Administration der Datenbank Tabellen -Table Selection==Tabellenauswahl -Select Table:==Auswahl Tabelle: +Table Administration==表格管理 +Table Selection==选择表格 +Select Table:==选择表格: #"Show Table"=="Zeige Tabelle" -show max.==Zeige max. ->all<==>alle< -entries,==Einträge, -search rows for==filtere Zeilen nach -"Search"=="Suche" -Table Editor: showing table==Tabellen Editor: zeige Tabelle +show max.==显示最多. +>all<==>全部< +entries,==个条目, +search rows for==搜索内容 +"Search"=="搜索" +Table Editor: showing table==表格编辑器: 显示表格 #PK==Primärschlüssel -"Edit Selected Row"=="Bearbeite ausgwählte Zeile" -"Add a new Row"=="Füge neue Zeile ein" -"Delete Selected Rows"=="Lösche ausgewählte Zeile" -"Delete Table"=="Lösche Tabelle" -Row Editor==Zeileneditor -Primary Key==Primärschlüssel -"Commit"=="Absenden" +"Edit Selected Row"=="编辑选中行" +"Add a new Row"=="添加新行" +"Delete Selected Rows"=="删除选中行" +"Delete Table"=="删除表格" +Row Editor==行编辑器 +Primary Key==主键 +"Commit"=="备注" #----------------------------- #File: Table_YMark_p.html #--------------------------- -Table Viewer==Tabellen Anzeige -YMark Table Administration==YMark Tabellen Administration -Table Editor: showing table==Tabellen Editor: Angezeigte Tabelle -"Edit Selected Row"=="Bearbeite angezeigte Reihe" -"Add a new Row"=="Füge neue Zeile ein" -"Delete Selected Rows"=="Lösche ausgewählte Reihe" -"Delete Table"=="Lösche Tabelle" -"Rebuild Index"=="Index neu aufbauen" -Primary Key==Primärschlüssel ->Row Editor<==>Reihen Editor< -"Commit"=="Eintragen" -Table Selection==Tabellen Auswahl -Select Table:==Wähle Tabelle: -show max. entries==Zeige max. Einträge ->all<==>Alle< -Display columns:==Zeige Spalten: -"load"=="Laden" -Search/Filter Table==Suche/Filter Tabelle -search rows for==Suche Reihen mit -"Search"=="Suche" +Table Viewer==表格查看 +YMark Table Administration==YMark表格管理 +Table Editor: showing table==表格编辑器: 显示表格 +"Edit Selected Row"=="编辑选中行" +"Add a new Row"=="添加新行" +"Delete Selected Rows"=="删除选中行" +"Delete Table"=="删除表格" +"Rebuild Index"=="重建索引" +Primary Key==主键 +>Row Editor<==>行编辑器< +"Commit"=="备注" +Table Selection==选择表格 +Select Table:==选择表格: +show max. entries==显示最多条目 +>all<==>所有< +Display columns:==显示列: +"load"=="载入" +Search/Filter Table==搜索/过滤表格 +search rows for==搜索 +"Search"=="搜索" #>Tags<==>Tags< ->select a tag<==>Tag auswählen< ->Folders<==>Ordner< ->select a folder<==>Ordner auswählen< ->Import Bookmarks<==>Importiere Lesezeichen< +>select a tag<==>选择标签< +>Folders<==>目录< +>select a folder<==>选择目录< +>Import Bookmarks<==>导入书签< #Importer:==Importer: #>XBEL Importer<==>XBEL Importer< #>Netscape HTML Importer<==>Netscape HTML Importer< -"import"=="Importieren" +"import"=="导入" #----------------------------- #File: terminal_p.html #--------------------------- #YaCy System Monitor==YaCy System Monitor -Search Form==Suchformular -Crawl Start==Crawl starten -Status Page==Status Seite -Confirm Shutdown==Bestätige Herunterfahren -><Shutdown==><Herunterfahren -Event Terminal==Ereignis Terminal -Image Terminal==Bilder Terminal +Search Form==搜索页面 +Crawl Start==开始crawl +Status Page==状态页面 +Confirm Shutdown==确认关闭 +><Shutdown==><关闭程序 +Event Terminal==事件终端 +Image Terminal==图形终端 #Domain Monitor==Domain Monitor -"Loading Processing software..."=="Verarbeitungs Software wird geladen..." -This browser does not have a Java Plug-in.==Dieser Browser besitzt kein Java Plug-In. -Get the latest Java Plug-in here.==Holen Sie sich das neueste Java Plug-In hier. -Resource Monitor==Ressourcen Monitor -Network Monitor==Netzwerk Monitor +"Loading Processing software..."=="正在载入软件..." +This browser does not have a Java Plug-in.==此浏览器没有安装Java插件. +Get the latest Java Plug-in here.==在此获取. +Resource Monitor==资源监视器 +Network Monitor==网络监视器 #----------------------------- #File: Threaddump_p.html #--------------------------- -YaCy Debugging: Thread Dump==YaCy Debug: Thread Dump -Threaddump<==Thread Dump< -"Single Threaddump"=="Einzelner Thread Dump" -"Multiple Dump Statistic"=="Mehrfache Dump Statistiken" +YaCy Debugging: Thread Dump==YaCy Debug: 线程Dump +Threaddump<==线程Dump< +"Single Threaddump"=="单线程Dump" +"Multiple Dump Statistic"=="多个Dump数据" #"create Threaddump"=="Threaddump erstellen" #----------------------------- #File: User.html #--------------------------- -User Page==Benutzer Seite -You are not logged in.
    ==Sie sind nicht angemeldet.
    -Username:==Benutzername: -Password: ==当前未登录.
    +Username:==用户名: +Password: Русский +# ----------------------- +# This is a part of YaCy, a peer-to-peer based web search engine +# +# (C) by Michael Peter Christen; mc@anomic.de +# first published on http://www.anomic.de +# Frankfurt, Germany, 2005 +# +# Testing the new SVN Properties http://forum.yacy-websuche.de/viewtopic.php?f=15&t=2906 +# +# $Revision:: $ +# $Date:: $ +# $Tag:: $ +# $Author:: $ +# +# This file is maintained by Oliver Wunder +# This file is written by (chronological order) Roland Ramthun , Oliver Wunder , Jan Sandbrink, +# Thomas Süß +# If you find any mistakes or untranslated strings in this file please don't hesitate to email them to the maintainer. +#File: ConfigLanguage_p.html +#--------------------------- +# Only part 1. +# Contributors are in chronological order, not how much they did absolutely. +# Спасибо за Вашу помощь! +default\(english\)==Русский +==SEVEN +==<webmaster@daburna.de> +#----------------------------- +#File: AccessTracker_p.html +#--------------------------- +Access Tracker==Zugriffe +Server Access Overview==Server Zugriff Überblick +This is a list of \#\[num\]\# requests to the local http server within the last hour.==Dies ist eine Liste von #[num]# Anfragen, die an den lokalen HTTP Server innerhalb der letzten Stunde gestellt wurden. +This is a list of requests to the local http server within the last hour.==Dies ist eine Liste von Anfragen, die innerhalb der letzten Stunde an den lokalen HTTP Server gestellt wurden. +Showing \#\[num\]\# requests.==Gezeigt werden #[num]# Anfragen. +#>Host<==>Host< +>Path<==>Путь< +Date<==Дата< +Access Count During==Erfasster Zugriff während der +last Second==последняя секунда +last Minute==последняя минута +last 10 Minutes==последние 10 минут +last Hour==последний час +The following hosts are registered as source for brute-force requests to protected pages==Die folgenden Hosts wurden als Quelle von Brute-Force Attacken auf geschützte Seiten erkannt +#>Host==>Host +Access Times==Время доступа +Server Access Details==Server Zugriffs Details +Local Search Log==Lokale Suche Log +Local Search Host Tracker==Lokale Suche Host Tracker +Remote Search Log==Remote Suche Log +#Total:==Итого: +Success:==Erfolgreich: +Remote Search Host Tracker==Remote Suche Host Tracker +This is a list of searches that had been requested from this\' peer search interface==Dies ist eine Liste aller Suchanfragen, die von diesem Peer ausgeführt wurden. +Showing \#\[num\]\# entries from a total of \#\[total\]\# requests.==Es werden #[num]# Einträge von insgesamt #[total]# Anfragen angezeigt. +Requesting Host==Anfragender Host +Offset==Versatz +Expected Results==Erwartete Ergebnisse +Returned Results==Gefundene Ergebnisse +Used Time \(ms\)==Gebrauchte Zeit (in ms) +URL fetch \(ms\)==URL Abruf (in ms) +Snippet comp \(ms\)==Vorschau Erzeugung (in ms) +Query==Suchwort +#>User Agent<==>User Agent< +Search Word Hashes==Suchwort Hash +Count==Количество +Queries Per Last Hour==Suchanfragen pro letzter Stunde +Access Dates==Время доступа +This is a list of searches that had been requested from remote peer search interface==Dies ist eine Liste aller Suchanfragen, die von einem anderen Peer gestellt wurden. +#----------------------------- +#File: Blacklist_p.html +#--------------------------- +Blacklist Administration==Blacklist Verwaltung +Used Blacklist engine:==Benutzte Blacklist Verwaltung: +This function provides an URL filter to the proxy; any blacklisted URL is blocked==Diese Funktion stellt einen URL-Filter vor den Proxy. Das Laden einer URL aus der Blacklist wird geblockt. +from being loaded. You can define several blacklists and activate them separately.==Sie können mehrere Blacklists anlegen und getrennt aktivieren. +You may also provide your blacklist to other peers by sharing them; in return you may==Sie können ebenfalls Ihre Blacklist einem anderen Peer zum Download anbieten. +collect blacklist entries from other peers.==Im Gegenzug können Sie sich selber von anderen Peers Blacklists runterladen. +Active list:==Aktivierte Liste: +No blacklist selected==Keine Blacklist gewählt +Select list:==Liste auswählen: +not shared::shared==nicht freigegeben::freigegeben +"select"=="выбрать" +Create new list:==Neue Liste anlegen: +"create"=="создать" +Settings for this list==Einstellungen dieser Liste +"Save"=="Сохранить" +Share/don't share this list==Liste freigeben/nicht freigeben +Delete this list==Удалить этот список +Edit this list==Diese Liste bearbeiten +These are the domain name/path patterns in==Dies sind die Domainnamen/-pfade in +Blacklist Pattern==Blacklisteintrag +Edit selected pattern\(s\)==Bearbeite gewählten Eintrag +Delete selected pattern\(s\)==Lösche gewählten Eintrag +Move selected pattern\(s\) to==Verschiebe gewählten Eintrag zu +#You can select them here for deletion==Sie können sie einzeln zum Löschen wählen +Add new pattern:==Neuen Eintrag hinzufügen: +"Add URL pattern"=="URL hinzufügen" +The right \'\*\', after the \'\/\', can be replaced by a regex.==Der rechte Asterisk '*', nach dem '/', kann durch einen regulären Ausdruck ersetzt werden. +domain.net\/fullpath<==domain.de/vollerpfad< +>domain.net\/\*<==>domain.de/*< +\*.domain.net\/\*<==*.domain.de/*< +\*.sub.domain.net\/\*<==*.sub.domain.de/*< +#sub.domain.\*\/\*<==sub.domain.*/*< +#domain.\*\/\*<==domain.*/*< +a complete regex \(slow\)==ein ganzer Regulärer Ausdruck (langsam) +#was removed from blacklist==wurde aus Blacklist entfernt +#was added to the blacklist==wurde zur Blacklist hinzugefügt +Activate this list for==Diese Liste ist gültig für +Show entries:==Zeige Einträge: +Entries per page:==Einträge pro Seite: +"Go"=="Los" +Edit existing pattern\(s\):==Bearbeite existierende Einträge: +"Save URL pattern\(s\)"=="URL Einträge speichern" +#----------------------------- +#File: BlacklistCleaner_p.html +#--------------------------- +Blacklist Cleaner==Blacklist aufräumen +Here you can remove or edit illegal or double blacklist-entries.==Hier können Sie ungültige oder doppelte Einträge auf der Blacklist entfernen oder bearbeiten. +Check list==Liste testen +"Check"=="Teste" +Allow regular expressions in host part of blacklist entries.==Erlaube reguläre Ausdrücke im Hostnamen Teil der Blacklist Einträge. +The blacklist-cleaner only works for the following blacklist-engines up to now:==Der Blacklist-Cleaner arbeitet zur Zeit nur mit den folgenden Blacklist-Engines: +Illegal Entries in \#\[blList\]\# for==Ungültige Einträge in #[blList]# für +Deleted \#\[delCount\]\# entries==#[delCount]# Einträge gelöscht +Altered \#\[alterCount\]\# entries!==#[alterCount]# Einträge geändert +Two wildcards in host-part==Zwei Wildcards im Host-Teil +Either subdomain or wildcard==Entweder Subdomain oder Wildcard +Path is invalid Regex==Pfad ist ungültige Regex +Wildcard not on begin or end==Wildcard nicht am Beginn oder Ende +Host contains illegal chars==Host enthält ungültige Zeichen +Double==Doppelt +"Change Selected"=="Markierte bearbeiten" +"Delete Selected"=="Markierte löschen" +No Blacklist selected==Es wurde keine Blacklist ausgewählt +#----------------------------- +#File: BlacklistImpExp_p.html +#--------------------------- +#Blacklist Import==Blacklist Import +Used Blacklist engine:==Benutzte Blacklist Verwaltung: +Import blacklist items from...==Importiere Blacklist von... +other YaCy peers:==anderen YaCy Peers: +"Load new blacklist items"=="Lade neue Blacklist" +#URL:==URL: +plain text file:<==Einfache Textdatei:< +XML file:==XML файл: +Upload a regular text file which contains one blacklist entry per line.==Upload einer reguläre Testdatei mit jeweils einem Blacklisten Eintrag pro Zeile. +Upload an XML file which contains one or more blacklists.==Upload einer XML Datei die eine oder mehrere Blacklisten enthält. +Export blacklist items to...==Exportiere Blacklist nach... +Here you can export a blacklist as an XML file. This file will contain additional==Hier können Sie eine (oder alle) Blacklist(en) in eine XML Datei exportieren. Diese Datei enthält dann zusätzliche +information about which cases a blacklist is activated for.==Informationen in welchen Fällen die Blacklist angewendet wird. +"Export list as XML"=="Exportiere Liste(n) als XML Datei" +Here you can export a blacklist as a regular text file with one blacklist entry per line.==Hier können Sie eine (oder alle) Blacklist(en) in eine reguläre Textdatei exportieren die jeweils einen Eintrag pro Zeile enthält. +This file will not contain any additional information==Diese Datei enthält sonst keine zusätzlichen Informationen +"Export list as text"=="Exportiere Liste(n) als Textdatei" +#----------------------------- +#File: BlacklistTest_p.html +#--------------------------- +Blacklist Test==Blacklist testen +Used Blacklist engine:==Benutzte Blacklist Verwaltung: +Test list:==Teste Liste: +"Test"=="Тест" +The tested URL was==Die getestete URL war +It is blocked for the following cases:==Sie wird in den folgenden Fällen geblockt: +#Crawling==Crawling +#DHT==DHT +#News==News +#Proxy==Proxy +Search==Поиск +Surftips==Surftipps +#----------------------------- +#File: Blog.html +#--------------------------- +by==von +Comments==Комментарии +>edit==>редактировать +>delete==>удалить +Edit<==Редактировать< +previous entries==vorherige Einträge +next entries==nächste Einträge +new entry==Neuer Eintrag +import XML-File==XML-Datei importieren +export as XML==als XML exportieren +Comments==Комментарии +Blog-Home==Blog-Startseite +Author:==Автор: +Subject:==Тема: +#Text:==Text: +You can use==Sie können hier +Yacy-Wiki Code==YaCy-Wiki Befehle +here.==benutzen. +Comments:==Комментарии: +deactivated==deaktiviert +>activated==>aktiviert +moderated==moderiert +"Submit"=="Absenden" +"Preview"=="Предварительный просмотр" +"Discard"=="Verwerfen" +>Preview==>Предварительный просмотр +No changes have been submitted so far!==Es wurden noch keine Änderungen übertragen! +Access denied==Zugriff verweigert +To edit or create blog-entries you need to be logged in as Admin or User who has Blog rights.==Um Blogeinträge zu verändern oder zu erstellen müssen Sie als Admin oder User mit Blog-Rechten eingeloggt sein. +Are you sure==Sind Sie sicher +that you want to delete==dass Sie folgendes löschen wollen: +Confirm deletion==Bestätige Löschung +Yes, delete it.==Ja, löschen. +No, leave it.==Нет, оставить это. +Import was successful!==Import war erfolgreich! +Import failed, maybe the supplied file was no valid blog-backup?==Import fehlgeschlagen, unter Umständen war die angegebene Datei keine gültige Blog-Sicherung? +Please select the XML-file you want to import:==Bitte wählen Sie die XML-Datei die Sie importieren wollen: +#----------------------------- +#File: BlogComments.html +#--------------------------- +by==von +Comments==Kommentare +Login==Einloggen +Blog-Home==Blog-Startseite +delete==löschen +allow==erlauben +Author:==Автор: +Subject:==Тема: +#Text:==Текст: +You can use==Sie können hier +Yacy-Wiki Code==YaCy-Wiki Befehle +here.==benutzen. +"Submit"=="Absenden" +"Preview"=="Vorschau" +"Discard"=="Verwerfen" +#----------------------------- +#File: Bookmarks.html +#--------------------------- +YaCy \'\#\[clientname\]\#\': Bookmarks==YaCy '#[clientname]#': Lesezeichen +The bookmarks list can also be retrieved as RSS feed. This can also be done when you select a specific tag.==Die Liste der Lesezeichen kann auch als RSS Feed abgerufen werden. Dies ist auch beim Auswählen eines bestimmten Tags möglich. +Click the API icon to load the RSS from the current selection.==Klicken Sie auf die API Sprechblase, um einen RSS Feed der aktuellen Auswahl zu laden. +To see a list of all APIs, please visit the API wiki page.==Um eine Liste aller APIs zu sehen, besuchen Sie die API Seite im Wiki. +

    Bookmarks==

    Lesezeichen +Bookmarks \(==Lesezeichen \( +#Login==Логин +List Bookmarks==Lesezeichen Liste +Add Bookmark==Lesezeichen hinzufügen +Import Bookmarks==Lesezeichen importieren +Import XML Bookmarks==Importiere XML-Lesezeichen +Import HTML Bookmarks==Importiere HTML-Lesezeichen +"import"=="Importieren" +Default Tags:==Standard Tag +imported==importiert +#Edit Bookmark==Lesezeichen bearbeiten +#URL:==URL: +Title:==Заголовок: +Description:==Beschreibung: +Folder \(/folder/subfolder\):==Ordner (/Ordner/Unterordner): +Tags \(comma separated\):==Tags (durch Komma trennen): +>Public:==>Öffentlich: +yes==да +no==нет +Bookmark is a newsfeed==Lesezeichen ist ein Newsfeed +"create"=="создать" +"edit"=="редактировать" +File:==Файл: +import as Public==als öffentlich importieren +"private bookmark"=="Privates Lesezeichen" +"public bookmark"=="Öffentliches Lesezeichen" +Tagged with==Stichworte: +'Confirm deletion'=='Löschen bestätigen' +Edit==Редактировать +Delete==Удалить +Folders==Папка +Bookmark Folder==Lesezeichen Ordner +#Tags==Tags +Bookmark List==Liste der Lesezeichen +previous page==vorherige Seite +next page==следующая страница +All==Всё +Show==Показать +Bookmarks per page.==Lesezeichen pro Seite. +#unsorted==unsortiert +#----------------------------- +#File: Collage.html +#--------------------------- +Image Collage==Bilder Collage +Private Queue==Privater Puffer +Public Queue==Öffentlicher Puffer +#----------------------------- +#File: compare_yacy.html +#--------------------------- +Websearch Comparison==Сравнение Веб поиска +Left Search Engine==Поисковый движок слева +Right Search Engine==Поисковый движок справа +Query==Запрос +"Compare"=="Сравнить" +Search Result==Результат поиска +#----------------------------- +#File: ConfigAccounts_p.html +#--------------------------- +User Accounts==Benutzerkonten +User Administration==Benutzerverwaltung +User created:==Benutzer erstellt: +User changed:==Benutzer geändert: +Generic error.==Genereller Fehler. +Passwords do not match.==Passwörter stimmen nicht überein. +Username too short. Username must be \>\= 4 Characters.==Benutzername zu kurz. Benutzername muss länger als vier Zeichen sein. +No password is set for the administration account.==Für den Administrator Zugang ist kein Passwort gesetzt. +Please define a password for the admin account.==Bitte setzen Sie ein Passwort für das admin Konto. +Admin Account==Admin Konto +Access from localhost without account==Zugriff von localhost ohne Konto +Access to your peer from your own computer \(localhost access\) is granted. No need to configure an administration account.==Der Zugriff von Ihrem Computer (localhost Zugang) ist garantiert. Sie brauchen kein Administratorkonto erstellen. +Access only with qualified account==Zugriff nur mit berechtigtem Konto +You need this only if you want a remote access to your peer.==Sie benötigen dies nur, wenn Sie Fernzugriff auf Ihren Peer haben wollen. +Peer User:==Peer Benutzer: +New Peer Password:==Neues Peer Passwort: +Repeat Peer Password:==Wiederhole Peer Passwort: +"Define Administrator"=="Administrator festlegen" +Select user==Benutzer wählen +New user==Новый пользователь +Edit User==Редактировать пользователя +Delete User==Удалить пользователя +Edit current user:==Aktuellen Benutzer bearbeiten: +Username==Имя пользователя +Password==Пароль +Repeat password==Passwort wiederholen +First name==Имя +Last name==Отчество +Address==Адрес +Rights==Rechte +Timelimit==Лимит времени +Time used==Время использования +Save User==Сохранить пользователя +#----------------------------- +#File: ConfigAppearance_p.html +#--------------------------- +Appearance and Integration==Erscheinungsbild und Integration +You can change the appearance of the YaCy interface with skins.==Sie können hier das Aussehen der YaCy Oberfläche mit Skins verändern, +#You can change the appearance of YaCy with skins==Sie können hier das Erscheinungsbild von YaCy mit Skins ändern +The selected skin and language also affects the appearance of the search page.==das ausgewählte Design und die gewählte Sprache wirken sich auch auf das Erscheinungsbild der Suchseite aus. +If you create a search portal with YaCy then you can==Wenn Sie ein Such-Portal mit Yacy erstellen möchten können Sie +change the appearance of the search page here.==das Erscheinungsbild der Suchseite hier weitgehend ändern und die standard Grafiken und Links auf der Suchseite durch Ihre eigenen ersetzen. +#and the default icons and links on the search page can be replaced with you own.==und die standard Grafiken und Links auf der Suchseite durch Ihre eigenen ersetzen. +Skin Selection==Skinauswahl +Select one of the default skins, download new skins, or create your own skin.==Wählen Sie einen der mitgelieferten Skins, laden Sie einen neuen herunter oder erstellen Sie selbst einen neuen Skin. +Current skin==Aktueller Skin +Available Skins==Verfügbare Skins +"Use"=="Benutzen" +"Delete"=="Löschen" +>Skin Color Definition<==>Definition der Skin Farben< +The generic skin \'generic_pd\' can be configured here with custom colors:==Der allgemeine Skin 'generic_pd' kann hier mit eigenen Farben angepasst werden: +>Background<==>Hintergrund< +#>Text<==>Text< +>Legend<==>Легенда< +>Table Header<==>Tabellen Kopf< +>Table Item<==>Tabellen Zelle 1< +>Table Item 2<==>Tabellen Zelle 2< +>Table Bottom<==>Tabellen Unterseite< +>Border Line<==>Rand Linie< +>Sign \'bad\'<==>Zeichen 'gut'< +>Sign \'good\'<==>Zeichen 'schlecht'< +>Sign \'other\'<==>Zeichen 'andere'< +>Search Headline<==>Suche Kopfzeile< +>Search URL==>Suche URL +"Set Colors"=="Farben Anwenden" +#>Skin Download<==>Skin Download< +Skins can be installed from download locations==Skins können direkt von einer Download Quelle installiert werden +Install new skin from URL==Installiere einen neuen Skin von folgender URL +Use this skin==Использовать этот скин +"Install"=="Installieren" +Make sure that you only download data from trustworthy sources. The new Skin file==Stellen Sie sicher, dass Sie nur Dateien aus vertrauenswürdigen Quellen herunterladen. +might overwrite existing data if a file of the same name exists already.==Achtung, existiert bereits eine Datei mit gleichem Namen, wird diese überschrieben ! +>Unable to get URL:==>Die URL konnte nicht geladen werden: +Error saving the skin.==Fehler beim Speichern des Skins. +#----------------------------- +#File: ConfigBasic.html +#--------------------------- +Access Configuration==Конфигурация доступа +Basic Configuration==Основная конфигурация +Your YaCy Peer needs some basic information to operate properly==Ihr YaCy-Peer benötigt einige Grundinformationen um korrekt zu funktionieren +Select a language for the interface==Wählen Sie eine Sprache für das Interface +Use Case: what do you want to do with YaCy:==Anwendungsfall: Was Sie mit YaCy tun wollen: +Community-based web search==Gemeinschafts-basierte Web Suche +Join and support the global network \'freeworld\', search the web with an uncensored user-owned search network==Treten Sie dem globalen Netzwerk 'freeworld' bei und unterstützen Sie es, durchsuchen Sie das Internet mit einem unzensierten, von den Benutzern gestalteten Suchnetzwerk +Search portal for your own web pages==Suchportal für Ihre eigene Internetseiten +Your YaCy installation behaves independently from other peers and you define your own web index by starting your own web crawl. This can be used to search your own web pages or to define a topic-oriented search portal.==Ihre YaCy Installation verhält sich unabhängig von den anderen Peers und Sie können Ihren eigenen Index bestimmen, indem Sie einen eigenen Web-Crawl starten. Dies kann benutzt werden, um Ihre eigenen Internetseiten zu durchsuchen oder ein Themen-basiertes Portal aufzubauen. +Files may also be shared with the YaCy server, assign a path here:==Dateien können auch mit dem YaCy Server unter folgendem Pfad zugänglich gemacht werden: +This path can be accessed at ==Der Pfad ist erreichbar unter +Use that path as crawl start point.==Verwenden Sie diesen Pfad als den Startpunkt für den Crawl. +Intranet Indexing==Intranet Indexierung +Create a search portal for your intranet or web pages or your \(shared\) file system.==Ein Suchportal für Ihre Intranet oder öffentlichen Webseiten oder ihr (verteiltes) Dateisystem. +URLs may be used with http/https/ftp and a local domain name or IP, or with an URL of the form==URLs mit folgenden Protokollen (HTTP/HTPPS/FTP) und einem lokalen Domainnamen oder einer IP oder folgende URLs können verwendet werden +or smb:==oder smb: +Your peer name has not been customized; please set your own peer name==Ihr Peername wurde noch nicht angepasst; bitte setzen Sie einen eigenen Peernamen ein +You may change your peer name==Sie können Ihren Peernamen ändern +Peer Name:==Имя пира: +Your peer cannot be reached from outside==Ваш пир недоступен извне +which is not fatal, but would be good for the YaCy network==это не критично, но это не хорошо для сети YaCy +please open your firewall for this port and/or set a virtual server option in your router to allow connections on this port==пожалуйста откройте настройки Вашего брендмауэра и/или настройки виртуального сервера на Вашем роуторе для открытия подключений на этот порт +Your peer can be reached by other peers==Ваш пир не может быть доступен с других пиров +Peer Port:==Порт пира: +Configure your router for YaCy:==Ihren Router für YaCy konfigurieren: +Configuration was not successful. This may take a moment.==Die Konfiguration war nicht erfolgreich. Dies kann einen Moment dauern. +Set Configuration==Konfiguration speichern +What you should do next:==Was Sie als Nächstes tun können: +Your basic configuration is complete! You can now \(for example\)==Ihre Grundeinstellungen sind vollständig! Sie können jetzt (beispielsweise) +just <==Einfach < +start an uncensored search==eine unzensierte Suche beginnen +start your own crawl and contribute to the global index, or create your own private web index==einen eigenen Crawl starten und zum globalen Index beitragen, oder einen eigenen privaten Webindex aufbauen +set a personal peer profile \(optional settings\)==ein eigenes Peer-Profil angeben (freiwillige Angabe) +monitor at the network page what the other peers are doing==auf der Netzwerkseite beobachten, was andere Peers gerade machen +Your Peer name is a default name; please set an individual peer name.==Ihr Peer-Name ist ein Standardname; bitte stellen Sie einen individuellen Namen ein. +You did not set a user name and/or a password.==Sie haben keinen Nutzernamen und/oder kein Passwort gesetzt. +Some pages are protected by passwords.==Einige Seiten sind passwortgeschützt. +You should set a password at the Accounts Menu to secure your YaCy peer.

    ::==Sie sollten ein Password in der Benutzerverwaltung setzen, um Ihren YaCy Peer abzusichern.

    :: +You did not open a port in your firewall or your router does not forward the server port to your peer.==Sie haben keinen Port in Ihrer Firewall geöffnet oder Ihr Router leitet den Server-Port nicht zu Ihrem Peer weiter. +This is needed if you want to fully participate in the YaCy network.==Dies ist jedoch erforderlich, wenn Sie vollständig am YaCy-Netzwerk teilhaben möchten. +You can also use your peer without opening it, but this is not recomended.==Sie können Ihren Peer auch nutzen ohne ihn zu öffnen, dies wird jedoch nicht empfohlen. +#----------------------------- +#File: ConfigHeuristics_p.html +#--------------------------- +Heuristics Configuration==Heuristik Konfiguration +A heuristic is an \'experience-based technique that help in problem solving, learning and discovery\' \(wikipedia\).==Heuristik 'bezeichnet die Kunst, mit begrenztem Wissen und wenig Zeit zu guten Lösungen zu kommen.' (Wikipedia). +The search heuristics that can be switched on here are techniques that help the discovery of possible search results based on link guessing, in-search crawling and requests to other search engines.== +Die Heuristik zur Suche die hier angeschalten werden können sind Techniken die helfen mögliche Suchergebnisse zu entdecken mit Hilfe von erratenen Links, Crawls während der Suche und Anfragen an andere Suchmaschinen. +When a search heuristic is used, the resulting links are not used directly as search result but the loaded pages are indexed and stored like other content.==Wenn eine Such Heuristik verwendet wird, werden die gefunden Links nicht direkt als Suchergebnisse angezeigt aber dafür die geladenen Seiten indexiert und mit dem anderen Inhalt abgespeichert. +This ensures that blacklists can be used and that the searched word actually appears on the page that was discovered by the heuristic.==Damit wird sichergestellt dass die Sperrlisten verwendet werden können und dass die Suchbegriffe auch wirklich auf den Seiten auftauchen, die mithilfe der Heuristik gefunden wurden. +The success of heuristics are marked with an image==Der Erfolg der Heuristik wird mit einem Bild markiert +heuristic:<name>==Heuristik:<Name> +#\(redundant\)==(redundant) +\(new link\)==(neuer Link) +below the favicon left from the search result entry:==unter dem Favicon links vom Eintrag des Suchergebnisses: +The search result was discovered by a heuristic, but the link was already known by YaCy==Das Suchergebnis wurde durch eine Heuristik gefunden, aber der Link war YaCy schon bekannt +The search result was discovered by a heuristic, not previously known by YaCy==Das Suchergebnis wurde durch eine Heuristik gefunden, aber YaCy vorher noch nicht bekannt. +\'site\'-operator: instant shallow crawl=='site'-Operator: Sofortiger oberflächlicher Crawl +When a search is made using a \'site\'-operator \(like: \'download site:yacy.net\'\) then the host of the site-operator is instantly crawled with a host-restricted depth-1 crawl.==Wenn eine Suche mit dem 'site'-Operator gestartet wird (z.B.: 'download site:yacy.net') dann wird der Host des 'site'-Operator sofort gecrawlt mit einer auf den Host beschränkten Suchtiefe von 1. +That means: right after the search request the portal page of the host is loaded and every page that is linked on this page that points to a page on the same host.==Das bedeutet: Gleich nach der Suchanfrage wird die Portalseite des Hosts geladen und jede verlinkte Seite die auf eine Seite auf demselben Host verweist. +Because this \'instant crawl\' must obey the robots.txt and a minimum access time for two consecutive pages, this heuristic is rather slow, but may discover all wanted search results using a second search \(after a small pause of some seconds\).==Weil dieser 'Sofort Crawl' auch die robots.txt und eine minimale Zugriffszeit für folgende Seiten berücksichtigen muss, ist diese Heuristik sehr langsam - aber kann alle gewünschten Suchergebniss finden indem eine zweite Suche (nach einigen Sekunden Pause) gestartet wird. +scroogle: load external search result list==scroogle: externe Suchergebnis Listen laden +When using this heuristic, then every search request line is used for a call to scroogle.==Diese Heuristik verwendet jede Zeile der Suchanfrage für einen Aufruf von Scroogle. +20 results are taken from scroogle and loaded simultanously, parsed and indexed immediately.==20 Ergebnisse werden von Scroogle geholt und simultan geladen, geparst und sofort indexiert. +#----------------------------- +#File: ConfigHTCache_p.html +#--------------------------- +Hypertext Cache Configuration==Hypertext Cache Konfiguration +The HTCache stores content retrieved by the HTTP and FTP protocol. Documents from smb:// and file:// locations are not cached.==Der Hypertext Cache speichert Inhalte die per HTTP und FTP Protokoll geholt wurden. Dokumente von smb:// und file:// Umgebungen werden nicht gecached. +The cache is a rotating cache: if it is full, then the oldest entries are deleted and new one can fill the space.==Der Cache ist ein rotierender Cache: Wenn er voll ist werden die ältesten Einträge gelöscht und neue werden am selben Speicherplatz abgelegt. +HTCache Configuration==HTCache Konfiguration +The path where the cache is stored==Der Pfad an dem der Cache gespeichert wird +The current size of the cache==Die aktuelle Größe des Caches +The maximum size of the cache==Die maximale Größe des Caches +"Set"=="Установить" +Cleanup==Очистить +Cache Deletion==Cache Löschen +Delete HTTP & FTP Cache==Lösche HTTP & FTP Cache +Delete robots.txt Cache==Lösche robots.txt Cache +"Delete"=="Удалить" +#----------------------------- +#File: ConfigLanguage_p.html +#--------------------------- +Language selection==Выбор языка +You can change the language of the YaCy-webinterface with translation files.==Вы можете изменить язык интерфейса YaCy +Current language==Текущий язык +#default\(english\)==Deutsch +Author\(s\) \(chronological\)==Автор (chronologisch) +Send additions to maintainer==Отправьте замечания координатору перевода +Available Languages==Доступные языки +Install new language from URL==Установить новый язык по адресу URL +Use this language==Использовать этот язык +"Use"=="Использовать" +"Delete"=="Удалить" +"Install"=="Установить" +Unable to get URL:==Nicht möglich die angegebene Datei von folgender URL zu installieren: +Error saving the language file.==Es trat ein Fehler beim Speichern der Sprachdatei auf. +Make sure that you only download data from trustworthy sources. The new language file==Stellen Sie sicher, dass Sie nur Dateien aus vertrauenswürdigen Quellen herunterladen. +might overwrite existing data if a file of the same name exists already.==Achtung, existiert bereits eine Datei mit gleichem Namen, wird diese überschrieben ! +#----------------------------- +#File: ConfigLiveSearch.html +#--------------------------- +Integration of a Search Field for Live Search==Integration eines Suchfeldes für die Live Suche +A \'Live-Search\' input field that reacts as search-as-you-type in a pop-up window can easily be integrated in any web page==Eine 'Live Suche' Eingabefeld zeigt live beim Eingeben in einem Pop-up Fenster Ergebnisse and und kann einfach in jede bestehende Webseite eingebaut werden +This is the same function as can be seen on all pages of the YaCy online-interface \(look at the window in the upper right corner\)==Das ist dieselbe Funktion, die man auf allen Seiten des YaCy Webinterfaces sehen kann (z.B. das Fenster in der oberen rechten Ecke) +Just use the code snippet below to integrate that in your own web pages==Verwenden Sie einfach den Code Ausschnitt unten, um das Suchfeld in Ihre Webseite einzubauen. +Please check if the address, as given in the example \'\#\[ip\]\#\:\#\[port\]\#\' here is correct and replace it with more appropriate values if necessary==Bitte überprüfen Sie, ob die Adresse die im Beispiel '#[ip]#:#[port]#' richtig ist und ersetzen Sie die Adresse wenn nötig mit richtigen Werten +Code Snippet:==Code Ausschnitt: +YaCy Portal Search==YaCy Portal Suche +"Search"=="Suche" +Configuration options and defaults for \'yconf\':==Konfigurations Optionen und Standardeinstellungen für 'yconf': +Defaults<==Standardeinstellungen< +url<==URL< +is a mandatory property - no default<==muss angegeben werden< +YaCy P2P Web Search==YaCy P2P Web Suche +Size and position \(width \| height \| position\)==Größe und Position (Breite | Höhe | Position) +Specifies where the dialog should be displayed. Possible values for position: \'center\', \'left\', \'right\', \'top\', \'bottom\', or an array containing a coordinate pair \(in pixel offset from top left of viewport\) or the possible string values \(e.g. \[\'right\',\'top\'\] for top right corner\)==Gibt an wo der Dialog angezeigt werden soll. Mögliche Werte für position: 'center', 'left', 'right', 'top', 'bottom', oder ein Array das ein Koordinatenpaar enthält (in Pixel Werten als Offset von der linken oberen Ecke des Viewports) oder einer möglichen String Variabble (e.g. ['right','top'] für die rechte obere Ecke) +Animation effects \(show | hide\)==Animationseffekte (show | hide) +The effect to be used. Possible values: \'blind\', \'clip\', \'drop\', \'explode\', \'fold\', \'puff\', \'slide\', \'scale\', \'size\', \'pulsate\'.== +Der Effekt der angewendet werden soll. Mögliche Werte sind: 'blind', 'clip', 'drop', 'explode', 'fold', 'puff', 'slide', 'scale', 'size', 'pulsate'. +Interaction \(modal \| resizable\)==Interaktion (modal | resizable) +If modal is set to true, the dialog will have modal behavior; other items on the page will be disabled \(i.e. cannot be interacted with\).==Wenn modal auf true gesetzt wird verhält sich der Dialog genau so; Andere Elemente auf der Seite werden deaktiviert. (können also solange das Fenster geöffnet ist nicht verwendet werden) +Modal dialogs create an overlay below the dialog but above other page elements.==Modale Dialoge erzeugen einen Overlay unter dem Dialog aber überhalb anderer Seitenelemente +If resizable is set to true, the dialog will be resizeable.==Wenn resizable auf true gesetzt wird, kann man die Größe des Dialogfensters verändern. +Load JavaScript load_js==JavaScript laden load_js +If load_js is set to false, you have to manually load the needed JavaScript on your portal page.==Wenn load_js auf false gesetzt wird, müssen Sie manuell das benötigte Javascript auf Ihrer Portalseite laden. +This can help to avoid timing problems or double loading.==Das kann helfen Timing Probleme oder das doppelte Laden zu verhindern. +Load Stylesheets load_css==Stylesheets laden load_css +If load_css is set to false, you have to manually load the needed CSS on your portal page.==Wenn load_css auf false gesetzt wird, müssen Sie manuell das benötigte CSS auf Ihrer Portalseite laden. +#Themes==Themes +You can <==Sie können < +download ready made themes or create==fertige Themes herunterladen oder erstellen +your own custom theme.
    Themes are installed into: DATA/HTDOCS/yacy/ui/css/themes/==Ihr ganz eigenes Theme.
    Themes werden im folgenden Verzeichnis installiert: DATA/HTDOCS/yacy/ui/css/themes/ +#----------------------------- +#File: ConfigNetwork_p.html +#--------------------------- +Network Configuration==Netzwerk Einstellungen +No changes were made!==Es wurden keine Änderungen vorgenommen! +Accepted Changes==Änderungen wurden gespeichert +Inapplicable Setting Combination==unpassende Einstellungskombination +#P2P operation can run without remote indexing, but runs better with remote indexing switched on. Please switch 'Accept Remote Crawl Requests' on==P2P-Tätigkeit läuft ohne Remote-Indexierung, aber funktioniert besser, wenn diese eingeschaltet ist. Bitte aktivieren Sie 'Remote Crawling akzeptieren' +For P2P operation, at least DHT distribution or DHT receive \(or both\) must be set. You have thus defined a Robinson configuration==Für P2P-Tätigkeit muss mindestens DHT-Verteilung oder DHT-Empfang (oder beides) aktiviert sein. Ansonsten haben Sie einen Robinson-Peer definiert +Global Search in P2P configuration is only allowed, if index receive is switched on. You have a P2P configuration, but are not allowed to search other peers.==Die globale Suche im P2P-Modus ist nur erlaubt, wenn der Index-Empfang aktiviert ist. Sie sind im P2P-Modus, aber Sie dürfen keine anderen Peers durchsuchen. +For Robinson Mode, index distribution and receive is switched off==Im Robinson-Modus werden Indexverteilung und -empfang deaktiviert +#This Robinson Mode switches remote indexing on, but limits targets to peers within the same cluster. Remote indexing requests from peers within the same cluster are accepted==Dieser Robinson-Modus aktiviert Remote-Indexierung, aber beschränkt die Anfragen auf Peers des selben Clusters. Nur Remote-Indexierungsanfragen von Peers des selben Clusters werden akzeptiert +#This Robinson Mode does not allow any remote indexing \(neither requests remote indexing, nor accepts it\)==Dieser Robinson-Modus erlaubt keinerlei Remote-Indexierung (es wird weder Remote-Indexierung angefragt, noch akzeptiert) +Network and Domain Specification==Netzwerk und Domain Spezifikation +# With this configuration it is not allowed to authentify automatically from localhost!==Diese Konfiguration erlaubt keine automatische Authentifikation von localhost! +# Please open the Account Configuration and set a new password.==Bitte in der Benutzerverwaltung ein neues Passwort festlegen. +YaCy can operate a computing grid of YaCy peers or as a stand-alone node.==Sie können an einem verteiltem Netz aus YaCy Peers mitwirken oder einen eigenständigen Peer betreiben. +To control that all participants within a web indexing domain have access to the same domain,==Um zu kontrollieren, dass alle Teilnehmer innerhalb einer Indexierungs Domain Zugriff zu der selben Domain haben, +this network definition must be equal to all members of the same YaCy network.==müssen diese Netzwerkdefinitionen bei allen Mitgliedern des YaCy Netzwerkes gleich sein. +Network Definition==Netzwerk Definition +Network Nick==Netzwerk Nick +Long Description==Lange Beschreibung +Indexing Domain==Indexierungs Domain +#DHT==DHT +"Change Network"=="Netzwerk wechseln" +Distributed Computing Network for Domain==Verteiltes Rechnen Netzwerk für die Domain +You can configure if you want to participate at the global YaCy network or if you want to have your==Sie können einstellen, ob Sie am globalen YaCy-Netzwerk teilnehmen wollen oder ob Sie einen eigenen +own separate search cluster with or without connection to the global network. You may also define==separaten Such-Cluster, mit oder ohne Verbindung zum globalen Netz, haben möchten. Sie können auch +a completely independent search engine instance, without any data exchange between your peer and other==eine vollkommen unabhängige Instanz einer Suchmaschine, ohne jeglichen Datenaustausch zwischen Ihrem und anderen Peers, definieren. +peers, which we call a 'Robinson' peer.==Dies nennen wir einen 'Robinson'-Peer. +Peer-to-Peer Mode==Peer-to-Peer Modus +>Index Distribution==>Index-Verteilung +This enables automated, DHT-ruled Index Transmission to other peers==Dies aktiviert den automatischen, DHT-basierten Versand an andere Peers +>enabled==>aktiviert +disabled during crawling==während des Crawlings deaktiviert +disabled during indexing==während des Indexierens deaktiviert +>Index Receive==>Index-Empfang +Accept remote Index Transmissions==Remote Index-Übertragungen akzeptieren +This works only if you have a senior peer. The DHT-rules do not work without this function==Dies funktioniert nur, wenn Sie einen Senior-Peer haben. Die DHT-Regeln arbeiten nicht ohne diese Funktion +>reject==>verwerfe +accept transmitted URLs that match your blacklist==akzeptiere übertragene URLs, die zu Ihrer Blacklist passen +#>Accept Remote Crawl Requests==>Remotecrawl-Anfragen akzeptieren +#Perform web indexing upon request of another peer==Führe Indexierung bei Anfrage eines anderen Peers aus +#This works only if you are a senior peer==Dies funktioniert nur, wenn Sie ein Senior-Peer sind +#Load with a maximum of==Lade mit maximal +#pages per minute==Seiten pro Minute (PPM) +>Robinson Mode==>Robinson Modus +If your peer runs in 'Robinson Mode' you run YaCy as a search engine for your own search portal without data exchange to other peers==Falls Ihr Peer im 'Robinson Modus' läuft, so verwenden Sie YaCy als Suchmaschine für Ihr eigenes Suchportal, ohne Datenaustausch mit anderen Peers +There is no index receive and no index distribution between your peer and any other peer==Es gibt keinen Index-Empfang von und keine Index-Verteilung zu anderen Peers +In case of Robinson-clustering there can be acceptance of remote crawl requests from peers of that cluster==Im Fall eines Robinson-Clusters können Remotecrawl-Anfragen von Peers des selben Clusters akzeptiert werden +>Private Peer==>Privater Peer +Your search engine will not contact any other peer, and will reject every request==Ihre Suchmaschine wird keine fremden Peers kontaktieren und alle Anfragen anderer Peers ablehnen +#>Private Cluster==>Privater Cluster +#Your peer is part of a private cluster without public visibility +#Index data is not distributed, but remote crawl requests are distributed and accepted from your cluster +#Search requests are spread over all peers of the cluster, and answered from all peers of the cluster +#List of ip:port - addresses of the cluster: \(comma-separated\) +>Public Cluster==>Öffentlicher Cluster +Your peer is part of a public cluster within the YaCy network==Ihr Peer ist Teil eines öffentlichen Clusters innerhalb des YaCy-Netzwerkes +Index data is not distributed, but remote crawl requests are distributed and accepted==Indexdaten werden nicht verteilt, aber Remotecrawl-Anfragen werden verteilt und akzeptiert +Search requests are spread over all peers of the cluster, and answered from all peers of the cluster==Suchanfragen werden über alle Peers des Clusters verteilt und von allen Peers des Clusters beantwortet +List of .yacy or .yacyh - domains of the cluster: \(comma-separated\)==Liste von .yacy oder .yacyh Domains der Peers des Clusters: (kommagetrennt) +>Public Peer==>Öffentlicher Peer +You are visible to other peers and contact them to distribute your presence==Sie sind für andere Peers sichtbar und kontaktieren sie um ihnen Ihre Anwesenheit mitzuteilen +Your peer does not accept any outside index data, but responds on all remote search requests==Ihr Peer akzeptiert keinerlei Indexdaten von außen, aber antwortet auf alle Remote-Suchanfragen +#>Peer Tags==>Peer Tags +When you allow access from the YaCy network, your data is recognized using keywords==Falls Sie Zugriff vom YaCy-Netzwerk aus erlauben, so werden Ihre Daten anhand von Schlüsselwörtern erkannt +Please describe your search portal with some keywords \(comma-separated\)==Bitte beschreiben Sie Ihr Suchportal mit einigen Schlüsselwörtern (kommagetrennt) +If you leave the field empty, no peer asks your peer. If you fill in a \'\*\', your peer is always asked.==Wenn Sie das Feld leer lassen werden Sie keine Anfragen von anderen Peers bekommen. Wenn Sie ein '*' eintragen, wird Ihr Peer immer abgefragt. +"Save"=="Speichern" +#----------------------------- +#File: ConfigParser.html +#--------------------------- +Parser Configuration==Parser Einstellungen +Content Parser Settings==Inhalt Parser Einstellungen +With this settings you can activate or deactivate parsing of additional content-types based on their MIME-types.==Mit diesen Einstellungen können Sie das Parsen zusätzlicher Dateitypen basierend auf ihren MIME-Typen ermöglichen. +For a detailed description of the various MIME-types take a look at==Für eine detailierte Beschreibung der verschiedenen MIME-Typen können Sie einen Blick auf +http://www.iana.org/assignments/media-types/==http://www.iana.org/assignments/media-types/ werfen. +enable/disable Parser==Parser aktiv / inaktiv +# --- Parser Names are hard-coded BEGIN --- +##Mime-Type==MIME Typ +##Microsoft Powerpoint Parser==Microsoft Powerpoint Parser +#Torrent Metadata Parser==Torrent Metadaten Parser +##HTML Parser==HTML Parser +#GNU Zip Compressed Archive Parser==GNU Zip Komprimiertes Archiv Parser +##Adobe Flash Parser==Adobe Flash Parser +#Word Document Parser==Word Dokument Parser +##vCard Parser==vCard Parser +#Bzip 2 UNIX Compressed File Parser==bzip2 UNIX Komprimierte Datei Parser +#OASIS OpenDocument V2 Text Document Parser==OASIS OpenDocument V2 Text Dokument Parser +##Microsoft Excel Parser==Microsoft Excel Parser +#ZIP File Parser==ZIP Datei Parser +##Rich Site Summary/Atom Feed Parser==Rich Site Summary / Atom Feed Parser +#Comma Separated Value Parser==Comma Separated Value (CSV) Parser +##Microsoft Visio Parser==Microsoft Visio Parser +#Tape Archive File Parser==Bandlaufwerk Archiv Datei Parser +#7zip Archive Parser==7zip Archiv Parser +##Acrobat Portable Document Parser==Adobe Acrobat Portables Dokument Format Parser +##Rich Text Format Parser==Rich Text Format Parser +#Generic Image Parser==Generischer Bild Parser +#PostScript Document Parser==PostScript Dokument Parser +#Open Office XML Document Parser==Open Office XML Dokument Parser +#BMP Image Parser==BMP Bild Parser +# --- Parser Names are hard-coded END --- +"Submit"=="Speichern" +#----------------------------- +#File: ConfigPortal.html +#--------------------------- +Integration of a Search Portal==Интеграция портала поиска +If you like to integrate YaCy as portal for your web pages, you may want to change icons and messages on the search page.==Если вы хотите интегрировать YaCy как портал для веб-страниц, вы можете менять иконки и сообщения на странице поиска. +The search page may be customized.==Страница поиска может быть настроена. +You can change the \'corporate identity\'-images, the greeting line==Вы можете изменить картинку фирменного логотипа, строку приветсвия +and a link to a home page that is reached when the \'corporate identity\'-images are clicked.==и ссылку на домашную страницу, которая будет доступна при нажатии на картинку фирменного логотипа. +To change also colours and styles use the Appearance Servlet for different skins and languages.== +Um auch die Farben und Stile zu verändern verwenden Sie das Servlet Aussehen für andere Skins und Sprachen. +Greeting Line<==Строка приветсвия< +URL of Home Page<==URL домашней страницы< +URL of a Small Corporate Image<==URL адрес маленького логотипа< +URL of a Large Corporate Image<==URL адрес крупного логотипа< +Enable Search for Everyone==Отображать поиск для всех +Search is available for everyone==Поиск доступен для всех +Only the administator is allowed to search==Только кому разрешил администратор +Show Navigation Bar on Search Page?==Отображать панель навигации на странице поиска +Show Navigation Top-Menu ==Отображать панель навигации в верхнем меню  +no link to YaCy Menu \(admin must navigate to /Status.html manually\)==не отображать ссылку на YaCy меню \ (администратор должен перейти к / Status.html вручную \) +Show Advanced Search Options on Search Page?==Отображать расширенный поиск на поисковой странице +Show Advanced Search Options on index.html ==Отображать расширенный поиск на index.html странице? +do not show Advanced Search==Не отображать расширенный поиск +Show Media Search Options==Отображать настройки поиска контента +Text==Текст +Images==Картинки +Audio==Аудио +Video==Видео +Applications==Приложения +Snippet Fetch Strategy & Link Verification==Snippet Fetch Strategy & Ссылка проверки +NOCACHE: no use of web cache, load all snippets online==NOCACHE: не использовать веб-кэша, загружать все фрагменты онлайн +IFFRESH: use the cache if the cache exists and is fresh otherwise load online==IFFRESH: использовать кэш, если кэш существует и содержимое свежие иначе нагрузка онлайн +IFEXIST: use the cache if the cache exist or load online==IFEXIST: использовать кэш, если кэш существует или загрузить онлайн +If verification fails, delete index reference==Если не проходит проверку, удалить индекс ссылки +CACHEONLY: never go online, use all content from cache. If no cache entry exist, consider content nevertheless as available and show result without snippet==CACHEONLY: никогда не выходить в интернет, использовать все содержимое из кэша. Если ни один элемент кэша существуют, рассмотреть содержание, тем не менее, как доступно и показать результат без фрагмента +FALSE: no link verification and not snippet generation: all search results are valid without verification==FALSE: нет ссылки для подтверждения, а не фрагмент поколения: все поисковые результаты справедливы без проверки +Show Information Links for each Search Result Entry==Отображать информационные ссылки для каждой записи в результаты поиска +>Date&==>Дата& +>Size&==>Размер& +>Metadata&==>Метаданные& +>Parser&==>Парсер& +>Pictures==>Картинки +Show Navigation on Side-Bar==Показывать элементы навигации +Host Navigation==Навигации хоста +Author Navigation==Навигации автора +Wiki Name-Space Navigation==Wiki нивигация +Topics (Tag-Cloud) Navigation==Топик навигация +Default Pop-Up Page<==Первая страница по умолчанию< +>Status Page==>Страница статуса +>Search Front Page==>Главная страница поиска +>Search Page \(small header\)==>Страница поиска (небольшой заголовок) +>Interactive Search Page==>Страница интерактивного поиска +Default maximum number of results per page==Максимальное количество результата на страницу +Default index.html Page \(by forwarder\)==Страница index.html по умолчанию (для переадресовки) +Target for Click on Search Results==Действие при нажатии на результат поиска +\"_blank\" \(new window\)=="_blank" (новое окно) +\"_self\" \(same window\)=="_self" (в этом же окне) +\"_parent\" \(the parent frame of a frameset\)=="_parent" (родительский фрейм) +\"_top\" \(top of all frames\)=="_top" (поверх всех фреймов) +\"searchresult\" \(a default custom page name for search results\)==\"searchresult\" (по умолчанию пользовательское имя страницы для результатов поиска) +"Change Search Page"=="Применить изменения" +"Set to Default Values"=="Установить значения по умолчанию" +The search page can be integrated in your own web pages with an iframe. Simply use the following code:==Странице поиска может быть интегрированы в собственные веб-страницы с использованием фрейма. Просто используйте следующий код: +This would look like:==Это будет выглядить так: +For a search page with a small header, use this code:==Для поиска страницы с небольшим заголовком используйте этот код: +A third option is the interactive search. Use this code:==Третьим вариантом является интерактивный поиск. Используйте этот код: +#----------------------------- +#File: ConfigProfile_p.html +#--------------------------- +Your Personal Profile==Ваш персональный профиль +You can create a personal profile here, which can be seen by other YaCy-members==Вы можете создать персональный профиль в этом разделе, который может быть доступен другим участникам Yacy. +or in the public using a FOAF RDF file.==или в публичном доступе используя файл FOAF RDF. +>Name<==>Ваше имя< +Nick Name==Ваш ник +Homepage \(appears on every Supporter Page as long as your peer is online\)==Домашная страница (отображается на каждой поддерживаемой странице, столько сколько Ваш пир в онлайне). +#eMail==eMail +#ICQ==ICQ +#Jabber==Jabber +#Yahoo!==Yahoo! +#MSN==MSN +#Skype==Skype +Comment==Комментарий +"Save"=="Сохранить" +You can use <==Вы можете использовать < +> here.==> для Вашего профиля. +#----------------------------- +#File: ConfigProperties_p.html +#--------------------------- +Advanced Config==Erweiterte Einstellungen +Here are all configuration options from YaCy.==Hier sind alle Konfigurationseinstellungen von YaCy. +You can change anything, but some options need a restart, and some options can crash YaCy, if wrong values are used.==Sie können alles ändern, bedenken Sie aber, dass einige Änderungen einen Neustart von YaCy erfordern und andere Änderungen YaCy ganz zum Absturz bringen können. +For explanation please look into defaults/yacy.init==Eine Erklärung finden Sie in der Datei defaults/yacy.init +"Save"=="Speichern" +#----------------------------- +#File: ConfigRobotsTxt_p.html +#--------------------------- +Exclude Web-Spiders==Web-Spider ausschließen +Here you can set up a robots.txt for all webcrawlers that try to access the webinterface of your peer.==Hier können Sie eine robots.txt für alle Webcrawler die das Webinterface Ihres Peers indexieren wollen, erstellen. +is a volunteer agreement most search-engines \(including YaCy\) follow.==ist ein freiwilliger Standard den die meisten Suchmaschinen (inkl. YaCy) befolgen. +It disallows crawlers to access webpages or even entire domains.==Er kann Crawlern den Zugriff auf Webseiten oder sogar ganze Domains verbieten. +Deny access to==Verbiete die Erfassung +Entire Peer==des ganzen Peers +Status page==der Statusseite +Network pages==der Netzwerkseiten +Surftips==der Surftipps +News pages==der News-Seiten +Blog==des Blogs +Wiki=des Wikis +Public bookmarks==der öffentlichen Lesezeichen +Home Page==der Home-Page +File Share==des File-Shares +"Save restrictions"=="Beschränkungen speichern" +#----------------------------- +#File: ConfigSearchBox.html +#--------------------------- +Integration of a Search Box==Integration einer Suchbox +We give information how to integrate a search box on any web page that==Hier finden Sie Informationen dazu wie man eine Suchbox auf jeder Webseite einsetzen kann das +calls the normal YaCy search window.==ein normales YaCy Suchfenster aufruft. +Simply use the following code:==Verwenden Sie einfach den folgenden Code: + MySearch== Meine Suche +"Search"=="Suchen" +This would look like:==Das sieht dann so aus: +This does not use a style sheet file to make the integration into another web page with a different style sheet easier.==Da hier keine Stylesheet Datei verwendet wird, gestaltet sich die Integration in andere Webseiten mit einem anderen Stylesheet einfacher. +You would need to change the following items:==Sie müssen dazu die folgenden Einträge ändern: +Replace the given colors \#eeeeee \(box background\) and \#cccccc \(box border\)==Ersetzen sie die vorgegebenen Farben #eeeeee (Hintergrund der Box) and #cccccc (Boxenrand) +Replace the word \"MySearch\" with your own message==Ersetzen Sie das Wort "Meine Suche" mit Ihrer eigenen Nachricht +#----------------------------- +#File: ConfigUpdate_p.html +#--------------------------- +Manual System Update==Ручное обновление системы +Current installed Release==Текущая установленная версия +Available Releases==Доступные версии +"Download Release"=="Загрузить версию" +"Check for new Release"=="Проверить на новые обновления" +Downloaded Releases==Загрузить обновление +No downloaded releases available for deployment.==Keine heruntergeladenen Releases zum Installieren verfügbar. +no automated installation on development environments==Keine automatische Installation in Entwicklungsumgebungen +"Install Release"=="Установить версию" +"Delete Release"=="Удалить версию" +Automatic Update==Автоматическое обновление +check for new releases, download if available and restart with downloaded release==suche nach neuer Version, lade sie herunter und starte neu mit dieser Version +"Check \+ Download \+ Install Release Now"=="Suchen + Herunterladen + Version nun installieren" +Download of release \#\[downloadedRelease\]\# finished. Restart Initiated.== Der Download von Version #[downloadedRelease]# ist beendet. Ein Neustart ist eingeleitet. +No more recent release found.==Kein neuere Version gefunden. +Release will be installed. Please wait.==Das Release wird installiert. Bitte warten. +You installed YaCy with a package manager.==Sie haben YaCy mit einer Paketverwaltung oder Installer installiert. +To update YaCy, use the package manager:==Um YaCy auf den neuesten Stand zu bringen, verwenden Sie den Paketmanager. +Omitting update because this is a development environment.==Update ausgelassen weil dies ein Entwicklersystem ist. +Omitting update because download of release \#\[downloadedRelease\]\# failed.==Update ausgelassen weil der Download von Version #[downloadedRelease]# fehlschlug. +Automated System Update==Automatische Systemaktualisierung +manual update==ручное обновление +no automatic look-up, updates can be made manually using this interface \(see options above\)==Keine automatische Aktualisierung. Updates können manuell gemacht werden (siehe die Optionen oben). +automatic update==автоматическое обновление +updates are made within fixed cycles:==Aktualisierungen werden nach festen Regeln gemacht: +Time between lookup==Время между проверками +hours==часов +Release blacklist==Versionen Negativliste +regex on release number strings==regex mit Versionsnummern +Release type==Тип релиза +only main releases==nur offizielle Versionen +any release including developer releases==jede Version, auch Entwickler Versionen +Signed autoupdate:==signierte Aktualisierung: +only accept signed files==Nur signierte Dateien akzeptieren +"Submit"=="Применить" +Accepted Changes.==Änderungen akzeptiert. +System Update Statistics==Статистика обновления системы +Last System Lookup==Последняя проверка системы +never==никогда +Last Release Download==Последная загруженная версия +Last Deploy==Последние обновления +#----------------------------- +#File: Connections_p.html +#--------------------------- +Connection Tracking==Verbindungsstatus +Incoming Connections==Eingehende Verbindungen +Showing \#\[numActiveRunning\]\# active, \#\[numActivePending\]\# pending connections from a max. of \#\[numMax\]\# allowed incoming connections.==Es werden #[numActiveRunning]# aktive und #[numActivePending]# wartende Verbindungen von max. #[numMax]# erlaubten eingehenden Verbindungen angezeigt. +Protocol==Protokoll +Duration==Dauer +Source IP\[:Port\]==Quell-IP[:Port] +Dest. IP\[:Port\]==Ziel-IP[:Port] +Command==Kommando +Used==Benutzt +Close==Schließen +Waiting for new request nr.==Warte auf neue Anfrage Nr. +Outgoing Connections==Ausgehende Verbindungen +Showing \#\[clientActive\]\# pooled outgoing connections used as:==Gezeigt werden #[clientActive]# zusammengefasste ausgehende Verbindungen, benutzt als: +Duration==Dauer +#ID==ID +#----------------------------- +#File: CookieMonitorIncoming_p.html +#--------------------------- +Incoming Cookies Monitor==Überwachung eingehender Cookies +Cookie Monitor: Incoming Cookies==Cookie Überwachung: Eingehende Cookies +This is a list of Cookies that a web server has sent to clients of the YaCy Proxy:==Dies ist eine Liste aller Cookies, die ein Webserver an Clients des YaCy Proxys geschickt hat: +Showing \#\[num\]\# entries from a total of \#\[total\]\# Cookies.==Angezeigt werden #[num]# Einträge von insgesamt #[total]# Cookies. +Sending Host==Host (Sender) +Date==Дата +Receiving Client==Client (Empfänger) +#Cookie==Cookie +"Enable Cookie Monitoring"=="Cookie Überwachung aktivieren" +"Disable Cookie Monitoring"=="Cookie Überwachung deaktivieren" +#----------------------------- +#File: CookieMonitorOutgoing_p.html +#--------------------------- +Outgoing Cookies Monitor==Überwachung ausgehender Cookies +Cookie Monitor: Outgoing Cookies==Cookie Überwachung: Ausgehende Cookies +This is a list of cookies that browsers using the YaCy proxy sent to webservers:==Dies ist eine Auflistung aller Cookies, die Browser, die den YaCy Proxy benutzen, an einen Webserver geschickt haben: +Showing \#\[num\]\# entries from a total of \#\[total\]\# Cookies.==Angezeigt werden #[num]# Einträge von insgesamt #[total]# Cookies. +Receiving Host==Host (Empfänger) +Date==Дата +Sending Client==Client (Sender) +#Cookie==Cookie +"Enable Cookie Monitoring"=="Cookie Überwachung aktivieren" +"Disable Cookie Monitoring"=="Cookie Überwachung deaktivieren" +#----------------------------- +#File: CrawlProfileEditor_p.html +#--------------------------- +>Crawl Profile Editor<==>Crawl Profil Editor< +>Crawler Steering<==>Crawler Steuerung< +>Crawl Scheduler<==>Crawl Planer< +>Scheduled Crawls can be modified in this table<==>Geplante Crawls können in dieser Tabelle geändert werden< +Crawl profiles hold information about a crawl process that is currently ongoing.==Crawl Profile beinhalten Informationen über einen Crawl Prozess der gerade ausgeführt wird. +#Crawl profiles hold information about a specific URL which is internally used to perform the crawl it belongs to.==Crawl Profile enthalten Informationen über eine spezifische URL, welche intern genutzt wird, um nachzuvollziehen, wozu der Crawl gehört. +#The profiles for remote crawls, indexing via proxy and snippet fetches==Die Profile für Remote Crawl, Indexierung per Proxy und Snippet Abrufe +#cannot be altered here as they are hard-coded.==können nicht verändert werden, weil sie "hard-coded" sind. +Crawl Profile List==Crawl Profil Liste +Crawl Thread==Crawl Art +#Status==Status +#Start URL==Start URL +>Depth==>Tiefe +Must Match==Muss zutreffen +Must Not Match==Muss nicht zutreffen +MaxAge==Max. Alter +#Auto Filter Depth==Auto Filter Tiefe +#Auto Filter Content==Auto Inhalts Filter +Max Page Per Domain==Max. Seiten pro Domain +Accept==Akzeptiere +Fill Proxy Cache==Fülle Proxy Cache +Local Text Indexing==Lokal Text Indexieren +Local Media Indexing==Lokal Media Indexieren +Remote Indexing==Remote Indexieren +#Status / Action==Status / Aktion +#terminated::active==beendet::aktiv +no::yes==nein::ja +Running==Läuft +"Terminate"=="Beenden" +Finished==Beendet +"Delete"=="Löschen" +"Delete finished crawls"=="Beendete Crawls löschen" +Select the profile to edit==Profil zur Bearbeitung auswählen +"Edit profile"=="Profil bearbeiten" +An error occurred during editing the crawl profile:==Es trat folgender Fehler bei der Bearbeitung des Crawl Profils auf: +Edit Profile==Bearbeite Profil +"Submit changes"=="Änderungen speichern" +#----------------------------- +#File: CrawlResults.html +#--------------------------- +Crawl Results<==Результат сканирования< +Overview==Обзор +Receipts==Получения +Queries==Запросы +DHT Transfer==DHT-пересылка +Proxy Use==Использование прокси +Local Crawling==Локальное сканирование +Global Crawling==Globales Crawlen +Surrogate Import==Сурогатный испорт +>Crawl Results Overview<==>Crawl Ergebnisse Überblick< +These are monitoring pages for the different indexing queues.==Das sind die Seiten zur Überwachung der verschiedenen Indexier Warteschlangen. +YaCy knows 5 different ways to acquire web indexes. The details of these processes \(1-5\) are described within the submenu's listed==YaCy kennt 5 verschiedene Arten, um zu indexieren. Die Details zu diesen Prozessen (1-5) sind in den Untermenüs oben beschrieben. +above which also will show you a table with indexing results so far. The information in these tables is considered as private,==Dort kann man ausserdem eine Tabelle mit den Resultaten des Index sehen. Informationen in diesen Tabellen sind als privat eingestuft, +so you need to log-in with your administration password.==also müssen Sie sich mit Ihrem Administrator Passwort einloggen, um sie zu sehen. +Case \(6\) is a monitor of the local receipt-generator, the opposed case of \(1\). It contains also an indexing result monitor but is not considered private==Fall (6) ist ein Monitor des lokalen Empfangs-Generator, der Gegensatz zu (1). Er enthält ausserdem einen Index Resulate Monitor, ist aber nicht privat, +since it shows crawl requests from other peers.==da er Crawl Anfragen von anderen Peers zeigt. +Case \(7\) occurs if surrogate files are imported==Fall (7) tritt ein wenn Surrogat Dateien importiert werden. +The image above illustrates the data flow initiated by web index acquisition.==Das obige Bild zeigt den Datenfluss, der durch die Index Erwerbung über das Internet entsteht. +Some processes occur double to document the complex index migration structure.==Einige Prozesse erscheinen doppelt, um die Komplexizität der Index Verteilungs Struktur zu erklären. +\(1\) Results of Remote Crawl Receipts==(1) Ergebnisse der Remote Crawl Rückmeldungen +This is the list of web pages that this peer initiated to crawl,==Dies ist eine Liste von Internetseiten, bei der Ihr Peer den Crawl initiiert hat, +but had been crawled by other peers.==die aber von anderen Peers gecrawlt wurden. +This is the 'mirror'-case of process \(6\).==Dies ist der 'Gegensatz' Prozess zu (6) +Use Case: You get entries here, if you start a local crawl on the 'Index Creation'-Page and check the==Anwendungsfall: Sie erhalten hier Einträge, wenn Sie einen lokalen Crawl auf der 'Index erzeugen' Seite starten und +'Do Remote Indexing'-flag. Every page that a remote peer indexes upon this peer's request==die 'Remote Indexierung' aktivieren. Jede Seite, die von einem remote Peer durch Ihre Anfrage indexiert wurde, +is reported back and can be monitored here.==wird nun zurück gemeldet und hier angezeigt. +\(2\) Results for Result of Search Queries==(2) Ergebnisse der Resultate bei Suchanfragen +This index transfer was initiated by your peer by doing a search query.==Dieser Index Transfer wurde von Ihrem Peer dadurch initiiert, dass Sie eine Suchanfrage gestartet haben. +The index was crawled and contributed by other peers.==Der Index wurde von anderen Peers gecrawlt und nun Ihnen breitgestellt. +Use Case: This list fills up if you do a search query on the 'Search Page'==Anwendungsfall: Diese Liste füllt sich, wenn Sie eine Suchanfrage auf der 'Suchseite' starten. +\(3\) Results for Index Transfer==(3) Ergebnisse der DHT-Verteilung +The url fetch was initiated and executed by other peers.==Die URL Indexierung wurde von anderen Peers initiiert und durchgeführt. +These links here have been transmitted to you because your peer is the most appropriate for storage according to==Diese Links wurden an Ihren Peer übermittelt, da er am angemessensten zur Speicherung +the logic of the Global Distributed Hash Table.==übereinstimmend mit der Logic der verteilten Hash Tabelle ist. +Use Case: This list may fill if you check the 'Index Receive'-flag on the 'Index Control' page==Anwendung: Dies Liste füllt sich, wenn Sie die 'Index Empfang' Option auf der 'Index Kontrolle' Seite aktiviert haben. +\(4\) Results for Proxy Indexing==(4) Ergebnisse der Proxy Indexierung +These web pages had been indexed as result of your proxy usage.==Diese Internetseiten wurden durch die Benutzung des Proxy indexiert. +No personal or protected page is indexed==Weder persönliche noch geschützte Seiten werden indexiert +such pages are detected by Cookie-Use or POST-Parameters \(either in URL or as HTTP protocol\)==Solche Seiten werden durch die Benutzung von Cookies oder POST-Parametern (in der URL oder im HTTP Protokoll) identifiziert +and automatically excluded from indexing.==und automatisch von der Indexierung ausgeschlossen. +Use Case: You must use YaCy as proxy to fill up this table.==Anwendung: Sie müssen YaCy als Proxy benutzen, um diese Tabelle zu füllen. +Set the proxy settings of your browser to the same port as given==Setzen Sie dazu die Proxy Einstellungen Ihres Browsers auf den selben Port, der +on the 'Settings'-page in the 'Proxy and Administration Port' field.==auf der 'Einstellungen' Seite im 'Proxy und Administration Port' angegeben ist. +\(5\) Results for Local Crawling==(5) Ergebnisse des lokalen Crawlens +These web pages had been crawled by your own crawl task.==Diese Internetseiten wurden gecrawlt, da Sie einen Crawl auf der 'Index erzeugen' Seite gestartet haben. +Use Case: start a crawl by setting a crawl start point on the 'Index Create' page.==Anwendung: Starten Sie einen Crawl, indem Sie auf der 'Index erzeugen' Seite einen Startpunkt eintragen. +\(6\) Results for Global Crawling==(6) Ergebnisse des globalen Crawlens +These pages had been indexed by your peer, but the crawl was initiated by a remote peer.==Diese Seiten wurden von Ihrem Peer indexiert, der Crawl wurde aber von einem anderen Peer initiiert (remote-Crawl). +This is the 'mirror'-case of process \(1\).==Dies ist der 'Gegensatz' Prozess zu (1). +Use Case: This list may fill if you check the 'Accept remote crawling requests'-flag on the 'Index Crate' page==Anwendung: Diese Liste füllt sich, wenn Sie 'Akzeptiere remote Crawling Anfragen' auf der 'Index erzeugen' Seite aktiviert haben. +The stack is empty.==Die Liste ist leer. +Statistics about \#\[domains\]\# domains in this stack:==Statistiken über #[domains]# Domains in diesem Bereich: +\(7\) Results from surrogates import==\(7\) Ergebnisse aus dem Surrogat Import +These records had been imported from surrogate files in DATA/SURROGATES/in==Diese Datensätze wurden aus Surrogat Dateien in DATA/SURROGATES/in importiert +Use Case: place files with dublin core metadata content into DATA/SURROGATES/in or use an index import method==Anwendungsfall: Dateien mit Dublin Core Metadaten Inhalt in das DATA/SURROGATES/in kopieren oder eine der Index Import Funktionen nutzen +\(i.e. MediaWiki import, OAI-PMH retrieval\)==(z.B. MediaWiki Dump Import, OAI-PMH Import\) +#Domain==Domain +#URLs=URLs +"delete all"=="удалить все" +Showing all \#\[all\]\# entries in this stack.==Zeigt alle #[all]# Einträge in diesem Bereich. +Showing latest \#\[count\]\# lines from a stack of \#\[all\]\# entries.==Zeigt die letzten #[count]# Einträge aus diesem Bereich von insgesamt #[all]# Einträgen. +"clear list"=="очистить список" +#Initiator==Initiator +>Executor==>Ausführender +>Modified==>Änderungsdatum +>Words==>Слов +>Title==>Titel +#URL==URL +"delete"=="удалить" +#----------------------------- +#File: CrawlStartExpert_p.html +#--------------------------- +Expert Crawl Start==Experten Crawl Start +Start Crawling Job:==Starte Crawling Aufgabe: +You can define URLs as start points for Web page crawling and start crawling here. \"Crawling\" means that YaCy will download the given website, extract all links in it and then download the content behind these links. This is repeated as long as specified under \"Crawling Depth\".==Sie können hier URLs angeben, die gecrawlt werden sollen und dann das Crawling starten. "Crawling" bedeutet, dass YaCy die angegebene Webseite runterlädt, alle Links extrahiert und dann den Inhalt hinter diesen Links runterlädt. Dies wird solange wiederholt wie unter "Crawling Tiefe" angegeben. +Attribute<==Attribut< +Value<==Wert< +Description<==Beschreibung< +>Starting Point:==>Startpunkt: +>From URL==>Von URL +From Sitemap==Von Sitemap +From File==Von Datei +Existing start URLs are always re-crawled.==Existierende Start-URLs werden immer wieder gecrawled. +Other already visited URLs are sorted out as \"double\", if they are not allowed using the re-crawl option.==Andere bereits besuchte Seiten werden als 'doppelt' aussortiert, wenn diese nicht ausdrücklich per Re-crawl Option zugelassen wurden. +Create Bookmark==Lesezeichen erstellen +\(works with "Starting Point: From URL" only\)==(funktioniert nur mit "Startpunkt von URL") +Title<==Titel< +Folder<==Ordner< +This option lets you create a bookmark from your crawl start URL.==Diese Option gibt Ihnen die Möglichkeit ein Lesezeichen aus Ihrer Crawl Start URL zu erstellen. +Crawling Depth==Crawling-Tiefe +This defines how often the Crawler will follow links \(of links..\) embedded in websites.==Dies definiert, wie oft der Crawler eingebetteten Links (von Links ...) in Webseiten folgen wird. +0 means that only the page you enter under \"Starting Point\" will be added==0 bedeutet, dass nur die Seite unter "Startpunkt" +to the index. 2-4 is good for normal indexing. Values over 8 are not useful, since a depth-8 crawl will==dem Index zugefügt wird. 2-4 ist gut für normales Indexieren. Werte über 8 sind nicht nützlich, denn eine Suche mit Suchtiefe 8 würde +index approximately 25.600.000.000 pages, maybe this is the whole WWW.==ungefähr 25.600.000.000 Seiten indexieren, vielleicht sogar das ganze WWW. +Scheduled re-crawl<==Geplanter Re-Crawl< +>no doubles<==>Keine Dubletten< +run this crawl once and never load any page that is already known, only the start-url may be loaded again.==Führe diesen Crawl einmalig aus und lade niemals eine schon bekannte Seite nach. Nur die URL unter Startpunkt darf noch einmal geladen werden. +>re-load<==>Nachladen< +run this crawl once, but treat urls that are known since==führe diesen Crawl einmalig aus aber behandle URLs die bereits seit +>years<==>Jahre< +>months<==>Monate< +>days<==>Tage< +>hours<==>Stunden< +not as double and load them again. No scheduled re-crawl.==bekannt sind nicht als Dubletten und lade sie erneut. +>scheduled<==>Geplant< +after starting this crawl, repeat the crawl every==Nach dem Start dieses Crawls, führe ihn jede +> automatically.==> automatisch aus. +A web crawl performs a double-check on all links found in the internet against the internal database. If the same url is found again,==Ein Web Crawl führt eine Dubletten Prüfung anhand einer internen Datenbank gegen alle im Internet gefunden Links durch. Wenn dieselbe URL wieder gefunden wird, +then the url is treated as double when you check the \'no doubles\' option. A url may be loaded again when it has reached a specific age,==wird die URL als Dublette behandelt wenn die 'Keine Doubletten' Option ausgewählt wurde. Eine URL kann noch einmal geladen werden wenn sie ein bestimmtes Alter erreicht hat. +to use that check the \'re-load\' option. When you want that this web crawl is repeated automatically, then check the \'scheduled\' option.==Dafür kann die 'Nachladen' Option verwendet werden. Wenn der Web Crawl automatisch wiederholt werden soll, kann die 'Geplant' Option ausgewählt werden. +In this case the crawl is repeated after the given time and no url from the previous crawl is omitted as double.==In diesem Fall wird der Crawl erneut nach der eingestellten Zeit ausgeführt und keine URL aus einem vorhergegangenem Crawl wird als Dublette ausgelassen. +Must-Match Filter==Muss-entsprechen Filter +Use filter==Filter nutzen +Restrict to start domain==Auf Startdomain beschränken +Restrict to sub-path==Auf Sub-Pfad beschränken +#The filter is an emacs-like regular expression that must match with the URLs which are used to be crawled;==Dieser Filter ist ein emacs-ähnlicher regulärer Ausdruck, der mit den zu crawlenden URLs übereinstimmen muss; +The filter is a regular expression==Dieser Filter ist ein Regulärer Ausdruck +that must match with the URLs which are used to be crawled; default is \'catch all\'.==der auf die zum Crawlen verwendeten URLs zutreffen muss. Die Standard Einstellung ist 'alle zulassen'. +Example: to allow only urls that contain the word \'science\', set the filter to \'.*science.*\'.==Beispiel: Um nur URLs zuzulassen, die das Wort 'Wissenschaft' beeinhalten, setzen Sie den Filter auf '.*Wissenschaft.*'. +You can also use an automatic domain-restriction to fully crawl a single domain.==Sie können aber auch eine automatische Domain-Beschränkung benutzen, um eine einzelne Domain komplett zu crawlen. +Must-Not-Match Filter==Muss-nicht-entsprechen Filter +This filter must not match to allow that the page is accepted for crawling.==Dieser Filter muss nicht passen, um zu erlauben, dass die Seite zum crawlen akzeptiert wird. +The empty string is a never-match filter which should do well for most cases.==Ein leeres Feld ist ein niemals-passend Filter, der in den meisten Fällen gute Dienste leisten sollte. +If you don't know what this means, please leave this field empty.==Wenn Sie nicht wissen, was dies bedeutet, lassen Sie das Feld einfach leer. +#Re-crawl known URLs:==Re-crawl bekannter URLs: +Use:==Benutzen: +#It depends on the age of the last crawl if this is done or not: if the last crawl is older than the given==Es hängt vom Alter des letzten Crawls ab, ob dies getan oder nicht getan wird: wenn der letzte Crawl älter als das angegebene +#Auto-Dom-Filter:==Auto-Dom-Filter: +#This option will automatically create a domain-filter which limits the crawl on domains the crawler==Diese Option erzeugt automatisch einen Domain-Filter der den Crawl auf die Domains beschränkt , +#will find on the given depth. You can use this option i.e. to crawl a page with bookmarks while==die auf der angegebenen Tiefe gefunden werden. Diese Option kann man beispielsweise benutzen, um eine Seite mit Bookmarks zu crawlen +#restricting the crawl on only those domains that appear on the bookmark-page. The adequate depth==und dann den folgenden Crawl automatisch auf die Domains zu beschränken, die in der Bookmarkliste vorkamen. Die einzustellende Tiefe für +#for this example would be 1.==dieses Beispiel wäre 1. +#The default value 0 gives no restrictions.==Der Vorgabewert 0 bedeutet, dass nichts eingeschränkt wird. +Maximum Pages per Domain:==Maximale Seiten pro Domain: +Page-Count==Seitenanzahl +You can limit the maximum number of pages that are fetched and indexed from a single domain with this option.==Sie können die maximale Anzahl an Seiten, die von einer einzelnen Domain gefunden und indexiert werden, mit dieser Option begrenzen. +You can combine this limitation with the 'Auto-Dom-Filter', so that the limit is applied to all the domains within==Sie können diese Option auch mit dem 'Auto-Dom-Filter' kombinieren, so dass das Limit für alle Domains mit der +the given depth. Domains outside the given depth are then sorted-out anyway.==angegebenen Tiefe gilt. Domains ausserhalb der angegebenen Tiefe werden einfach aussortiert. +Accept URLs with==Akzeptiere URLs mit +dynamic URLs==dynamische URLs +A questionmark is usually a hint for a dynamic page. URLs pointing to dynamic content should usually not be crawled. However, there are sometimes web pages with static content that==Ein Fragezeichen ist normalerweise ein Hinweis auf eine dynamische Seite. URLs mit dynamischem Inhalt sollten normalerweise nicht gecrawlt werden. Wie auch immer, manchmal gibt es Seiten mit festem Inhalt, die +is accessed with URLs containing question marks. If you are unsure, do not check this to avoid crawl loops.==nur von URLs zu erreichen sind, die ein Fragezeichen enthalten. Wenn Sie unsicher sind, aktivieren Sie diese Funktion nicht, um Crawl Schleifen zu vermeiden. +Store to Web Cache==Speichern im Web-Cache +This option is used by default for proxy prefetch, but is not needed for explicit crawling.==Diese Option ist standardmäßig beim Proxy aktiviert, wird aber zum reinen Crawlen nicht gebraucht. +Policy for usage of Web Cache==Regeln für die Nutzung des Web Caches +The caching policy states when to use the cache during crawling:==Die Caching Regeln legen fest wann der Cache während des Crawlen verwendet wird: +#no cache==no cache +no cache==kein Cache +#if fresh==if fresh +if fresh==bei frischem Cache Hit +#if exist==if exist +if exist==bei Cache Hit +#cache only==cache only +cache only==nur Cache +never use the cache, all content from fresh internet source;==Den Cache nie verwenden, allen Inhalt frisch von der Online Quelle +use the cache if the cache exists and is fresh using the proxy-fresh rules;==Verwende den Cache, wenn ein Treffer im Cache existiert und dieser aktuell ist. +use the cache if the cache exist. Do no check freshness. Otherwise use online source;==Verwende den Cache, wenn ein Treffer existiert ohne die Aktualität zu prüfen. Andernfalls verwende die Quelle online; +never go online, use all content from cache. If no cache exist, treat content as unavailable==Gehe niemals online, verwende nur den Cache Inhalt. Wenn kein Cache existiert, behandle den Inhalt als nicht verfügbar +Do Local Indexing:==Lokales Indexieren: +index text==Indexiere Text +index media==Indexiere Medien +This enables indexing of the wepages the crawler will download. This should be switched on by default, unless you want to crawl only to fill the==Dies aktiviert die Indexierung von Webseiten, die der Crawler runterlädt. Dies sollte standardmässig aktiviert sein, ausser Sie wollen den +Document Cache without indexing.==Dokumenten Cache ohne Indexierung füllen. +Do Remote Indexing==Nutze Remote Indexierung +Describe your intention to start this global crawl \(optional\)==Beschreiben Sie warum Sie diesen globalen Crawl starten (optional) +This message will appear in the 'Other Peer Crawl Start' table of other peers.==Diese Nachricht wird bei anderen Peers in der 'Anderer Peer Crawl Start' Tabelle angezeigt. +If checked, the crawler will contact other peers and use them as remote indexers for your crawl.==Wenn aktiviert, wird der Crawler mit anderen Peers Kontakt aufnehmen und diese als Remote Indexierer für Ihren Crawl benutzen. +If you need your crawling results locally, you should switch this off.==Wenn Sie die Crawling Ergebnisse lokal benötigen, sollten Sie diese Funktion deaktivieren. +Only senior and principal peers can initiate or receive remote crawls.==Nur Senior und Principal Peers können einen remote Crawl initiieren oder erhalten. +A YaCyNews message will be created to inform all peers about a global crawl==Eine Nachricht wird im YaCy News Bereich angezeigt, um alle Peers von diesem globalen Crawl zu informieren +so they can omit starting a crawl with the same start point.==damit sie es vermeiden können, einen Crawl vom selben Startpunkt zu starten. +Exclude static Stop-Words==Statische Stop-Words ausschließen +This can be useful to circumvent that extremely common words are added to the database, i.e. \"the\", \"he\", \"she\", \"it\"... To exclude all words given in the file yacy.stopwords from indexing,==Dies ist sinnvoll, um zu verhindern, dass extrem häufig vorkommende Wörter wie z.B. "der", "die", "das", "und", "er", "sie" etc in die Datenbank aufgenommen werden. Um alle Wörter von der Indexierung auszuschließen, die in der Datei yacy.stopwords enthalten sind, +check this box.==aktivieren Sie diese Box. +"Start New Crawl"=="Neuen Crawl starten" +#----------------------------- +#File: CrawlStartIntranet_p.html +#--------------------------- +#Intranet Crawl Start==Intranet Crawl Start +When an index domain is configured to contain intranet links,==Wenn eine Index Domain konfiguriert wurde die Intranet Links enthält, +the intranet may be scanned for available servers.==kann dieses Intranet auf verfügbare Server gescannt werden. +Please select below the servers in your intranet that you want to fetch into the search index.==Bitte in der folgenden Server Liste aus Ihrem Intranet auswählen, welche Sie in den Suchindex aufnehmen wollen. +This network definition does not allow intranet links.==Diese Netzwerk Konfiguration erlaubt keine Intranet Links. +A list of intranet servers is only available if you confiugure YaCy to index intranet targets.==Eine Liste mit Servern aus dem Intranet ist nur verfügbar, wenn Sie YaCy auch konfiguriert haben Intranetseiten zu indexieren. +To do so, open the Basic Configuration servlet and select the \'Intranet Indexing\' use case.==Um diese Einstellung vorzunehmen, bitte im Servlet Basis Konfiguration den Anwendungsfall 'Intranet Indexierung' auswählen. +Available Intranet Server==Verfügbare Intranet Server +#>IP<==>IP< +#>URL<==>URL< +>Process<==>Status< +>not in index<==>Nicht im Index< +>indexed<==>Indexiert< +"Add Selected Servers to Crawler"=="Füge ausgewählte Server zum Crawler hinzu" +#----------------------------- +#File: CrawlStartScanner_p.html +#--------------------------- +Network Scanner==Netzwerk Scanner +YaCy can scan a network segment for available http, ftp and smb server.==YaCy kann ein Netzwerksegment auf verfügbare HTTP, FTP und SMB Server hin absuchen. +You must first select a IP range and then, after this range is scanned,==Sie müssen zuerst einen IP Bereich festlegen und dann, nachdem dieser Bereich gescannt wurde, +it is possible to select servers that had been found for a full-site crawl.==ist es möglich einen gefunden Server für eine volle Seiten Suche crawlen zu lassen. +No servers had been detected in the given IP range \#\[iprange\]\#. +Please enter a different IP range for another scan.==Bitte geben Sie einen anderen IP Bereich ein für einen weiteren Scan. +Please wait...==Bitte warten... +>Scan the network<==>Das Netzwerk Scannen< +Scan Range==Scan Bereich +Scan sub-range with given host==Scanne Unterbereich von angegebenen Host aus +Full Intranet Scan:==Voller Intranet Scan: +Do not use intranet scan results, you are not in an intranet environment!==Verwenden Sie nicht die Intranet Scan Resultate, da sie sich nicht in einer Intranet Umgebung befinden! +>Scan Cache<==>Scan Cache< +accumulate scan results with access type \"granted\" into scan cache \(do not delete old scan result\)==Sammle Scan Ergebnisse mit dem Zugriffstyp "granted" im Scan Cache (Lösche keine alten Scan Ergebnisse) +>Service Type<==>Service Typ< +#>ftp==>FTP +#>smb==>SMB +#>http==>HTTP +#>https==>HTTPS +>Scheduler<==>Scan Planung< +run only a scan==Nur einmalig Scannen +scan and add all sites with granted access automatically. This disables the scan cache accumulation.==Scannen und alle Webseiten mit erlaubtem Zugriff automatisch hinzufügen. Diese Einstellungen deaktiviert die Scan Cache Ansammlung. +Look every==Überprüfe alle +>minutes<==>Minuten< +>hours<==>Stunden< +>days<==>Tage< +again and add new sites automatically to indexer.==wieder und füge neue Seiten automatisch zum Indexer hinzu. +Sites that do not appear during a scheduled scan period will be excluded from search results.==Seiten die nicht im Laufe eines geplanten Scans auftauchen werden von den Suchergebnissen ausgeschlossen. +"Scan"=="Scannen" +The following servers had been detected:==Die folgenden Server wurden entdeckt: +Available server within the given IP range==Verfügbare Server innerhalb des angegebenen IP Bereichs +>Protocol<==>Protokoll< +#>IP<==>IP< +#>URL<==>URL< +>Access<==>Zugriff< +>Process<==>Prozess< +>unknown<==>unbekannt< +>empty<==>leer< +>granted<==>erlaubt< +>denied<==>verweigert< +>not in index<==>nicht im Index< +>indexed<==>indexiert< +"Add Selected Servers to Crawler"=="Füge ausgewählte Server zum Crawlen hinzu" +#----------------------------- +#File: CrawlStartSite_p.html +#--------------------------- +>Site Crawling<==>Сканирование сайта< +Site Crawler:==Сканирование сайта: +Download all web pages from a given domain or base URL.==Загрузить все веб страницы из указанного домена или основного URL. +>Site Crawl Start<==>Запуск сканирования сайта< +>Site<==>Сайт< +Start URL==Начальный URL +Link-List of URL==Список ссылок URL адресов +Sitemap URL==Карта сайта URL +>Scheduler<==>Планировщик< +run this crawl once==запустить сканирование один раз +scheduled, look every==по рассписанию, сканировать каждые +>minutes<==>минут< +>hours<==>часов< +>days<==>дней< +for new documents automatically.==автоматически, на наличие новых документов. +>Path<==>Путь< +load all files in domain==загрузить все файлы в этом домене +load only files in a sub-path of given url==загрузить файлы только по ссылкам указаных в URL адресе +>Limitation<==>Ограничения< +not more than <==не больше чем < +>documents<==>документов< +>Dynamic URLs<==>Динамический URL< +query-strings==строка запроса +allow <==позволить < +urls with a \'\?\' in the path==URL адреса '?' в адресе +>Start<==>Запуск< +"Start New Crawl"=="Запуск нового сканирования" +Hints<==Подсказки< +>Crawl Speed Limitation<==>Ограничение скорости сканирования< +No more that two pages are loaded from the same host in one second \(not more that 120 document per minute\) to limit the load on the target server.==Не более чем две странички с одного хоста в секунду (не более чем 120 документов в минуту), для ограничения загруженности удаленного сервера. +>Target Balancer<==>Цель балансировки< +A second crawl for a different host increases the throughput to a maximum of 240 documents per minute since the crawler balances the load over all hosts.==Второе сканирование по другому хосту увеличивает пропускную способность сканирования до 240 документов в минуту с балансировкой нагрузки по всем хостам. +>High Speed Crawling<==>Высокая скорость сканирования< +A \'shallow crawl\' which is not limited to a single host \(or site\)=='Медленное сканирование' не ограничено по одному хосту (или сайту) +can extend the pages per minute \(ppm\) rate to unlimited documents per minute when the number of target hosts is high.==скорость сканирования которого страниц в минуту (СвМ) может быть увеличено на неограниченное, когда число удаленных хостов высока. +This can be done using the Expert Crawl Start servlet.==Это можно сделать с помощью запуска экспектора сканирования. +>Scheduler Steering<==>Управление планировщиком< +The scheduler on crawls can be changed or removed using the API Steering.==Рассписание сканирование может быть изменено или удалено используя управлением API. +#----------------------------- +#File: Help.html +#--------------------------- +YaCy: Help==YaCy: Hilfe +Tutorial==Руководство +You are using the administration interface of your own search engine==Sie benutzen gerade das Administrationsinterface ihrer eigenen Suchmaschine +You can create your own search index with YaCy==Sie können mit YaCy Ihren eigenen Suchindex erstellen +To learn how to do that, watch one of the demonstration videos below==Bitte sehen Sie als Anleitung eine Demonstration (2. Video unten in deutscher Sprache) +#----------------------------- +#File: index.html +#--------------------------- +YaCy \'\#\[clientname\]\#\': Search Page==YaCy '#[clientname]#': Suchseite +#kiosk mode==Kiosk Modus +"Search"=="Поиск" +Text==Текст +Images==Картинки +#Audio==Аудио +Video==Видео +Applications==Anwendungen +more options...==Расширенный поиск... +advanced parameters==erweiterte Parameter +Max. number of results==Max. Anzahl der Ergebnisse +Results per page==Ergebnisse pro Seite +Resource==Quelle +global==global +>local==>lokal +Global search is disabled because==Die globale Suche ist deaktiviert, denn +DHT Distribution is==die DHT-Verteilung ist +Index Receive is==der Index-Empfang ist +DHT Distribution and Index Receive are==DHT-Verteilung und Index-Empfang sind +disabled.\#\(==deaktiviert.#( +URL mask==URL-Filter +restrict on==beschränken auf +show all==alle zeigen +#überarbeiten!!! +Prefer mask==Vorzugsmaske +Constraints==Einschränkungen +only index pages==Nur Index-Seiten +"authentication required"=="Autorisierung erforderlich" +Disable search function for users without authorization==Suchfunktion für Benutzer ohne Autorisierung sperren +Enable web search to everyone==Suchfunktion für alle Nutzer erlauben +the peer-to-peer network==Peer-to-Peer-Netzwerk +only the local index==Nur lokaler Index +Query Operators==Such-Operatoren +restrictions==Restriktionen +only urls with the <phrase> in the url==Nur URLs, welche <phrase> enthalten +only urls with extension==Nur URLs mit der Dateinamenserweiterung +only urls from host==Nur URLs vom Server +only pages with as-author-anotated==Nur Seiten mit dem angegebenen Autor +only pages from top-level-domains==Nur Seiten aus der Top-Level-Domain +only resources from http or https servers==Nur Ressources auf HTTP- oder HTTPS-Servern +only resources from ftp servers==Nur Ressourcen auf FTP-Servern +they are rare==eher selten +crawl them yourself==crawlen Sie sie selbst +only resources from smb servers==Nur Ressourcen von SMB-Servern +Intranet Indexing must be selected==Intranet-Indexierung muss ausgewählt sein +only files from a local file system==Nur Dateien aus dem lokalen Dateisystem +ranking modifier==Ranking-Modifizierung +sort by date==сортировка по дате +latest first==Neuste zuerst +multiple words shall appear near==Mehrere Wörter sollen nah zusammen stehen +doublequotes==Anführungszeichen +prefer given language==Angegebene Sprache bevorzugen +an ISO639 2-letter code==2-Buchstaben-Ländercode nach ISO639 +heuristics==Heuristiken +add search results from scroogle==Benutze zusätzliche Ergebnisse von Scroogle +add search results from blekko==Benutze zusätzliche Ergebnisse von Blekko +Search Navigation==Such-Navigation +keyboard shotcuts==Tastatur-Kürzel +tab or page-up==Tab oder Bild hoch +next result page==Nächste Ergebnisseite +page-down==Bild nach unten +previous result page==Vorherige Ergebnisseite +automatic result retrieval==Automatische Ergebnis-Abfrage +browser integration==Browserintegration +after searching, click-open on the default search engine in the upper right search field of your browser and select 'Add "YaCy Search.."'==Nach der Suche clicken Sie auf das Suchfeld Ihres Browsers und wählen Sie '"YaCy" hinzufügen' +search as rss feed==Suche als RSS-Feed +click on the red icon in the upper right after a search. this works good in combination with the '/date' ranking modifier. See an==Klicken Sie nach der Suche auf das rote Icon in der rechten oberen Ecke. Dies funktioniert gut mit dem '/date' Ranking-Modifizierer. Hier ein +>example==>Beispiel +json search results==JSON-Suchergebnisse +for ajax developers: get the search rss feed and replace the '.rss' extension in the search result url with '.json'==Für AJAX-Entwickler: Rufen Sie den RSS-Feed auf und ersetzen Sie '.rss' durch '.json' +#----------------------------- +#File: IndexCleaner_p.html +#--------------------------- +Index Cleaner==Index Aufräumer +>URL-DB-Cleaner==>URL-DB-Aufräumer +#ThreadAlive: +#ThreadToString: +Total URLs searched:==Insgesamt durchsuchte URLs: +Blacklisted URLs found:==URLS auf Blacklist gefunden: +Percentage blacklisted:==Prozent auf Blacklist: +last searched URL:==zuletzt durchsuchte URL: +last blacklisted URL found:==zuletzt gefundene URL auf Blacklist: +>RWI-DB-Cleaner==>RWI-DB-Aufräumer +RWIs at Start:==RWIs beim Start: +RWIs now:==RWIs jetzt: +wordHash in Progress:==Wort-Hash in Benutzung: +last wordHash with deleted URLs:==letzter Wort-Hash mit gelöschten URLs: +Number of deleted URLs in on this Hash:==Anzahl an gelöschten URLs in diesem Hash: +URL-DB-Cleaner - Clean up the database by deletion of blacklisted urls:==URL-DB-Aufräumer - Räumen Sie Ihre Datenbank auf, indem Sie URLs, die auf Ihrer Blacklist stehen, löschen: +Start/Resume==Start/Fortsetzen +Stop==Stopp +Pause==Anhalten +RWI-DB-Cleaner - Clean up the database by deletion of words with reference to blacklisted urls:==RWI-DB-Aufräumer - Räumen Sie Ihre Datenbank auf, indem Sie Wörter, die mit Ihrer Blacklist verbunden sind, löschen: +#----------------------------- +#File: IndexControlRWIs_p.html +#--------------------------- +Reverse Word Index Administration==Reverse Wort Indexverwaltung +The local index currently contains \#\[wcount\]\# reverse word indexes==Der lokale Index enthält im Moment #[wcount]# inverse Wort Indexe +RWI Retrieval \(= search for a single word\)==RWI Abfrage (= Suche nach einem einzelnen Wort) +Select Segment:==Segment Auswahl: +Retrieve by Word:<==Abfrage nach Wort:< +"Show URL Entries for Word"=="URL Einträge für Wort zeigen" +Retrieve by Word-Hash==Abfrage nach Wort-Hash +"Show URL Entries for Word-Hash"=="URL Einträge für Wort-Hash zeigen" +"Generate List"=="Liste erstellen" +Cleanup==Aufräumen +>Index Deletion<==>Index Löschung< +>Delete Search Index<==>Lösche Suchindex< +Stop Crawler and delete Crawl Queues==Crawler anhalten und Crawler Warteschlangen löschen +Delete HTTP & FTP Cache==Lösche HTTP & FTP Cache +Delete robots.txt Cache==Lösche robots.txt Cache +Delete cached snippet-fetching failures during search==Lösche gecachte Snippet-Holen Fehler während der Suche +"Delete"=="Löschen" +No entry for word \'\#\[word\]\#\'==Keinen Eintrag zu Wort '#[word]#' +No entry for word hash==Keinen Eintrag zu Wort-Hash +Search result==Suchergebnis +total URLs==insgesamte URLs +appearance in==kommt vor in +in link type==im Link-Typ +document type==Dokumenten-Typ +description==Beschreibung +title==Titel +creator==Erzeuger +subject==Тема +url==URL +emphasized==betont +image==Bilder +audio==Audio +video==Video +app==Anwendung +index of==Index of +>Selection==>Auswahl +Display URL List==Anzeige der URL-Liste +Number of lines==Zeilenanzahl +all lines==alle Zeilen +"List Selected URLs"=="Ausgewählte URLs anzeigen" +Transfer RWI to other Peer==RWI Transfer an anderen Peer +Transfer by Word-Hash==Transfer per Wort-Hash +"Transfer to other peer"=="An anderen Peer senden" +to Peer==an Peer +
    select==
    auswählen +or enter a hash==oder Hash eingeben +Sequential List of Word-Hashes==aufeinanderfolgende Liste der URL-Hashes +No URL entries related to this word hash==Keine URL Einträge zugehörig zu diesem Wort Hash +\#\[count\]\# URL entries related to this word hash==#[count]# URL Einträge zugehörig zu diesem Wort Hash +Resource==Ressource +Negative Ranking Factors==Negative Ranking Faktoren +Positive Ranking Factors==Positive Ranking Faktoren +Reverse Normalized Weighted Ranking Sum==Inverse normalisierte gewichtete Ranking Summe +hash==Hash +dom length==Domain Länge +ybr==YBR +#url comps +url length==URL Länge +pos in text==Pos. im Text +pos of phrase==Pos. des Satzes +pos in phrase==Pos. im Satz +word distance==Wort Distanz +authority==Autorität +date==Дата +words in title==слов в заголовке +words in text==слов в тексте +local links==lokale Links +remote links==remote Links +hitcount==Trefferzahl +#props== +unresolved URL Hash==ungelöster URL-Hash +Word Deletion==Wort Löschung +Deletion of selected URLs==Löschung von selektierten URLs +delete also the referenced URL \(recommended, may produce unresolved references==lösche ebenso die verwiesene URL (empfohlen, produziert eventuell ungelöste Referenzen +at other word indexes but they do not harm\)==an anderen Wort Indizes, aber es verursacht keinen Schaden +for every resolvable and deleted URL reference, delete the same reference at every other word where==für jede lösbare und gelöschte URL Referenz, lösche die selbe Referenz bei jedem anderen Wort, wo +the reference exists \(very extensive, but prevents further unresolved references\)==die Referenz existiert (sehr umfassend, aber bewahrt vor weiteren ungelösten Referenzen) +"Delete reference to selected URLs"=="Referenz und markierte URLs löschen" +"Delete Word"=="Wort löschen" +Blacklist Extension==Blacklist Erweiterung +"Add selected URLs to blacklist"=="Markierte URLs zu Blacklist hinzufügen" +"Add selected domains to blacklist"=="Markierte Domains zu Blacklist hinzufügen" +#----------------------------- +#File: IndexControlURLs_p.html +#--------------------------- +URL References Administration==URL Referenzen Administration +The local index currently contains \#\[ucount\]\# URL references==Der lokale Index enthält im Moment #[ucount]# URL-Referenzen +URL Retrieval==URL Abfrage +Select Segment:==Segment Auswahl: +Retrieve by URL:<==Abfrage nach URL:< +"Show Details for URL"=="Details für URL zeigen" +Retrieve by URL-Hash==Abfrage nach URL-Hash +"Show Details for URL-Hash"=="Details für URL-Hash zeigen" +"Generate List"=="Liste erstellen" +Statistics about top-domains in URL Database==Statistik über die Top-Domains in der URL Datenbank +Show top==Zeige die +domains from all URLs.==Top-Domains aus allen URLs. +"Generate Statistics"=="Statistik erstellen" +Statistics about the top-\#\[domains\]\# domains in the database:==Statistik über die Top-#[domains]# Domains in der Datenbank: +"delete all"=="Alle Löschen" +#Domain==Domain +#URLs==URLs +Sequential List of URL-Hashes==Sequentielle Liste der URL-Hashes +Loaded URL Export==Export geladener URLs +Export File==Export-Datei +#URL Filter==URL Filter +#Export Format==Export Format +#Only Domain \(superfast\)==Nur Domains (sehr schnell) +Only Domain:==Liste mit nur Domainnamen: +Full URL List:==Liste mit vollständiger URL: +Plain Text List \(domains only\)==Einfache Text Liste (nur Domains) +HTML \(domains as URLs, no title\)==HTML (Domains als URLs, kein Titel) +#Full URL List \(high IO\)==Vollständige URL Liste (hoher IO) +Plain Text List \(URLs only\)==Einfache Text Liste (nur URLs) +HTML \(URLs with title\)==HTML (URLs mit Titel) +#XML (RSS)==XML (RSS) +"Export URLs"=="URLs exportieren" +Export to file \#\[exportfile\]\# is running .. \#\[urlcount\]\# URLs so far==Export nach Datei #[exportfile]# läuft .. #[urlcount]# URLs bisher +Finished export of \#\[urlcount\]\# URLs to file==Export beendet und #[urlcount]# URLs gespeichert in Datei +Export to file \#\[exportfile\]\# failed:==Export in Datei #[exportfile]# fehlgeschlagen: +No entry found for URL-hash==Keinen Eintrag gefunden für URL-Hash +#URL String==URL Adresse +#Hash==Hash +#Description==Beschreibung +#Modified-Date==Änderungsdatum +#Loaded-Date==Ladedatum +#Referrer==Referrer +#Doctype==Dokumententyp +#Language==Язык +#Size==Размер +#Words==Слов +"Show Content"=="Inhalt anzeigen" +"Delete URL"=="URL löschen" +this may produce unresolved references at other word indexes but they do not harm==dies mag ungelöste Referenzen an anderen Wort Indizes erzeugen, aber es richtet keinen Schaden an +"Delete URL and remove all references from words"=="URL löschen und alle Referenzen zu Wörtern entfernen" +delete the reference to this url at every other word where the reference exists \(very extensive, but prevents unresolved references\)==löscht die Referenz zu dieser URL und jedem anderen Wort, wo die Referenz existiert (sehr umfassend, aber bewahrt vor ungelösten Referenzen) +#----------------------------- +#File: IndexCreateLoaderQueue_p.html +#--------------------------- +Loader Queue==Lade-Puffer +The loader set is empty==Der Lade-Puffer ist leer. +There are \#\[num\]\# entries in the loader set:==Es befinden sich #[num]# Einträge in dem Lade-Puffer: +Initiator==Initiator +Depth==Tiefe +#URL==URL +#----------------------------- +#File: IndexCreateParserErrors_p.html +#--------------------------- +Parser Errors==Parser Fehler +Rejected URL List:==Liste der zurückgewiesenen URLs: +There are \#\[num\]\# entries in the rejected-urls list.==Es befinden sich #[num]# Einträge in Liste der zurückgewiesenen URLs. +Showing latest \#\[num\]\# entries.==Es werden die letzten #[num]# Einträge angezeigt. +"show more"=="Mehr anzeigen" +"clear list"=="Liste löschen" +There are \#\[num\]\# entries in the rejected-queue:==Es befinden sich #[num]# Einträge in der zurückgewiesenen URL Liste: +#Initiator==Initiator +Executor==Ausführender +#URL==URL +Fail-Reason==Fehlermeldung +#----------------------------- +#File: ContentIntegrationPHPBB3_p.html +#--------------------------- +Content Integration: Retrieval from phpBB3 Databases==Integration von Inhalt: Import aus phpBB3 Datenbanken +It is possible to extract texts directly from mySQL and postgreSQL databases.==Es ist möglich Texte direkt aus MySQL und PostgreSQL Datenbanken zu extrahieren. +Each extraction is specific to the data that is hosted in the database.==Jeder Vorgang extrahiert genau die Datensätze die in der Datenbank gehostet werden. +This interface gives you access to the phpBB3 forums software content.==Dieses Interface erlaubt den Zugriff auf die Inhalte der phpBB3 Forum Software. +If you read from an imported database, here are some hints to get around problems when importing dumps in phpMyAdmin:==Wenn aus einer importierten Datenbank gelesen werden soll sind hier einige Hinweise, um Probleme zu vermeiden wenn Datenbankdumps in phpMyAdmin importiert werden. +before importing large database dumps, set==Bevor große Datenbankdumps importiert werden die folgende Zeile +in phpmyadmin/config.inc.php and place your dump file in /tmp \(Otherwise it is not possible to upload files larger than 2MB\)==in die Datei phpmyadmin/config.inc.php schreiben und die Datenbank Datei in /tmp ablegen (Andernfalls ist es nicht möglich Dateien größer als 2MB hochzuladen) +deselect the partial import flag==Den teilweisen Import Flag abschalten +When an export is started, surrogate files are generated into DATA/SURROGATE/in which are automatically fetched by an indexer thread.==Wenn ein Export gestartet wird werden Hilfsdateien in DATA/SURROGATE/in erzeugt, die automatisch von einem Indexer Thread geholt und verarbeitet werden. +All indexed surrogate files are then moved to DATA/SURROGATE/out and can be re-cycled when an index is deleted.==Alle indexierten Hilfsdateien werden dann nach DATA/SURROGATE/out verschoben und können recycelt werden wenn ein Index gelöscht wird. +The URL stub==Der Teil der URL +like http://forum.yacy-websuche.de==wie z.B. http://forum.yacy-websuche.de +this must be the path right in front of '\/viewtopic.php\?'==dies muss den kompletten Pfad vor '\/viewtopic.php\?' enthalten +Type==Typ +> of database<==> der Datenbank< +use either 'mysql' or 'pgsql'==Verwende entweder 'mysql' oder 'pgsql' +Host=Hostname +> of the database<==> der Datenbank< +of database service==des Datenbank Dienstes +usually 3306 for mySQL==normalerweise 3306 für MySQL +Name of the database==Name der Datenbank +on the host==auf dem Host +Table prefix string==Tabellen Präfix +for table names==für Tabellennamen +User==Benutzer +that can access the database==mit Zugriff auf die Datenbank +Password==Passwort +for the account of that user given above==für den Zugang des oben angegebenen Benutzers +Posts per file==Beiträge pro Datei +in exported surrogates==in der exportierten Hilfsdatei +Check database connection==Datenbankverbindung überprüfen +Export Content to Surrogates==Exportiere Inhalt in Hilfsdateien +Import a database dump==Importieren eines Datenbankauszugs +Import Dump==Datenbankdump importieren +Posts in database==Beiträge in Datenbank +first entry==Erster Eintrag +last entry==Letzter Eintrag +Info failed:==Info Fehlgeschlagen: +Export successful! Wrote \#\[files\]\# files in DATA/SURROGATES/in==Export erfolgreich! #[files]# Dateien in DATA/SURROGATES/in geschrieben +Export failed:==Export fehlgeschlagen: +Import successful!==Import erfolgreich! +Import failed:==Import fehlgeschlagen: +#----------------------------- +#File: DictionaryLoader_p.html +#--------------------------- +Dictionary Loader==Загрузка словоря +YaCy can use external libraries to enable or enhance some functions. These libraries are not==YaCy kann externe Bibliotheken zum Erweitern oder Aktivieren bestimmter Funktionen verwenden. Diese Bibliotheken sind nicht +included in the main release of YaCy because they would increase the application file too much.==im Standard Release von YaCy enthalten weil diese die Anwendungsdatei zu stark vergrößern würden. +You can download additional files here.==Sie können zusätzliche Dateien hier herunterladen. +>Geolocalization<==>Geolokalisierung< +Geolocalization will enable YaCy to present locations from OpenStreetMap according to given search words.==Geolokalisierung erlaubt es YaCy bestimmte Orte auf OpenStreetMap zu bestimmten Suchbegriffen zu präsentieren. +>GeoNames<==>Geografische Namen< +With this file it is possible to find cities with a population > 1000 all over the world.==Mit dieser Datei ist es möglich Städte überall auf der Erde zu finden die mehr als 1000 Einwohner haben. +>Download from<==>Download von< +>Storage location<==>Speicherort< +#>Status<==>Status< +>not loaded<==>nicht geladen< +>loaded<==>geladen< +:deactivated==:deaktiviert +>Action<==>Aktion< +>Result<==>Resultat< +"Load"=="Laden" +"Deactivate"=="Deaktivieren" +"Remove"=="Entfernen" +"Activate"=="Aktivieren" +>loaded and activated dictionary file<==>Wörterbuch Datei geladen und aktiviert< +>loading of dictionary file failed: \#\[error\]\#<==>Laden der Wörterbuch Datei ist fehlgeschlagen: #[error]#< +>deactivated and removed dictionary file<==>Wörterbuch Datei deaktiviert und entfernt< +>cannot remove dictionary file: \#\[error\]\#<==>Wörterbuch Datei kann nicht entfernt werden: #[error]#< +>deactivated dictionary file<==>Wörterbuch Datei deaktiviert< +>cannot deactivate dictionary file: \#\[error\]\#<==>Wörterbuch Datei kann nicht deaktiviert werden: #[error]#< +>activated dictionary file<==>Wörterbuch Datei aktiviert< +>cannot activate dictionary file: \#\[error\]\#<==>Wörterbuch Datei kann nicht aktiviert werden: #[error]#< +#>OpenGeoDB<==>OpenGeoDB< +>With this file it is possible to find locations in Germany using the location \(city\) name, a zip code, a car sign or a telephone pre-dial number.<==>Mit dieser Datei ist es möglich, Orte in Deutschland anhand des (Stadt)Namens, der Postleitzahl, eines Autokennzeichens oder einer Telefonvorwahl zu finden.< +#----------------------------- +#File: IndexCreateWWWGlobalQueue_p.html +#--------------------------- +Global Crawl Queue==Globaler Crawl-Puffer +This queue stores the urls that shall be sent to other peers to perform a remote crawl.==Dieser Puffer enthält URLs, die an andere Peers gesendet werden sollen, um einen Remote Crawl durchzuführen. +If there is no peer for remote crawling available, the links are crawled locally.==Wenn kein Peer zum Remote Crawl vorhanden ist, werden die Links lokal gecrawlt. +The global crawler queue is empty==Der globale Crawler-Puffer ist leer. +"clear global crawl queue"=="Lösche globalen Crawler-Puffer" +There are \#\[num\]\# entries in the global crawler queue. Showing \#\[show-num\]\# most recent entries.==Es befinden sich #[num]# Einträge in dem globalen Crawler-Puffer. Gezeigt werden die #[show-num]# neuesten Einträge. +Show last==Zeige die letzten + entries.== Einträge. +Initiator==Initiator +Profile==Profil +Depth==Tiefe +Modified Date==Änderungsdatum +Anchor Name==Anker Name +#URL==URL +#----------------------------- +#File: IndexCreateWWWLocalQueue_p.html +#--------------------------- +Local Crawl Queue==Очередь локального сборщика +This queue stores the urls that shall be crawled localy by this peer.==Dieser Puffer enthält URLs, die von diesem Peer lokal gecrawlt werden sollen. +It may also contain urls that are computed by the proxy-prefetch.==Sie enthält auch URLs, die vom Proxy durch tieferes Indexieren bereitgestellt werden. +The local crawler queue is empty==Der lokale Crawler-Puffer ist leer. +There are \#\[num\]\# entries in the local crawler queue. Showing \#\[show-num\]\# most recent entries.==Es befinden sich #[num]# Einträge in dem lokalen Crawler-Puffer. Gezeigt werden die #[show-num]# neuesten Einträge. +Show last==Zeige die letzten + entries.== Einträge. +Initiator==Initiator +Profile==Profil +Depth==Tiefe +Modified Date==Änderungsdatum +Anchor Name==Anker Name +URL==URL +\[Delete\]==[Löschen] +Delete Entries:==Lösche Einträge: +"Delete"=="Löschen" +This may take a quite long time.==Dies wird vielleicht einige Zeit dauern. +#----------------------------- +#File: IndexCreateWWWRemoteQueue_p.html +#--------------------------- +Remote Crawl Queue==Remote Crawl Puffer +This queue stores the urls that other peers sent to you in order to perform a remote crawl for them.==Dieser Puffer enthält die URLS, die Ihnen andere Peers zugeschickt haben, um für diese einen Remote Crawl durchzuführen. +The remote crawler queue is empty==Der Remote Crawler-Puffer ist leer +"clear remote crawl queue"=="leere Remote Crawl Puffer" +There are \#\[num\]\# entries in the remote crawler queue.==Es befinden sich #[num]# Einträge in dem Remote Crawler-Puffer. +Showing \#\[show-num\]\# most recent entries.==Gezeigt werden die #[show-num]# neuesten Einträge. +Show last==Zeige die letzten + entries.== Einträge. +Initiator==Initiator +Profile==Profil +Depth==Tiefe +Modified Date==Änderungsdatum +Anchor Name==Anker Name +URL==URL +Delete==Löschen +#----------------------------- +#File: IndexImport_p.html +#--------------------------- +YaCy \'\#\[clientname\]\#\': Index Import==YaCy '#[clientname]#': Index Import +#Crawling Queue Import==Crawling Puffer Import +Index DB Import==Index Datenbank Import +The local index currently consists of \(at least\) \#\[wcount\]\# reverse word indexes and \#\[ucount\]\# URL references.==Der lokale Index besteht zur Zeit aus (mindestens) #[wcount]# Wörtern und #[ucount]# URLs. +Import Job with the same path already started.==Ein Import mit dem selben Pfad ist bereits gestartet. +Starting new Job==Neuen Import starten +Import Type:==Import-Typ: +Cache Size==Cachegröße +Usage Examples==Benutzungs-
    beispiele +"Path to the PLASMADB directory of the foreign peer"=="Pfad zum PLASMADB Verzeichnis des fremden Peer" +Import Path:==Import-Pfad: +"Start Import"=="Import starten" +Attention:==Achtung: +Always do a backup of your source and destination database before starting to use this import function.==Machen Sie immer ein Backup von Ihrer Quell- und Zieldatenbank, bevor Sie die Import-Funktion nutzen. +Currently running jobs==Gerade laufende Aufgaben +Job Type==Job-Typ +>Path==>Pfad +Status==Status +Elapsed
    Time==Verstrichene
    Zeit +Time
    Left==verbl.
    Zeit +Abort Import==Import abbrechen +Pause Import==Import pausieren +Finished::Running::Paused==Fertig::Laufend::Pausiert +"Abort"=="Abbrechen" +#"Pause"=="Pause" +"Continue"=="Fortsetzen" +Finished jobs==Fertige Importierungen +"Clear List"=="Liste löschen" +Last Refresh:==Letzte Aktualisierung: +Example Path:==Beispielpfad: +Requirements:==Voraussetzungen: +You need to have at least the following directories and files in this path:==Sie müssen mindestens die folgenden Dateien und Ordner in diesem Pfad haben: +>Type==>Typ +>Writeable==>Schreibrechte +>Description==>Beschreibung +>File==>Datei +>Directory==>Verzeichnis +>Yes<==>Ja< +>No<==>Nein< +The LoadedURL Database containing all loaded and indexed URLs==Die 'geladene URLs'-Datenbank, enthält alle geladenen und indexierten URLs +The assortment directory containing parts of the word index.==Das Assortment-Verzeichnis, enthält Teile des Wort-Index. +The words directory containing parts of the word index.==Das Wort-Verzeichnis, enthält Teile des Wort-Index. +The assortment file that should be imported.==Die Assortment-Datei die importiert werden soll. +The assortment file must have the postfix==Die Assortment-Datei muss den Suffix +.db".==.db" haben. +If you would like to import an assortment file from the PLASMADB\\ACLUSTER\\ABKP== Wenn Sie eine Assortment-Datei aus PLASMADB\\ACLUSTER\\ABKP importieren wollen, +you have to rename it first.==müssen Sie sie zuerst umbenennen. +>Notes:==>Anmerkung: +Please note that the imported words are useless if the destination peer doesn't know==Bitte bedenken Sie, dass die importierten Wörter nutzlos sind, wenn der Ziel-Peer nicht weiß, +the URLs the imported words belongs to.==zu welchen URLs sie gehören. +Crawling Queue Import:==Crawler-Puffer-Import: +Contains data about the crawljob an URL belongs to==Enthält Daten über den Crawljob, zu dem eine URL gehört +The crawling queue==Der Crawler-Puffer +Various stack files that belong to the crawling queue==Verschiedene Stack-Dateien, die zum Crawler-Puffer gehören +#----------------------------- +#File: IndexImportMediawiki_p.html +#--------------------------- +#MediaWiki Dump Import==MediaWiki Dump Import +No import thread is running, you can start a new thread here==Sie können hier einen neuen Thread starten, da aktuell kein Import Thread läuft +Bad input data:==Ungültige Eingabedaten: +MediaWiki Dump File Selection: select a \'bz2\' file==MediaWiki Dump Datei Auswahl: Wähle eine 'bz2' Datei aus +You can import MediaWiki dumps here. An example is the file==Hier können Sie MediaWiki Dumps importieren. Als Beispiel dient die Datei +Dumps must be in XML format and may be compressed in gz or bz2. Place the file in the YaCy folder or in one of its sub-folders.==Dumps müssen im XML Format vorliegen und bz2 komprimiert sein. Legen Sie die Datei im YaCy-Verzeichnis oder einem Unterordner ab. +"Import MediaWiki Dump"=="Importiere MediaWiki Dump" +When the import is started, the following happens:==Wenn der Import gestartet wird passiert Folgendes: +The dump is extracted on the fly and wiki entries are translated into Dublin Core data format. The output looks like this:==Der Dump wird zur Laufzeit extrahiert und die Wiki Einträge werden in das Dublin Core Datenformat übersetzt. Die Ausgabe schaut wie folgt aus: +Each 10000 wiki records are combined in one output file which is written to /DATA/SURROGATES/in into a temporary file.==Je 10000 Wiki Einträge werden zusammen in eine Ausgabedatei geschrieben und in /DATA/SURROGATES/in temporär gespeichert. +When each of the generated output file is finished, it is renamed to a .xml file==Wenn jede der generierten Ausgabedateien abgearbeitet wurde wird diese in eine .xml Datei umbenannt. +Each time a xml surrogate file appears in /DATA/SURROGATES/in, the YaCy indexer fetches the file and indexes the record entries.==Immer wenn eine xml Surrogat Datei in /DATA/SURROGATES/in erscheint, holt der YaCy Indexer diese Datei und indexiert die enthaltenen Datensätze. +When a surrogate file is finished with indexing, it is moved to /DATA/SURROGATES/out==Wenn eine Surrogat Datei vollständig indexiert wurde, wird sie nach /DATA/SURROGATES/out verschoben +You can recycle processed surrogate files by moving them from /DATA/SURROGATES/out to /DATA/SURROGATES/in==Sie können schon abgearbeitete Surrogat Dateien durch Verschieben von /DATA/SURROGATES/out nach /DATA/SURROGATES/in recyclen. +Import Process==Import Prozess +#Thread:==Thread: +#Dump:==Dump: +Processed:==Bearbeitet: +Wiki Entries==Wiki Einträge +Speed:==Geschwindigkeit: +articles per second<==Artikel pro Sekunde< +Running Time:==Laufzeit: +hours,==Stunden, +minutes<==Minuten< +Remaining Time:==Verbleibende Zeit: +#hours,==Stunden, +#minutes<==Minuten< +#----------------------------- +#File: IndexImportOAIPMH_p.html +#--------------------------- +#OAI-PMH Import==OAI-PMH Import +Results from the import can be monitored in the indexing results for surrogates==Ergebnisse aus dem Import finden Sie auf der Seite Ergebnisse aus dem Surrogat Import +Single request import==Einfacher Anfrage Import +This will submit only a single request as given here to a OAI-PMH server and imports records into the index==Mit dieser Methode wird nur eine einzelne Abfrage an einen OAI-PMH Server geschickt und die Datensätze in den Index aufgenommen +"Import OAI-PMH source"=="Importiere OAI-PMH Quelle" +Source:==Quelle: +Processed:==Bearbeitet: +records<==Datensätze< +#ResumptionToken:==ResumptionToken: +Import failed:==Import fehlgeschlagen: +Import all Records from a server==Importiere alle Datensätze von einem Server +Import all records that follow according to resumption elements into index==Importiere alle folgenden Datensätze die Wiederaufnahme Elementen entsprechen in den Index +"import this source"=="Importiere diese Quelle" +::or ==::oder  +"import from a list"=="Importiere von einer Liste" +Import started!==Import gestartet! +Bad input data:==Ungültige Eingabedaten: +#----------------------------- +#File: IndexImportOAIPMHList_p.html +#--------------------------- +List of \#\[num\]\# OAI-PMH Servers==Liste von #[num]# OAI-PMH Servern +"Load Selected Sources"=="Lade ausgewählte Quellen" +OAI-PMH source import list==OAI-PMH Quellen Import Liste +#OAI Source List==OAI Quellen Liste +>Source<==>Quelle< +Import List==Importierte Liste +#>Thread<==>Thread< +#>Source<==>Quelle< +>Processed
    Chunks<==>Bearbeitete
    Datenblöcke< +>Imported
    Records<==>Importierte
    Datensätze< +>Speed
    \(records/second\)==>Geschwindigkeit
    ==(Datensätze/Sekunde) +#----------------------------- +#File: Load_MediawikiWiki.html +#--------------------------- +YaCy \'\#\[clientname\]\#\': Configuration of a Wiki Search==YaCy '#[clientname]#': Konfiguration einer Wiki Suche +#Integration in MediaWiki==Integration in MediaWiki +It is possible to insert wiki pages into the YaCy index using a web crawl on that pages.==Es ist möglich Wiki Seiten in den YaCy Index aufzunehmen, indem man diese Seiten crawlen läßt. +This guide helps you to crawl your wiki and to insert a search window in your wiki pages.==Diese Anleitung hilft Ihnen, Ihr Wiki zu crawlen und ein Suchfeld in die Wiki Seiten einzubauen. +Retrieval of Wiki Pages==Abrufen der Wiki Seiten +The following form is a simplified crawl start that uses the proper values for a wiki crawl.==Das folgende Eingabeformular ist eine vereinfachte Crawl Startseite die passende Werte für eine Wiki Suche voreingestellt hat. +Just insert the front page URL of your wiki.==Fügen Sie einfach die Start URL Ihres Wikis ein. +After you started the crawl you may want to get back==Nachdem Sie den Crawl gestartet haben sollten Sie nochmals zurück +to this page to read the integration hints below.==auf diese Seite gehen, um die Integrationshinweise weiter unten zu lesen. +URL of the wiki main page==URL der Wiki Hauptseite +This is a crawl start point==Das ist der Ausgangspunkt des Crawls +"Get content of Wiki: crawl wiki pages"=="Hole den Inhalt des Wiki: Crawle die Wiki Seiten" +Inserting a Search Window to MediaWiki==Einfügen eines Suchfeldes in ein MediaWiki +To integrate a search window into a MediaWiki, you must insert some code into the wiki template.==Um ein Suchfeld in das MediWiki einzufügen, müssen Sie einigen Code in Ihr Wiki Template einfügen. +There are several templates that can be used for MediaWiki, but in this guide we consider that==Es gibt einige Templates die für ein MediaWiki verwendet werden können. Aber in dieser Anleitung setzen wir voraus, dass +you are using the default template, \'MonoBook.php\':==Sie das Standard Template einsetzen, 'MonoBook.php': +open skins/MonoBook.php==Öffnen Sie skins/MonoBook.php +find the line where the default search window is displayed, there are the following statements:==Finden Sie die Zeile in der die Standard Suchmaschine angezeigt wird, erkennbar an folgenden Anweisungen: +Remove that code or set it in comments using \'<!--\' and \'-->\'==Entfernen Sie diesen Code oder setzen sie ihn zwischen Kommentar Klammern mit '<!--' und '-->' +Insert the following code:==Fügen Sie folgenden Code ein: +Search with YaCy in this Wiki:==Mit YaCy in diesem Wiki suchen: +value=\"Search\"==value="Suche" +Check all appearances of static IPs given in the code snippet and replace it with your own IP, or your host name==Überprüfen Sie alle in diesem Codeschnipsel vorkommenden statischen IP Adressen und ersetzen Sie diese mit Ihrer eigenen IP oder dem eigenen Hostnamen. +You may want to change the default text elements in the code snippet==Sie können auch die Standard Textelemente in dem Code Ausschnitt gegen eigene Texte austauschen. +To see all options for the search widget, look at the more generic description of search widgets at==Um alle Optionen für das Suchfeld zu sehen, schauen Sie sich die generische Beschreibung des Such Widgets auf +the
    configuration for live search.==der Seite Integration eines Suchfelds für Live Suche an. +#----------------------------- +#File: Load_PHPBB3.html +#--------------------------- +Configuration of a phpBB3 Search==Konfiguration einer phpBB3 Suche +#Integration in phpBB3==Integration in phpBB3 +It is possible to insert forum pages into the YaCy index using a database import of forum postings.==Es ist möglich die Forumsseiten mit YaCy zu indexieren, indem die Datenbank mit den Forumseinträgen importiert wird. +This guide helps you to insert a search window in your phpBB3 pages.==Diese Anleitung hilft Ihnen ein YaCy Suchfeld in Ihre phpBB3 Forenseiten einzubinden. +Retrieval of phpBB3 Forum Pages using a database export==Extraktion der phpBB3 Forenseiten durch Datenbank Export +Forum posting contain rich information about the topic, the time, the subject and the author.==Forenbeiträge enthalten reichaltige Informationen über das Thema, die Zeit, den Betreff und den Autor. +This information is in an bad annotated form in web pages delivered by the forum software.==Diese Information wird in einem schlecht kommentierten Format in Form von Webseiten ausgeliefert, die von der Forumssoftware erzeugt werden. +It is much better to retrieve the forum postings directly from the database.==Es ist viel besser die Forenbeiträge direkt aus der Datenbank zu extrahieren. +This will cause that YaCy is able to offer nice navigation features after searches.==Durch den Direktimport kann YaCy nach einer Suche auch hilfreiche Features zur Navigation anbieten. +YaCy has a phpBB3 extraction feature, please go to the phpBB3 content integration servlet for direct database imports.==YaCy kann bereits Daten aus einer phpBB3 Installation extrahieren. Auf der Seite Import aus phpBB3 Datenbanken finden Sie ein Servlet für den direkten Datenbank Import. +Retrieval of phpBB3 Forum Pages using a web crawl==Extraktion der phpBB3 Forenseiten durch Web Crawling +The following form is a simplified crawl start that uses the proper values for a phpbb3 forum crawl.==Das folgende Eingabeformular ist eine vereinfachte Crawl Startseite, die passende Werte für eine phpBB3 Forensuche voreingestellt hat. +Just insert the front page URL of your forum. After you started the crawl you may want to get back==Fügen Sie einfach die Startseite Ihres Forums ein. Nachdem Sie den Crawl gestartet haben sollten Sie zurück +to this page to read the integration hints below.==auf die Seite kommen, um die Integrationshinweise unten zu lesen. +URL of the phpBB3 forum main page==URL der Hauptseite des phpBB3 Forums +This is a crawl start point==Das ist der Ausgangspunkt für den Crawl +"Get content of phpBB3: crawl forum pages"=="Hole den phpBB3 Foreninhalt: Crawlen der Forenseiten" +Inserting a Search Window to phpBB3==Einfügen eines Suchfeldes in das phpBB3 Forum +To integrate a search window into phpBB3, you must insert some code into a forum template.==Um ein Suchfeld in Ihr phpBB3 Forum einzubauen, müssen Sie folgende Zeilen Code in das Forums Template einbauen. +There are several templates that can be used for phpBB3, but in this guide we consider that==Da es viele verschiedene Templates für phpBB3 Foren gibt, gehen wir in dieser Anleitung davon aus, dass +you are using the default template, \'prosilver\'==Sie das Standard Template 'prosilver' verwenden. +open styles/prosilver/template/overall_header.html==Öffnen Sie die Datei styles/prosilver/template/overall_header.html +find the line where the default search window is displayed, thats right behind the
    \<div id=\"search-box\"\>
    statement==Finden Sie die Zeile in der das Standard Suchfeld angezeigt wird, das sich gleich hinter der Anweisung
    <div id="search-box">
    befindet +Insert the following code right behind the div tag==Fügen Sie folgenden Code gleich nach dem div Tag ein +YaCy Forum Search==YaCy Foren Suche +;YaCy Search==;YaCy Suche +Check all appearances of static IPs given in the code snippet and replace it with your own IP, or your host name==Überprüfen Sie alle in diesem Codeschnipsel vorkommenden statischen IP Adressen und ersetzen Sie diese mit Ihrer eigenen IP oder dem eigenen Hostnamen. +You may want to change the default text elements in the code snippet==Sie können auch die Standard Textelemente in dem Code Ausschnitt gegen eigene Texte austauschen. +To see all options for the search widget, look at the more generic description of search widgets at==Um alle Optionen für das Suchfeld zu sehen, schauen Sie sich die generische Beschreibung des Such Widgets auf +the configuration for live search.==der Seite Integration eines Suchfelds für Live Suche an. +#----------------------------- +#File: Load_RSS_p.html +#--------------------------- +Configuration of a RSS Search==Konfiguration einer RSS Suche +Loading of RSS Feeds<==Laden eines RSS Feeds< +RSS feeds can be loaded into the YaCy search index.==RSS Feeds können in den YaCy Suchindex geladen werden. +This does not load the rss file as such into the index but all the messages inside the RSS feeds as individual documents.==Dabei wird nicht die RSS Datei als solche in den Index geladen aber dafür alle Nachrichten innerhalb des RSS Feeds als einzelne Dokumente. +URL of the RSS feed==URL des RSS Feeds +>Preview<==>Vorschau< +"Show RSS Items"=="Zeige RSS Objekte" +Available after successful loading of rss feed in preview==Verfügbar nach dem erfolgreichen Laden des RSS Feeds in der Vorschau +"Add All Items to Index \(full content of url\)"=="Füge alle Objekte zum Index hinzu (Voller Inhalt der URL)" +>once<==>einmalig< +>load this feed once now<==>Lade diesen Feed nun einmalig< +>scheduled<==>geplant< +>repeat the feed loading every<==>Wiederhole das Laden dieses Feeds alle< +>minutes<==>Minuten< +>hours<==>Stunden< +>days<==>Tage< +> automatically.==> automatisch. +>List of Scheduled RSS Feed Load Targets<==>Liste aller geplanten RSS Feed Ziele< +>Title<==>Titel< +#>URL/Referrer<==>URL/Referrer< +>Recording<==>Eintrag< +>Last Load<==>Zuletzt Geladen< +>Next Load<==>Nächster Ladevorgang< +>Last Count<==>Letzter Zähler< +>All Count<==>Gesamter Zähler< +>Avg. Update/Day<==>Durchschnittliche Updates pro Tag< +"Remove Selected Feeds from Scheduler"=="Entferne ausgewählte Feeds aus der geplanten Liste" +"Remove All Feeds from Scheduler"=="Entferne alle Feeds aus der geplanten Liste" +>Available RSS Feed List<==>Liste mit verfügbaren RSS Feeds< +"Remove Selected Feeds from Feed List"=="Entferne ausgewählte Feeds aus der Feed Liste" +"Remove All Feeds from Feed List"=="Entferne alle Feeds aus der Feed Liste" +"Add Selected Feeds to Scheduler"=="Füge ausgewählte Feeds zur geplanten Liste hinzu" +>new<==>Neu< +>enqueued<==>Geplant< +>indexed<==>Indexiert< +>RSS Feed of==>RSS Feed von +>Author<==>Автор< +>Description<==>Beschreibung< +>Language<==>Язык< +>Date<==>Datum< +>Time-to-live<==>TTL (Zeit zu Leben)< +>Docs<==>Dokumente< +>State<==>< +#>URL<==>URL< +"Add Selected Items to Index \(full content of url\)"=="Füge ausgewählte Objekte zum Index hinzu (Voller Inhalt der URL)" +#----------------------------- +#File: Messages_p.html +#--------------------------- +>Messages==>Nachrichten +Date==Datum +From==Von +To==An +>Subject==>Тема +Action==Aktion +From:==Von: +To:==An: +Date:==Datum: +#Subject:==Тема: +>view==>anzeigen +reply==antworten +>delete==>löschen +Compose Message==Nachrichtenerstellung +Send message to peer==Sende eine Nachricht an Peer +"Compose"=="Erstellen" +Message:==Nachricht: +inbox==Posteingang +#----------------------------- +#File: MessageSend_p.html +#--------------------------- +Send message==Nachricht versenden +You cannot send a message to==Sie können keine Nachricht schicken an +The peer does not respond. It was now removed from the peer-list.==Der Peer antwortet nicht. Er ist nicht mehr in der Peer-Liste vorhanden. +The peer ==Der Peer +is alive and responded:==ist online und antwortet: +You are allowed to send me a message==Es ist Ihnen erlaubt, mir eine Nachricht zu senden +kb and an==KB und einen +attachment ≤==Anhang ≤ +Your Message==Ihre Nachricht +Subject:==Тема: +Text:==Inhalt: +"Enter"=="Nachricht senden" +"Preview"=="Vorschau" +You can use==Sie können hier +Wiki Code here.==Wiki Code benutzen. +Preview message==Nachricht Vorschau +The message has not been sent yet!==Die Nachricht wurde noch nicht gesendet! +The peer is alive but cannot respond. Sorry.==Der Peer ist nicht online und kann nicht antworten. Entschuldigung. +Your message has been sent. The target peer responded:==Ihre Nachricht wurde erfolgreich versandt. Der Ziel-Peer antwortet: +The target peer is alive but did not receive your message. Sorry.==Der Ziel-Peer ist online, hat aber Ihre Nachricht nicht erhalten. Entschuldigung. +Here is a copy of your message, so you can copy it to save it for further attempts:==Hier ist eine Kopie Ihrer Nachricht. Sie können diese kopieren, speichern und es später nochmal versuchen: +You cannot call this page directly. Instead, use a link on the Network page.==Sie können diese Seite nicht direkt aufrufen. Benutzen Sie stattdessen einen Link auf der Netzwerk Seite. +#----------------------------- +#File: Network.html +#--------------------------- +YaCy Search Network==Поиск сети YaCy +YaCy Network<==Сеть YaCy< +The information that is presented on this page can also be retrieved as XML==Информация, указанная на этой странице также может быть получена как XML +Click the API icon to see the XML.==Klicken Sie auf das API Symbol, um das XML anzeigen zu lassen. +To see a list of all APIs, please visit the API wiki page.==Um eine Liste aller APIs zu sehen, besuchen Sie die API Seite im Wiki. +Network Overview==Обзор сети +Active Peers==Активные пиры +Passive Peers==Пассивные пиры +Potential Peers==Потенциальные пиры +Active Peers in \'\#\[networkName\]\#\' Network==Активные пиры в сети '#[networkName]#' +Passive Peers in \'\#\[networkName\]\#\' Network==Пассивные пиры в сети '#[networkName]#' +Potential Peers in \'\#\[networkName\]\#\' Network==потенциальные пиры в сети '#[networkName]#' +Manually contacting Peer==Kontaktiere Peer manuell +no remote \#\[peertype\]\# peer for this list known==Kein remote Peer #[peertype]# bekannt oder online. +Showing \#\[num\]\# entries from a total of \#\[total\]\# peers.==Gezeigt werden #[num]# Einträge von insgesamt #[total]# Peers. +send Message/
    show Profile/
    edit Wiki/
    browse Blog==Sende Nachricht (m)/
    Zeige Profil (p)/
    Ändere Wiki (w)/
    Durchsuche Blog (b) +Search for a peername \(RegExp allowed\)==Suche nach Peernamen (RegExp erlaubt) +"Search"=="Поиск" +Name==Имя +Address==Адрес +Hash==Хэш +Type==Тип +Release/
    SVN==YaCy версия/
    SVN +Last
    Seen==Zuletzt
    online +Location==Расположение +>URLs for
    Remote
    Crawl<==>URLs адреса для
    Удаленных
    сканеров< +Offset==Смещение +Send message to peer==Отправить сообщение пиру +View profile of peer==Zeige Просмотр профиля пира +Read and edit wiki on peer==Читать и редактировать wiki у пира +Browse blog of peer==Durchsuche den Blog von Peer +#"Ranking Receive: no"=="Ranking Empfang: nein" +#"no ranking receive"=="kein Ranking Empfang" +#"Ranking Receive: yes"=="Ranking Empfang: ja" +#"Ranking receive enabled"=="Ranking Empfang aktiv" +"DHT Receive: yes"=="DHT прием: да" +"DHT receive enabled"=="DHT прием активен" +"DHT Receive: no; \#\[peertags\]\#"=="DHT прием: нет; #[peertags]#" +"DHT Receive: no"=="DHT прием: нет" +#no tags given==keine Tags angegeben +"no DHT receive"=="нет получения DHT" +"Accept Crawl: no"=="Принято сканирование: нет" +"no crawl"=="нет сканирования" +"Accept Crawl: yes"=="Принято сканирование: да" +"crawl possible"=="Сканирование возможно" +Contact: passive==Контакт: пассивный +Contact: direct==Контакт: прямой +Seed download: possible==Загрузка сида: возможна +runtime:==время работы: +#Peers==Peers +#YaCy Cluster==YaCy Cluster +>Network<==>Сеть< +>Online Peers<==>Пиров в онлайне< +>Number of
    Documents<==>Количество
    документов< +Indexing Speed:==Скорость индексации: +Pages Per Minute \(PPM\)==Страниц в Минуту (СвМ) +Query Frequency:==Частота запросов: +Queries Per Hour \(QPH\)==Запросов в час (ЗвЧ) +>Today<==>Сегодня< +>Last Week<==>Последняя неделя< +>Last Month<==>Последний месяц< +>Now<==>Сейчас< +>Active<==>Активных< +>Passive<==>Пассивных< +>Potential<==>Потенциальных< +>This Peer<==>Этот пир< +URLs for
    Remote Crawl==URLs адреса для удаленных сборщиков +"The YaCy Network"=="YaCy сеть" +Indexing
    PPM==Индекстирование
    СвМ +\(public local\)==публичный 
    локальный +\(remote\)==(удаленный) +Your Peer:==Ваш пир: +#>Name<==>Name< +>Info<==>Информация< +>Version<==>Версия< +#>UTC<==>UTC< +>Uptime<==>Продолжительность работы< +>Links<==>Ссылок< +#>RWIs<==>RWIs< +Sent
    Words==Отправлено
    слов +Sent
    URLs==Отправлено
    URL ссылок +Received
    Words==Получено
    слов +Received
    URLs==Получено
    URL ссылок +Known
    Seeds==Известные
    сиды +Connects
    per hour==соединений
    в час +#Version==Version +#Own/Other==Eigene/Andere +>dark green font<==>шрифт темно-зеленый< +senior/principal peers==Старшие/основные пиры +>light green font<==>шрифт светло-зеленный< +>passive peers<==>пассивные пиры< +>pink font<==>шрифт розовый< +junior peers==младшие пиры +red point==красная точка +this peer==Ваш пир +>grey waves<==>серые волны< +>crawling activity<==>выполняется сканирование< +>green radiation<==>зеленое излучение< +>strong query activity<==>высокая активность запросов< +>red lines<==>красные линии< +>DHT-out<==>DHT выход< +>green lines<==>зеленые линии< +>DHT-in<==>DHT вход< +#DHT-out==DHT-out +#You are in online mode, but probably no internet resource is available.==Sie befinden sich im Online-Modus, aber zur Zeit besteht keine Internetverbindung.You are in online mode, but probably no internet resource is available. +#Please check your internet connection.==Bitte überprüfen Sie Ihre Internetverbindung. +#You are not in online mode. To get online, press this button:==Sie sind nicht im Online-Modus. Um Online zu gehen, drücken Sie diesen Knopf: +#"go online"=="online gehen" +#----------------------------- +#File: News.html +#--------------------------- +Overview==Überblick +Incoming News==eingehende News +Processed News==gelesene News +Outgoing News==ausgehende News +Published News==veröffentlichte News +This is the YaCyNews system \(currently under testing\).==Dies ist das YaCy News-System (zur Zeit noch im Test). +The news service is controlled by several entry points:==Dieser News Service wird von folgenden Punkten initiiert: +A crawl start with activated remote indexing will automatically create a news entry.==Wird ein neuer Crawl mit aktivierter Remote-Crawling-Funktion gestartet, dann wird automatisch ein News-Eintrag erstellt. +Other peers may use this information to prevent double-crawls from the same start point.==Andere Peers können diese Informationen benutzen, um einen doppelten Crawl vom selben Startpunkt zu vermeiden. +A table with recently started crawls is presented on the Index Create - page==Eine Tabelle mit gerade gestarteten Crawls wird auf der "Index erzeugen"-Seite angezeigt. +A change in the personal profile will create a news entry. You can see recently made changes of==Bei einer Änderung im Profil wird auch ein News-Eintrag erstellt. +profile entries on the Network page, where that profile change is visualized with a '\*' beside the 'P' \(profile\) - selector.==Profil Einträge auf der Netzwerk Seite werden nach einer Änderung mit einem '*' neben dem 'P' (Profil) gekennzeichnet. +More news services will follow.==Mehr News Services werden folgen. +Above you can see four menues:==Sie können diese vier Menüs sehen: +Incoming News \(\#\[insize\]\#\): latest news that arrived your peer.==Eingehende News(#[insize]#): Die neuesten News, die Ihren Peer erreicht haben. +Only these news will be used to display specific news services as explained above.==Nur diese News werden benutzt, um spezifische News Services anzuzeigen. +You can process these news with a button on the page to remove their appearance from the IndexCreate and Network page==Sie können diese News mit einem Button auf der Seite abarbeiten (als "gelesen" markieren). Dann werden diese Nachrichten nicht mehr auf der Netzwerk und der Index Create Seite erscheinen. +Processed News \(\#\[prsize\]\#\): this is simply an archive of incoming news that you removed by processing.==Gelesene News (#[prsize]#): Hier ist ein simples Archiv der bereits gelesenen News. +Outgoing News \(\#\[ousize\]\#\): here your can see news entries that you have created. These news are currently broadcasted to other peers.==Ausgehende News (#[ousize]#): Hier können Sie die News sehen, die durch Sie enstanden sind. Diese News werden sofort an andere Peers übertragen. +you can stop the broadcast if you want.==Sie können die Weiterverteilung stoppen, wenn Sie wollen. +Published News \(\#\[pusize\]\#\): your news that have been broadcasted sufficiently or that you have removed from the broadcast list.==Veröffentlichte News (#[pusize]#): Ihre News, die genügend verbreitet oder aus der Verbreitungsliste gelöscht wurden. +Originator==Initiator +Created==Geschaffen +Category==Kategorie +Received==Empfangen +Distributed==Verteilt +Attributes==Attribute +"\#\(page\)\#::Process Selected News::Delete Selected News::Abort Publication of Selected News::Delete Selected News\#\(/page\)\#"=="#(page)#::Gewählte News als gelesen markieren::Gewählte News löschen::Verbreitung gewählter News abbrechen::Gewählte News löschen#(/page)#" +"\#\(page\)\#::Process All News::Delete All News::Abort Publication of All News::Delete All News\#\(/page\)\#"=="#(page)#::Alle News als gelesen markieren::Alle News löschen::Verbreitung von allen News abbrechen::Alle News löschen#(/page)#" +#----------------------------- +#File: Performance_p.html +#--------------------------- +Performance Settings==Leistungseinstellungen +Memory Settings==Speicher Einstellungen +Memory reserved for JVM==Für JVM reservierter Speicher +"Set"=="Setzen" +Resource Observer==Ressourcen Beobachter +DHT-Trigger==DHT-Umschalter +not triggered:==nicht ausgelöst: +>triggered==>ausgelöst +reset state==Status zurücksetzen +HDD==Festplattenspeicher +disable crawls below==Deaktivere Crawls unter +free space==freiem Speicher +disable DHT-in below==Deaktivere eingehende DHT Transfers unter +RAM==Arbeitsspeicher +Accepted change. This will take effect after restart of YaCy==Änderung akzeptiert. Diese werden erst nach einem Neustart von YaCy wirksam +restart now==jetzt neustarten +Confirm Restart==Bestätige Neustart +refresh graph==aktualisiere Diagramm +#show memory tables==Zeige Speicher-Tabellen +Use Default Profile:==Standard Profil benutzen: +and use==und nutze +of the defined performance.==der vorgegebenen Geschwindigkeit. +Save==Speichern +Changes take effect immediately==Änderungen werden sofort wirksam +YaCy Priority Settings==YaCy Priorität Einstellungen +YaCy Process Priority==YaCy Prozess Priorität +#Normal==Normal +Below normal==unter Normal +Idle==untätig +"Set new Priority"=="Neue Priorität speichern" +Changes take effect after restart of YaCy==Änderungen werden erst nach einem Neustart von YaCy wirksam. +Online Caution Settings==Onlinezugriff Verzögerung Einstellungen +This is the time that the crawler idles when the proxy is accessed, or a local or remote search is done.==Dies ist die Zeit die der Crawler pausiert, wenn auf den Proxy zugegriffen wird, oder eine lokale oder globale Suche durchgeführt wird. +The delay is extended by this time each time the proxy is accessed afterwards.==Die normale Verzögerung wird um diese Zeit verlängert, wenn auf den Proxy zugegriffen wird. +This shall improve performance of the affected process \(proxy or search\).==Dies soll die Performance des betroffenen Prozesses (Proxy oder Suche) erhöhen. +\(current delta is==(Seit dem letzten Zugriff auf Proxy/Lokale-Suche/Globale-Suche sind +seconds since last proxy/local-search/remote-search access.\)==Sekunden vergangen.) +Online Caution Case==Onlinezugriff Typ +indexer delay \(milliseconds\) after case occurency==Indexierer Verzögerung (Millisekunden) nach Onlinezugriff +#Proxy:==Proxy: +Local Search:==Lokale Suche: +Remote Search:==Remote Suche: +"Enter New Parameters"=="Neue Parameter eintragen" +#----------------------------- +#File: PerformanceMemory_p.html +#--------------------------- +Performance Settings for Memory==Performanceeinstellungen für Speicher +refresh graph==aktualisiere Diagramm +Memory Usage:==Speichernutzung: +After Startup==Nach Start +After Initializations==Nach Initialisierungen +before GC==vor GC +after GC==nach GC +>Now==>Jetzt +before <==vor < +Description==Beschreibung +maximum memory that the JVM will attempt to use==maximaler Speicher den die JVM nutzen wird +>Available<==>Verfügbar< +total available memory including free for the JVM within maximum==gesamter verfügbarer Speicher für die JVM innerhalb des Maximums. +>Total<==>Gesamt< +total memory taken from the OS==gesamter vom Betriebssystem zugewiesener Speicher +>Free<==>Frei< +free memory in the JVM within total amount==freier Speicher in der JVM innerhalb des Gesamten Speichers +>Used<==>Belegt< +used memory in the JVM within total amount==genutzter Speicher in der JVM innerhalb des Gesamten Speichers +#EcoTable RAM Index:==EcoTabelle RAM Index: +Table RAM Index:==Tabelle RAM Speicher Index: +>Size==>Größe +>Key==>Schlüssel +>Value==>Wert +#FlexTable RAM Index:==FlexTabelle RAM Index: +Table==Tabelle +Chunk Size<==Chunk Größe< +#Count==Anzahl +Used Memory<==Benutzter Speicher< +#Node Caches:==Knoten Cache: +Object Index Caches:==Objekt Index Caches: +Needed Memory==Benötigter Speicher +Object Read Caches==Objekt Lese Caches +>Read Hit Cache<==>Lese Treffer Cache< +>Read Miss Cache<==>Lese Miss Cache< +>Read Hit<==>Lese Hit< +>Read Miss<==>Lese Verfehler< +Write Unique<==Schreiben einzigartig< +Write Double<==Schreiben mehrfach< +Deletes<==Löschungen< +Flushes<==Leerungen< +Total Mem==Gesamter Speicher +MB \(hit\)==MB (Treffer) +MB \(miss\)==MB (Verfehler) +Stop Grow when less than \#\[objectCacheStopGrow\]\# MB available left==Beende Erweiterung wenn weniger als #[objectCacheStopGrow]# MB verfügbar sind +Start Shrink when less than \#\[objectCacheStartShrink\]\# MB availabe left==Starte Verkleinerung wenn weniger als #[objectCacheStartShrink]# MB verfügbar sind +Other Caching Structures:==Andere Zwischenspeicher Strukturen: +Type==Typ +>Hit<==>Treffer< +>Miss<==>Verfehler< +Insert<==Einfügen< +Delete<==Löschen< +#DNSCache==DNSCache +#DNSNoCache==DNSNoCache +#HashBlacklistedCache==HashBlacklistedCache +Search Event Cache<==Suchereignis Cache< +#----------------------------- +#File: PerformanceQueues_p.html +#--------------------------- +Performance Settings of Queues and Processes==Performanceeinstellungen für Puffer und Prozesse +Scheduled tasks overview and waiting time settings:==Übersicht geplanter Aufgaben und Wartezeiteinstellungen: +Queue Size==Warteschl.-
    länge +>Total==>gesamte +#Block Time== +#Sleep Time== +#Exec Time== +Idle==untät. +>Busy==>beschäft. +Short Mem
    Cycles==Durchl.
    ohne ausr. Speicher +>per Cycle==>pro Durchlauf +>per Busy-Cycle==>pro beschäft. Durchl. +>Memory Use==>Speicher-
    nutzung +>Delay between==>Verzögerung zwischen +>idle loops==>untät. Durchl. +>busy loops==>beschäft. Durchl. +Minimum of
    Required Memory==Mindestens
    benötigter Speicher +Full Description==Vollständige Beschreibung +Submit New Delay Values==Neue Verzögerungswerte speichern +Changes take effect immediately==Änderungen werden sofort wirksam +Cache Settings:==Cache Einstellungen: +#RAM Cache==RAM Cache +Description==Beschreibung +URLs in RAM buffer:==URLs im RAM Puffer: +This is the size of the URL write buffer. Its purpose is to buffer incoming URLs==Dies ist die Größe des URL Schreibpuffers. Seine Aufgabe ist es die eingehenden URLs zu puffern +in case of search result transmission and during DHT transfer.==im Falle von Suchergebnisübertragung und während des DHT Transfers. +Words in RAM cache:==Wörter im RAM-Cache +This is the current size of the word caches.==Dies ist die momentane Größe des Wort-Caches. +The indexing cache speeds up the indexing process, the DHT cache holds indexes temporary for approval.==Der Indexing Cache beschleunigt den Indexier Prozess, der DHT Cache enthält temporäre Indizes zum Bestätigen. +The maximum of this caches can be set below.==Das Maximum dieses Cache kann unten festgesetzt werden. +Maximum URLs currently assigned
    to one cached word:==höchste Anzahl URLs die derzeit einem Wort im Zwischenspeicher zugewiesen wurde: +This is the maximum size of URLs assigned to a single word cache entry.==Dies ist die maximale Menge an URLs, die einem einzelnen Wort-Cache Eintrag zugewiesen wurden. +If this is a big number, it shows that the caching works efficiently.==Wenn diese Zahl hoch ist, heißt das, dass der Wort-Cache effizient arbeitet. +Maximum age of a word:==Maximales Alter eines Wortes: +This is the maximum age of a word in an index in minutes.==Dies ist das maximale Alter eines Wortes in einem Index in Minuten. +Minimum age of a word:==Minimales Alter eines Wortes: +This is the minimum age of a word in an index in minutes.==Dies ist das minimale Alter eines Wortes in einem Index in Minuten. +Maximum number of words in cache:==Maximale Wortzahl im Cache: +This is is the number of word indexes that shall be held in the==Dies ist die Anzahl der Wort-indexe die während des Indexierens im +ram cache during indexing. When YaCy is shut down, this cache must be==RAM-Cache gehalten werden sollen. Sobald YaCy herunterfährt muss dieser Cache +flushed to disc; this may last some minutes.==auf die Festplatte gesichert werden; dies kann einige Minuten dauern. +#Initial space of words in cache:==Anfangs Freiraum im Word Cache: +#This is is the init size of space for words in cache.==Dies ist die Anfangsgröße von Wörtern im Cache. +Enter New Cache Size==Neue Cachegröße eintragen +Balancer Settings==Balancer Einstellungen +This is the time delta between accessing of the same domain during a crawl.==Das ist die Zeitdifferenz zwischen zwei Zugriffen auf dieselbe Domäne während eines Crawls. +The crawl balancer tries to avoid that domains are==Der Crawl Balancer versucht zu vermeiden, dass Domains +accessed too often, but if the balancer fails \(i.e. if there are only links left from the same domain\), then these minimum==zu oft abgefragt werden. Aber wenn der Balancer nicht mehr greift \(z.B. wenn nur noch Links von derselben Domain übrig sind), werden diese Minimum +delta times are ensured.==Zeitdifferenzen eingehalten. +#>Crawler Domain<==>Crawler Domain< +>Minimum Access Time Delta<==>Minimum Zeitdifferenz zwischen Zugriffen< +>local \(intranet\) crawls<==>Lokale (Intranet) Crawls< +>global \(internet\) crawls<==>Globale (Internet) Crawls< +"Enter New Parameters"=="Neue Parameter Setzen" +Thread Pool Settings:==Threadpool Einstellungen: +maximum Active==max. aktiv +current Active==derzeit aktiv +Enter new Threadpool Configuration==neue Threadpoolkonfiguration eintragen +#----------------------------- +#File: PerformanceConcurrency_p.html +#--------------------------- +Performance of Concurrent Processes==Performance gleichzeitig laufender Prozesse +serverProcessor Objects==serverProcessor Objekte +#Thread==Thread +Queue Size
    Current==Größe der Warteschlange
    Aktuell +Queue Size
    Current==Größe der Warteschlange
    Maximum +Concurrency:
    Number of Threads==Gleichzeitigkeit:
    Anzahl der Threads +Childs==Kindprozesse +Average
    Block Time
    Reading==Durchschnittlich
    reservierte Zeit
    lesend +Average
    Exec Time==Durchschnittliche Ausführungszeit +Average
    Block Time
    Writing==Durchschnittlich
    reservierte Zeit
    schreibend +Total
    Cycles==Gesamtanzahl Zyklen +Full Description==Volle Beschreibung +#----------------------------- +#File: PerformanceSearch_p.html +#--------------------------- +Performance Settings of Search Sequence==Performanceeinstellungen des Suchablaufs +Search Sequence Timing==Timing des Suchablaufs +Timing results of latest search request:==Timing-Ergebnisse der letzten Suchanfrage: +Query==Abfrage +Event<==Ereignis< +Comment<==Kommentar< +Time<==Zeit< +Duration \(ms\)==Dauer (Millisekunden) +Result-Count==Anzahl Ergebnisse +The network picture below shows how the latest search query was solved by asking corresponding peers in the DHT:==Das Netzwerkbild zeigt wie die letzte Suche durch Anfragen bei zuständigen Peers im DHT gelöst wurde. +red -> request list alive==rot -> Request Liste aktiv +green -> request has terminated==grün -> Request wurde beendet +grey -> the search target hash order position\(s\) \(more targets if a dht partition is used\)<==grau -> Das Suchergebnis hash order position(s) (Mehrere Ziele wenn eine DHT Partition verwendet wird)< +"Search event picture"=="Such Ereignis Bild" +#----------------------------- +#File: ProxyIndexingMonitor_p.html +#--------------------------- +Indexing with Proxy==Indexierung per Proxy +YaCy can be used to 'scrape' content from pages that pass the integrated caching HTTP proxy.==YaCy kann dazu verwendet werden den Inhalt aller Webseiten zu 'crawlen', die den eingebauten HTTP Proxy Server passieren. +When scraping proxy pages then no personal or protected page is indexed;==Beim Indexieren von Seiten aus der Proxy Nutzung werden keine persönlichen oder geschützten Seiten indexiert! +# This is the control page for web pages that your peer has indexed during the current application run-time==Dies ist die Kontrollseite für Internetseiten, die Ihr Peer während der aktuellen Sitzung +# as result of proxy fetch/prefetch.==durch Besuchen einer Seite indexiert. +# No personal or protected page is indexed==Persönliche Seiten und geschütze Seiten werden nicht indexiert +those pages are detected by properties in the HTTP header \(like Cookie-Use, or HTTP Authorization\)==Solche Seiten werden entweder durch Merkmale im HTTP Header (Kopf der Seite) (z.B.: Cookies oder HTTP Authorisierung) +or by POST-Parameters \(either in URL or as HTTP protocol\)==oder durch POST-Parameter (z.B. in einer URL oder im HTTP Protokoll) erkannt +and automatically excluded from indexing.==und automatisch von der Indexierung ausgeschlossen. +Proxy Auto Config:==Automatische Proxy Konfiguration: +this controls the proxy auto configuration script for browsers at http://localhost:8090/autoconfig.pac==Diese Einstellung regelt das Automatische Proxy Konfigurationsskript unter http://localhost:8090/autoconfig.pac +.yacy-domains only==nur .yacy Domains +whether the proxy should only be used for .yacy-Domains==Soll der Proxy nur für .yacy Domains verwendet werden diese Checkbox aktivieren. +Proxy pre-fetch setting:==Proxy Indexier Einstellung: +this is an automated html page loading procedure that takes actual proxy-requested==Dies ist eine automatische Web Seiten Lade Funktion, die aktuell besuchte +URLs as crawling start points for crawling.==URLs als Startpunkt zum Indexieren benutzt. +Prefetch Depth==Indexier Tiefe +A prefetch of 0 means no prefetch; a prefetch of 1 means to prefetch all==Bei einer Tiefe von 0 wird nur die besuchte Seite indexiert; eine Tiefe von 1 bedeutet, dass alle Seiten +embedded URLs, but since embedded image links are loaded by the browser==die auf dieser Seite verlinkt sind, geladen und indexiert werden; Da Links auf Bilder sowieso schon vom Browser geladen werden, +this means that only embedded href-anchors are prefetched additionally.==trifft dies nur auf eingebettet HREF-Anker zu. +Store to Cache==Speicher im Cache +It is almost always recommended to set this on. The only exception is that you have another caching proxy running as secondary proxy and YaCy is configured to used that proxy in proxy-proxy - mode.==Es wird empfohlen diese Option immer zu aktivieren. Einzige Ausnahme: Sie haben einen zweiten Proxy als Cache laufen und YaCy soll im "Proxy-zu-Proxy"-Modus laufen. +Do Local Text-Indexing==Lokales Text-Indexieren +If this is on, all pages \(except private content\) that passes the proxy is indexed.==Wenn dieses aktiviert ist, werden alle Seiten (ausser private), die den Proxy passieren, indexiert. +Do Local Media-Indexing==Lokales Medien-Indexieren +This is the same as for Local Text-Indexing, but switches only the indexing of media content on.==Dies ist fast das Gleiche wie beim lokalen Text-Indexieren, nur, dass medialer Inhalt indexiert wird. +Do Remote Indexing==Remote Indexierung +If checked, the crawler will contact other peers and use them as remote indexers for your crawl.==Wenn aktiviert, wird der Crawler andere Peers anfragen und als remote Indexierer für Ihren Crawl nutzen. +If you need your crawling results locally, you should switch this off.==Sollten Sie Ihre Crawling Ergebnisse lokal benötigen, dann deaktivieren Sie diese Funktion. +Only senior and principal peers can initiate or receive remote crawls.==Nur Senior und Principal Peers können einen remote Crawl starten oder empfangen. +Please note that this setting only take effect for a prefetch depth greater than 0.==Bitte berücksichtigen Sie, dass diese Einstellung nur wirkt, wenn Ihre Indexier Tiefe größer als 0 ist. +Proxy generally==Proxy Allgemein +Path==Verzeichnis +The path where the pages are stored \(max. length 300\)==Verzeichnis in dem der Cache sein soll (max. 300 Zeichen) +Size==Größe +The size in MB of the cache.==Die Größe des Cache in MB. +"Set proxy profile"=="Proxy Profil speichern" +The file DATA/PLASMADB/crawlProfiles0.db is missing or corrupted.==Die Datei DATA/PLASMADB/crawlProfiles0.db fehlt entweder oder ist defekt. +Please delete that file and restart.==Bitte löschen Sie diese Datei und starten Sie YaCy neu. +Pre-fetch is now set to depth==Proxy Indexierung erfolgt nun bis zu einer Tiefe von +Caching is now \#\(caching\)\#off\:\:on\#\(/caching\)\#.==Proxy Speichern im Cache ist nun #(caching)#aus::an#(/caching)#. +Local Text Indexing is now \#\(indexingLocalText\)\#off::on==Lokales Text Indexieren ist nun #(indexingLocalText)#aus::an +Local Media Indexing is now \#\(indexingLocalMedia\)\#off::on==Lokales Medien Indexieren ist nun #(indexingLocalMedia)#aus::an +Remote Indexing is now \#\(indexingRemote\)\#off::on==Remote-Indexieren ist nun #(indexingRemote)#aus::an +Cachepath is now set to \'\#\[return\]\#\'. Please move the old data in the new directory.==Der Cache ist nun im Verzeichnis '#[return]#'. Bitte verschieben Sie Ihre alten Daten in das neue Verzeichnis. +Cachesize is now set to \#\[return\]\#MB.==Die Cache Größe ist nun auf #[return]#MB gesetzt. +Changes will take effect after restart only.==Änderungen werden erst nach einem Neustart von YaCy wirksam. +An error has occurred:==Es trat ein Fehler auf: +You can see a snapshot of recently indexed pages==Sie können sich Voransichten von frisch indexierten Seiten +on the==auf der +Page.==Seite ansehen. +#----------------------------- +#File: QuickCrawlLink_p.html +#--------------------------- +Quick Crawl Link==Schnell Crawl Link +Quickly adding Bookmarks:==Schnell Crawl Lesezeichen: +Simply drag and drop the link shown below to your Browsers Toolbar/Link-Bar.==Ziehen Sie einfach den unten stehenden Link auf Ihre Browser Toolbar/Linkbar. +If you click on it while browsing, the currently viewed website will be inserted into the YaCy crawling queue for indexing.==Wenn Sie, während Sie surfen, auf dieses Lesezeichen klicken, wird die gerade betrachtete Seite zum YaCy Crawler-Puffer hinzugefügt, um indexiert zu werden. +Crawl with YaCy==Mit YaCy crawlen +Title:==Titel: +Link:==link: +Status:==Status: +URL successfully added to Crawler Queue==Die Url wurde erfolgreich zum Crawler-Puffer hinzugefügt. +Malformed URL==Fehler in der URL +Unable to create new crawling profile for URL:==Es ist nicht möglich für diese URL ein Crawling Profil zu erstellen: +Unable to add URL to crawler queue:==Es ist nicht möglich die URL zum Crawler-Puffer hinzuzufügen: +#----------------------------- +#File: Ranking_p.html +#--------------------------- +Ranking Configuration==Ranking Einstellungen +The document ranking influences the order of the search result entities.==Das Dokument Ranking beeinflusst die Reihenfolge der Suchergebnis Datensätze. +A ranking is computed using a number of attributes from the documents that match with the search word.==Ein Ranking wird berechnet mit einer Anzahl von Attributen aus den Dokumenten die das gesuchte Wort enthalten. +The attributes are first normalized over all search results and then the normalized attribut is multiplied with the ranking coefficient computed from this list.==Die Attribute werden zuerst über alle Suchergebnisse normalisiert und dann wird das normalisierte Attribut multpliziert mit dem Ranking Koeffizienten der aus dieser Liste errechnet wird. +The ranking coefficient grows exponentially with the ranking levels given in the following table.==Der Ranking Koeffizient wächst exponential mit den Ranking Werten die in der folgenden Tabelle festgelegt werden. +If you increase a single value by one, then the strength of the parameter doubles.==Wenn Sie einen einzelnen Wert um eins erhöhen wird die Stärke des Parameters verdoppelt. +Pre-Ranking==Vor-Ranking +# Aktuell sind die Werte und Hover over Information in der Ranking_p.java hartcodiert und können nicht übersetzt werden +# +#Date==Datum +#a higher ranking level prefers younger documents.==Ein höherer Ranking Level bevorzugt jüngere Dokumente +#The age of a document is measured using the date submitted by the remote server as document date==Das Alter eines Dokuments wird gemessen anhand des Dokument Datums das der Remote Server übermittelt +There are two ranking stages:==Es gibt zwei Phasen beim Ranking. +first all results are ranked using the pre-ranking and from the resulting list the documents are ranked again with a post-ranking.==Zuerst werden alle Resultate nach dem Vor-Ranking geranked und aus der resultierenden Liste werden die Dokumente erneut im Nach-Ranking sortiert. +The two stages are separated because they need statistical information from the result of the pre-ranking.==Die zwei Phasen sind getrennt weil statistische Informationen aus dem Ergebnis des Vor-Rankings benötigt werden. +Post-Ranking==Nach-Ranking +#Application Of Prefer Pattern==Anwendung eines bevorzugten Musters +#a higher ranking level prefers documents where the url matches the prefer pattern given in a search request.==Ein höherer Ranking Level bevorzugt Dokumente deren URL auf das bevorzugte Muster einer Suchanfrage passt. +"Set as Default Ranking"=="Als Standard Ranking speichern" +"Re-Set to Built-In Ranking"=="Auf ursprüngliche Werte zurücksetzen" +#----------------------------- +#File: RemoteCrawl_p.html +#--------------------------- +Remote Crawl Configuration==Remote Crawl Konfiguration +#>Remote Crawler<==>Remote Crawler< +The remote crawler is a process that requests urls from other peers.==Der Remote Crawler ist ein Prozess der URLs bei anderen Peer anfragt. +Peers offer remote-crawl urls if the flag \'Do Remote Indexing\'==Peers bieten Remote Crawls an wenn das Flag 'Nutze Remote Indexierung' +is switched on when a crawl is started.==gesetzt ist wenn ein Crawl gestartet wird. +Remote Crawler Configuration==Remote Crawler Konfiguration +>Accept Remote Crawl Requests<==>Akzeptiere Remote Crawl Anfragen< +Perform web indexing upon request of another peer.==Führe auf Anfragen eines anderen Peers Web Indexing durch. +Load with a maximum of==Lade mit einem Maximum an +pages per minute==Seiten pro Minute +"Save"=="Speichern" +Crawl results will appear in the==Die Anzeige der Crawl Ergebnisse erfolgt im +>Crawl Result Monitor<==>Crawl Ergebnis Monitor< +Peers offering remote crawl URLs==Peers die Remote Crawl URLs anbieten +If the remote crawl option is switched on, then this peer will load URLs from the following remote peers:==Wenn die Remote Crawl Option aktiviert ist, dann wird dieser Peer URLs von den folgenden Remote Peers laden: +#>Name<==>Name< +#>Remote
    Crawl<==>Remote
    Crawl< +#>Release/
    SVN<==>Version/
    SVN< +>PPM<==>==>Seiten pro Minute (PPM)< +>QPH<==>Anfragen pro Stunde (QPH)< +>Last
    Seen<==>Zuletzt
    Gesehen< +>UTC
    Offset<==>UTC
    Abweichung< +#>Uptime<==>Uptime< +#>Links<==>Links< +#>RWIs<==>RWIs< +>Age<==>Alter< +#----------------------------- +#File: Settings_p.html +#--------------------------- +Advanced Settings==Erweiterte Einstellungen +If you want to restore all settings to the default values,==Wenn Sie alle Einstellungen auf die ursprünglichen Werte zurücksetzen wollen, +but forgot your administration password, you must stop the proxy,==aber Ihr Administatorpasswort vergessen haben, müssen Sie YaCy stoppen, +delete the file 'DATA/SETTINGS/yacy.conf' in the YaCy application root folder and start YaCy again.==die Datei 'DATA/SETTINGS/yacy.conf' im YaCy Hauptordner löschen und YaCy neu starten. +#Performance Settings of Queues and Processes==Performanceeinstellungen für Puffer und Prozesse +Performance Settings of Busy Queues==Performanceeinstellungen für Puffer und Prozesse +Performance of Concurrent Processes==Performance der gleichzeitig laufenden Prozesse +Performance Settings for Memory==Performanceeinstellungen für Speicher +Performance Settings of Search Sequence==Performanceeinstellungen des Suchablaufs +### --- Those 3 items are removed in latest SVN BEGIN +Viewer and administration for database tables==Administration der Datenbank Tabellen +Viewer for Peer-News==Einstellungen Peer Nachrichten +Viewer for Cookies in Proxy==Einstellung Cookie Überwachung +### --- Those 3 items are removed in latest SVN END +Server Access Settings==Server Zugangs-Einstellungen +Proxy Access Settings==Proxy Zugangs-Einstellungen +#Content Parser Settings==Inhalt Parser Einstellungen +Crawler Settings==Crawler Einstellungen +HTTP Networking==HTTP Netzwerk +#Remote Proxy \(optional\)==Remote Proxy (optional) +Seed Upload Settings==Seed Upload Einstellungen +Message Forwarding \(optional\)==Nachrichten Weiterleitung (optional) +#----------------------------- +#File: Settings_Crawler.inc +#--------------------------- +Generic Crawler Settings==Allgemeine Crawler Einstellungen +Connection timeout in ms==Verbindungs-Timeout in ms +means unlimited==schaltet die Begrenzung ab +HTTP Crawler Settings:==HTTP Crawler Einstellungen: +Maximum Filesize==Maximale Dateigröße +FTP Crawler Settings==FTP Crawler Einstellungen +SMB Crawler Settings==SMB Crawler Einstellungen +Local File Crawler Settings==Lokales Dateisystem Crawler Einstellungen +Maximum allowed file size in bytes that should be downloaded==Maximale Größe der herunterzuladenden Datei in Byte +Larger files will be skipped==Größere Dateien werden übersprungen +Please note that if the crawler uses content compression, this limit is used to check the compressed content size==Beachten Sie, dass beim Herunterladen der Dateien mittels "Content-Compression" die komprimierte Dateigröße maßgeblich ist +Submit==Speichern +Changes will take effect immediately==Änderungen sind sofort aktiv +#----------------------------- +#File: Settings_Http.inc +#--------------------------- +HTTP Networking==HTTP Netzwerk +Transparent Proxy==Transparenter Proxy +With this you can specify if YaCy can be used as transparent proxy.==Hiermit können Sie festlegen ob YaCy als transparenter Proxy genutzt werden kann. +Hint: On linux you can configure your firewall to transparently redirect all http traffic through yacy using this iptables rule==Hinweis: Unter Linux können Sie Ihre Firewall darauf einstellen, alle HTTP-Verbindungen transparent an YaCy weiterzuleiten indem Sie diese iptables-Regel verwenden. +Connection Keep-Alive==Verbindung halten +With this you can specify if YaCy should support the HTTP connection keep-alive feature.==Hiermit können Sie festlegen ob YaCy die HTTP connection keep-alive Funktionalität unterstützen soll. +Send "Via" Header==Sende "Via" Header +Specifies if the proxy should send the Via==Gibt an, ob der Proxy den Via-HTTP-Header +http header according to RFC 2616 Sect 14.45.==gemäß RFC 2616 Sect 14.45 senden soll. +Send "X-Forwarded-For" Header== Sende "X-Forward-For" Header +Specifies if the proxy should send the X-Forwarded-For http header.==Gibt an, ob der Proxy den X-forwarded-For HTTP-Header setzen soll. +"Submit"=="Speichern" +Changes will take effect immediately.==Änderungen sind sofort wirksam. +#----------------------------- +#File: Settings_Proxy.inc +#--------------------------- +YaCy can use another proxy to connect to the internet. You can enter the address for the remote proxy here:==YaCy kann einen anderen Proxy nutzen um sich zum Internet zu verbinden. Sie können die Adresse für den Remote Proxy hier eingeben. +Use remote proxy==Nutze Remote Proxy +Enables the usage of the remote proxy by yacy==Aktiviert die Nutzung des Remote Proxies durch YaCy +Use remote proxy for yacy <-> yacy communication==Nutze Remote Proxy für YaCy <-> YaCy Kommunikation +Specifies if the remote proxy should be used for the communication of this peer to other yacy peers.==Gibt an, ob der Remote Proxy für Kommunikation zwischen diesem und anderen YaCy-Peers genutzt werden soll. +Hint: Enabling this option could cause this peer to remain in junior status.==Hinweis: Dies könnte dazu führen, dass dieser Peer im Junior-Status verbleibt. +Use remote proxy for HTTPS==Nutze Remote Proxy für HTTPS +Specifies if YaCy should forward ssl connections to the remote proxy.==Gibt an, ob YaCy SSL-Verbindungen zum Remote Proxy weiterleiten soll. +Remote proxy host==Remote Proxy Host +The ip address or domain name of the remote proxy==Die IP-Adresse oder der Domainname des Remote Proxy +Remote proxy port==Remote Proxy Port +the port of the remote proxy==Der Port des Remote Proxy +Remote proxy user==Remote Proxy Benutzer +Remote proxy password==Remote Proxy Passwort +No-proxy adresses==Proxylose Adressen +IP addresses for which the remote proxy should not be used==IP-Adressen für die der Remote Proxy nicht genutzt werden soll +"Submit"=="Speichern" +Changes will take effect immediately.==Änderungen sind sofort wirksam. +#----------------------------- +#File: Settings_ProxyAccess.inc +#--------------------------- +Proxy Access Settings==Proxyzugangs Einstellungen +These settings configure the access method to your own http proxy and server.==Diese Einstellungen beeinflussen den Zugriff auf Ihren HTTP-Proxy und -Server. +All traffic is routed throug one single port, for both proxy and server.==Alle Verbindungen werden durch einen einzigen Port hergestellt, für beides (Proxy und Server). +Server/Proxy Port Configuration==Server/Proxy Port Konfiguration +The socket addresses where YaCy should listen for incoming connections from other YaCy peers or http clients.==Die Socket-Adressen auf denen YaCy auf eingehende Verbindungen von anderen YaCy-Peers oder HTTP-Clients warten soll. +You have four possibilities to specify the address:==Sie haben vier Möglichkeiten die Adresse anzugeben: +defining a port only==nur einen Port angeben +e.g. 8090==z.B. 8090 +defining IP address and port==eine IP-Adresse und Port angeben +e.g. 192.168.0.1:8090==z.B. 192.168.0.1:8090 +defining host name and port==einen Hostnamen und Port angeben +e.g. home:8090==z.B. home:8090 +defining interface name and port==einen Interface-namen und Port angeben +e.g. #eth0:8090==z.B. #eth0:8090 +Hint: Dont forget to change your firewall configuration after you have changed the port.==Hinweis: Denken Sie daran Ihre Firewalleinstellungen zu ändern nachdem Sie den Port geändert haben. +Proxy and http-Server Administration Port==Proxy und HTTP-Server Administrations Port +Changes will take effect in 5-10 seconds==Die Änderungen werden in 5-10 Sekunden wirksam +Server Access Restrictions==Server Zugangsbeschränkungen +You can restrict the access to this proxy/server using a two-stage security barrier:==Sie können den Zugang zu diesem Proxy/Server mit einer 2-stufigen Sicherheitsbarriere einschränken: +define an access domain with a list of granted client IP-numbers or with wildcards==geben Sie einen Netzwerkadressraum mithilfe einer Liste zugelassener Client-IP-Adressen oder mit Platzhaltern an +define an user account with an user:password - pair==geben Sie einen Nutzeraccount mit einem nutzer:passwort-Paar an +This is the account that restricts access to the proxy function.==Dies sind die Nutzer denen der Zugriff auf die Proxyfunktion gewährt wird. +You probably don't want to share the proxy to the internet, so you should set the==Sie wollen den Proxy vermutlich nicht im Internet zur Verfügung stellen, deshalb sollten Sie +IP-Number Access Domain to a pattern that corresponds to you local intranet.==den IP-Adressraum so einstellen, dass er auf Ihr lokales Intranet zutrifft. +The default setting should be right in most cases. If you want, you can also set a proxy account==Die Standardwerte sollten in den meisten Fällen richtig sein. Wenn Sie wollen können Sie auch Proxyaccounts erstellen +so that every proxy user must authenticate first, but this is rather unusual.==, sodass sich jeder Proxynutzer zuerst anmelden muss, aber das ist eher unüblich. +IP-Number filter==IP-Adressen Filter +Use ==Pfad +The remote path on the FTP server, like==Der Remote-Pfad auf dem FTP-Server, wie +Missing sub-directories are NOT created automatically.==Fehlende Unterverzeichnisse werden NICHT automatisch erstellt. +Username==Benutzername +Your log-in at the FTP server==Ihr Login auf dem FTP-Server +Password==Passwort +The password==Das Passwort +"Submit"=="Speichern" +#----------------------------- +#File: Settings_Seed_UploadScp.inc +#--------------------------- +Uploading via SCP:==Upload per SCP: +This is the account for a server where you are able to login via ssh.==Dies ist der Account für einen Server, auf dem Sie sich per SSH anmelden müssen. +#Server==Server +The host where you have an account, like 'my.host.net'==Der Host auf dem Sie einen Account haben, wie z.B. 'mein.host.net' +#Server Port==Server Port +The sshd port of the host, like '22'==Der SSHD Port vom Host z.B. '22' +Path==Pfad +The remote path on the server, like '~/yacy/seed.txt'. Missing sub-directories are NOT created automatically.==Der Remote Pfad auf dem Server z.B. '~/yacy/seed.txt'. Fehlende Unterverzeichnise werden NICHT automatisch erstellt. +Username==Benutzername +Your log-in at the server==Ihr Login auf dem Server +Password==Passwort +The password==Das Passwort +"Submit"=="Speichern" +#----------------------------- +#File: Settings_ServerAccess.inc +#--------------------------- +Server Access Settings==Serverzugangs Einstellungen +IP-Number filter:==IP-Addressfilter: +Here you can restrict access to the server.==Hier können Sie den Zugang zum Server beschränken. +By default, the access is not limited,==Standardmäßig ist der Zugang unbeschränkt, +because this function is needed to spawn the p2p index-sharing function.==da dies notwendig ist um den P2P-Indextausch zu ermöglichen. +If you block access to your server \(setting anything else than \'\*\'\), then you will also be blocked==Wenn Sie den Zugang zu Ihrem Server blockieren (Einstellen von irgendetwas anderem als '*') dann werden Sie auch davon ausgeschlossen +from using other peers' indexes for search service.==den Index anderer Peers zur Suche zu verwenden. +However, blocking access may be correct in enterprise environments where you only want to index your==Wie auch immer, in Unternehmensumgebungen kann ein Blockieren richtig sein, +company's own web pages.==wenn Sie nur die Unternehmenseigenen Websites indexieren wollen. +staticIP \(optional\):==statische IP (optional): +The staticIP can help that your peer can be reached by other peers in case that your==Die statische IP kann helfen Ihren Peer für andere Peers erreichbar zu machen, falls Sie +peer is behind a firewall or proxy. You can create a tunnel through the firewall/proxy==hinter einer Firewall oder einem Proxy sind. Sie können einen Tunnel durch die Firewall/Proxy erzeugen +\(look out for 'tunneling through https proxy with connect command'\) and create==(sehen Sie nach "Tunnelung durch einen https Proxy mit verbinden-Befehl") und erzeugen Sie +an access point for incoming connections.==einen Zugriffspunkt für eingehende Verbindungen. +This access address can be set here \(either as IP number or domain name\).==Diese Zugrifssadresse kann hier angegeben werden (oder als IP Nummer oder Domain-Name). +If the address of outgoing connections is equal to the address of incoming connections,==Wenn die Zugriffsadresse der ausgehenden Verbindungen dieselbe ist wie die der eingehenden Verbindungen, +you don't need to set anything here, please leave it blank.==brauchen Sie hier nichts angeben. Bitte lassen Sie das Feld leer. +ATTENTION: Your current IP is recognized as "#\[clientIP\]#".==ACHTUNG: Ihre aktuelle IP wird als "#[clientIP]#" erkannt. +If the value you enter here does not match with this IP,==Wenn der Wert, den Sie hier eingegeben haben, nicht mit dieser IP übereinstimmt, +you will not be able to access the server pages anymore.==wird es nicht möglich sein auf die Serverseiten zuzugreifen. +value="Submit"==value="speichern" +#----------------------------- +#File: SettingsAck_p.html +#--------------------------- +YaCy \'\#\[clientname\]\#\': Settings Acknowledge==YaCy '#[clientname]#': Einstellung Verarbeitung +Settings Receipt:==Einstellungen angenommen: +No information has been submitted==Es wurden keine Informationen übertragen. +Error with submitted information.==Es gab einen Fehler bei der Übertragung der Informationen. +Nothing changed.

    ==Nichts wurde verändert.

    +The user name must be given.==Der User Name muss angegeben werden +Your request cannot be processed.==Ihre Anfrage konnte nicht bearbeitet werden. +The password redundancy check failed. You have probably misstyped your password.==Die Passwortüberprüfung schlug fehl. Sie haben sich wahrscheinlich vertippt. +Shutting down.
    Application will terminate after working off all crawling tasks.==Runterfahren
    Die Anwendung wird geschlossen, nachdem alle Crawls abgearbeitet wurden. +Your administration account setting has been made.==Ihre Administrator Account Einstellungen wurden gespeichert. +Your new administration account name is \#\[user\]\#. The password has been accepted.
    If you go back to the Settings page, you must log-in again.==Ihr neuer Administrator Account Name ist #[user]#. Das Passwort wurde akzeptiert.
    Wenn Sie zurück zu den Einstellungen gehen wollen, müssen Sie sich neu einloggen. +Your proxy access setting has been changed.==Die Proxy Zugangs Einstellungen wurden geändert. +Your proxy account check has been disabled, since you did not supply a password.==Ihr Proxy Account Test wurde deaktiviert, weil sie kein Passwort eingegeben haben. +The new proxy IP filter is set to==Der neue Proxy IP-Filter ist +The proxy port is:==Der Proxy Port ist: +Port rebinding will be done in a few seconds.==Die Port Neubindung wird in wenigen Sekunden abgeschlossen sein. +You can reach your YaCy server under the new location==Sie können Ihren YaCy Server unter folgender neuer Adresse erreichen: +Your proxy access setting has been changed.==Ihre Proxy Zugangs Einstellung wurden geändert. +Your server access filter is now set to==Ihr Proxy Zugangs Filter ist nun gesetzt auf +Auto pop-up of the Status page is now disabled==Das automatisches Pop-Up der Status Seite beim Browserstart ist nun deaktiviert. +Auto pop-up of the Status page is now enabled==Das automatisches Pop-Up der Status Seite beim Browserstart ist nun aktiviert. +You are now permanently online.==Sie sind nun im permanenten Online Modus. +After a short while you should see the effect on the====Nach kurzer Zeit können Sie die Änderungen auf der +status page.==Status-Seite sehen. +The Peer Name is:==Der Name dieses Peers ist: +Your static Ip\(or DynDns\) is:==Ihre statische IP(oder DynDns) ist: +Seed Settings changed.\#\(success\)\#::You are now a principal peer.==Seed Einstellungen wurden geändert.#(success)#::Sie sind nun ein Principal Peer. +Seed Settings changed, but something is wrong.==Seed Einstellungen wurden geändert, aber etwas stimmt nicht. +Seed Uploading was deactivated automatically.==Seed Upload wurde automatisch deaktiviert. +Please return to the settings page and modify the data.==Bitte kehren Sie zu den Einstellungen zurück und modifizieren Sie die Daten. +The remote-proxy setting has been changed==Die remote-proxy Einstellungen wurden geändert. +The new setting is effective immediately, you don't need to re-start.==Die neuen Einstellungen wirken sofort. Sie brauchen den Peer nicht neu zu starten. +The submitted peer name is already used by another peer. Please choose a different name. The Peer name has not been changed.==Der eingegebene Peername wird bereits von einem anderen Peer benutzt. Bitte wählen Sie einen anderen Namen. Der Peername wurde nicht geändert. +Your Peer Language is:==Ihre Peer Sprache ist: +The submitted peer name is not well-formed. Please choose a different name. The Peer name has not been changed. +Peer names must not contain characters other than (a-z, A-Z, 0-9, '-', '_') and must not be longer than 80 characters. +#The new parser settings where changed successfully.==Die neuen Parser Einstellungen wurden erfolgreich gespeichert. +Parsing of the following mime-types was enabled: +Seed Upload method was changed successfully.==Seed Upload Methode wurde erfolgreich geändert. +You are now a principal peer.==Sie sind nun ein Principal Peer. +Seed Upload Method:==Seed Upload Methode: +Seed File URL:==Seed Datei URL: +Your proxy networking settings have been changed.==Ihre Proxy Netzwerk Einstellungen wurden geändert. +Transparent Proxy Support is:==Durchsichtige Proxy Unterstützung ist: +Connection Keep-Alive Support is:==Verbindung aufrecht erhalten Unterstützung ist: +Your message forwarding settings have been changed.==Ihre Nachrichten Weiterleitungseinstellungen haben sich geändert. +Message Forwarding Support is:==Nachrichten Weiterleitungs Unterstützung: +Message Forwarding Command:==Nachrichten Weiterleitungskommando: +Recipient Address:==Empfänger Adresse: +Please return to the settings page and modify the data.==Bitte kehren Sie zu den Einstellungen zurück und modifizieren Sie die Daten. +You are now event-based online.==Sie sind nun im aktivitätsbasierten Modus. +After a short while you should see the effect on the==Nach kurzer Zeit können Sie die Änderungen auf der +You are now in Cache Mode.==Sie sind nun im Cache Modus. +Only Proxy-cache ist available in this mode.==Nur der Proxy Cache ist in diesem Modus verfügbar. +After a short while you should see the effect on the==Nach kurzer Zeit können Sie die Änderungen auf der +You can now go back to the==Sie können nun zurück zu den +Settings page if you want to make more changes.==Einstellungen gehen, um weitere Änderungen vorzunehmen. +You can reach your YaCy server under the new location==Dieser YaCy-Peer kann nun unter seiner neuen Adresse erreicht werden: +#----------------------------- +#File: Settings_MessageForwarding.inc +#--------------------------- +Message Forwarding==Nachrichten Weiterleitung +With this settings you can activate or deactivate forwarding of yacy-messages via email.==Mit diesen Einstellungen können Sie die Weiterleitung von YaCy-Nachrichten per E-Mail aktivieren oder deaktivieren. +Enable message forwarding==Aktiviere Nachrichten Weiterleitung +Enabling/Disabling message forwarding via email.==Aktivieren/Deaktivieren der Nachrichten Weiterleitung per E-Mail. +Forwarding Command==Weiterleitungskommando +The command-line program that should be used to forward the message.
    ==Das Kommandozeilenprogramm, das verwendet werden soll um die Nachricht weiterzuleiten.
    +Forwarding To==Weiterleiten An +The recipient email-address.
    ==Die E-Mail Adresse des Empfängers.
    +e.g.:==z.B.: +"Submit"=="Speichern" +Changes will take effect immediately.==Änderungen sind sofort wirksam. +#----------------------------- +#File: sharedBlacklist_p.html +#--------------------------- +Shared Blacklist==Freigegebene Blacklist +Add Items to Blacklist==Hinzufügen von Daten zur Blacklist +Unable to store the items into the blacklist file:==Es war nicht möglich in folgender Blacklist Datei die Daten zu speichern: +#File Error! Wrong Path?==Datei Fehler! Falscher Pfad? +YaCy-Peer "\#\[name\]\#" not found.==YaCy Peer YaCy-Peer "#[name]#" nicht gefunden. +not found or empty list.==nicht gefunden oder leere Liste. +Wrong Invocation! Please invoke with==Falscher Aufruf! Bitte nur so aufrufen +Blacklist source:==Blacklist Quelle: +Blacklist target:==Blacklist Ziel: +Blacklist item==Blacklist Eintrag +"select all"=="alle auswählen" +"deselect all"=="alle abwählen" +value="add"==value="hinzufügen" +#----------------------------- +#File: Status.html +#--------------------------- +Console Status==Статус консоли +Log-in as administrator to see full status==Зайдите как Administrator чтобы увидить всю статистику +Welcome to YaCy!==Добро пожаловать в YaCy! +Your settings are _not_ protected!==Ваши настройка не защищены +Please open the accounts configuration page immediately==Пожалуйста перейдите по ссылке Настройка аккаунта немедленно +and set an administration password.==и установите пароль Администратора. +You have not published your peer seed yet. This happens automatically, just wait.==Ihr Peer ist dem Netzwerk noch nicht bekannt. Warten Sie noch ein wenig, dies geschieht automatisch. +The peer must go online to get a peer address.==Ihr Peer muss online gehen, um eine Adresse zu bekommen. +You cannot be reached from outside.==Вы недоступны извне. +A possible reason is that you are behind a firewall, NAT or Router.==Возможно Вы находитесь за брандмауэром, NAT или роутоером. +But you can search the internet using the other peers'==Но Вы можете выполнять поиск, используя помощь других пиров +global index on your own search page.==перейдя на главную страницу поиска. +"bad"=="плохой" +"idea"="идея" +"good"="хороший" +"Follow YaCy on Twitter"=="Следуй за YaCy на Twitter" +We encourage you to open your firewall for the port you configured \(usually: 8090\),==Мы рекомендуем Вам открыть доступ к порту на Вашем брандмауэре который Вы настроили (обычно: 8090), +or to set up a 'virtual server' in your router settings \(often called DMZ\).==или выполните настройку "виртуального сервера" в настройках Вашего роутера (настройка обычно называется DMZ). +Please be fair, contribute your own index to the global index.==Пожалуйста примите участие в создании глобального поискового индекса. +Free disk space is lower than \#\[minSpace\]\#. Crawling has been disabled. Please fix==Свободное место на диске меньше чем #[minSpace]#. Сканирование сайтов деактивировано. Пожалуйста освободите место на диске. +it as soon as possible and restart YaCy.==Это также потребует перезапуск YaCy. +Free memory is lower than \#\[minSpace\]\#. DHT has been disabled. Please fix==Es steht weniger als #[minSpace]# Arbeitsspeicher zur Verfügung. DHT wurde deaktiviert. Bitte beheben Sie +Latest public version is==Die neueste stabile Version ist +You can download a more recent version of YaCy. Click here to install this update and restart YaCy:==Sie können eine aktuellere Version von YaCy herunterladen. Klicken Sie hier, um dieses Update zu installieren und YaCy neu zu starten: +#"Update YaCy"=="Update YaCy" +Install YaCy==Установка YaCy +You are running a server in senior mode and you support the global internet index,==Sie lassen YaCy bei sich im Senior Modus laufen und unterstützen den globalen Index, +which you can also search yourself.==den Sie auch selbst durchsuchen können. +You have a principal peer because you publish your seed-list to a public accessible server==Sie haben einen Principal Peer, weil Sie Ihre Seed-Liste auf einen öffentlich zugänglichen Server hoch laden, +where it can be retrieved using the URL==von wo aus sie unter folgender Adresse erreichbar ist: +Your Web Page Indexer is idle. You can start your own web crawl here==Ваш индексатор веб сайтов простаивает. Вы можете начать сканирование сайта по ссылке +Your Web Page Indexer is busy. You can monitor your web crawl here.==Ваш индексатор веб сайтов работает. Вы можете посмотреть его работу по этой ссылке +#----------------------------- +#File: Status_p.inc +#--------------------------- +System Status==Статус системы +Process==Процесс +Unknown==Неизвестный +Uptime==Время работы +days==дней +System Resources==Системные ресурсы +Processors:==Процессоров: +Protection==Защита +Password is missing==Пароль не используется +password-protected==Пароль используется +Unrestricted access from localhost==Неограниченный доступ с локального хоста +Address==Адрес +Host==Хост +peer address not assigned==Peer Adresse nicht zugewiesen +Public Address:==Публичный адрес: +YaCy Address:==YaCy адрес: +#Peer Host==Peer Host +#Port Forwarding Host==Port Forwarding Host +broken==повреждено +connected==подключено +Remote Proxy==Прокси сервер +not used==не используется +Used for YaCy -> YaCy communication:==Использовано для YaCy -> YaCy коммуникаций: +WARNING:==WARNUNG: +You do this on your own risk.==Sie verwenden diese Einstellung auf Ihr eigenes Risiko. +If you do this without YaCy running on a desktop-pc or without Java 6 installed, this will possibly break startup.==Wenn Sie diese Option verwenden, ohne dass YaCy auf einem Desktop PC läuft, oder ohne installiertes Java 6, wird YaCy vermutlich nicht mehr starten. +In this case, you will have to edit the configuration manually in DATA/SETTINGS/yacy.conf==In dem Fall müssen Sie die Konfiguration manuell in der folgenden Konfigurationsdatei ändern DATA/SETTINGS/yacy.conf +>Experimental<==>Experimentell< +Yes==Да +No==Нет +Auto-popup on start-up==Вслывающие сообщения при запуске +Disabled==Отключено +Enable\]==Включено] +Enabled ==Сброс +Proxy:==Прокси +Crawler:==Сканер сайтов: +Incoming Connections==Входящих соединений: +Active:==Активно: +Max:==Максимально: +#Indexing Queue==Indexier Puffer +Loader Queue==Загружено запросов +paused==на паузе +Queues==Запросы +Local Crawl==Локальный сканер +Remote triggered Crawl==Удаленный сканер +Pre-Queueing==Vor-Pufferung +Seed server==Скорость сервера +Configure==Настройка +Enabled: Updating to server==Включено: Обновление на сервер: +Last upload: #\[lastUpload\]# ago.==Последная передача: #\[lastUpload\]# +Enabled: Updating to file==Включено: Обновление до файла +#----------------------------- +#File: Steering.html +#--------------------------- +Steering==Steuerung +Checking peer status...==Überprüfe Peer Status ... +Peer is online again, forwarding to status page...==Peer ist wieder online. Weiterleitung auf Status Seite ... +Peer is not online yet, will check again in a few seconds...==Peer ist noch nicht online. Nächste Prüfung in wenigen Sekunden ... +No action submitted==Keine Aktion übermittelt +Go back to the Settings page==Zurück zur Seite mit den Erweiterten Einstellungen +Your system is not protected by a password==Ihr System wird nicht von einem Passwort geschützt +Please go to the User Administration page and set an administration password.==Bitte legen Sie ein Administrator Passwort auf der Seite Benutzerverwaltung fest. +You don't have the correct access right to perform this task.==Sie haben nicht die Erlaubnis diese Anwendung auszuführen. +Please log in.==Bitte melden Sie sich an. +You can now go back to the Settings page if you want to make more changes.==Sie können nun zurück auf die Einstellungen Seite gehen, wenn Sie weitere Änderungen vornehmen wollen. +See you soon!==Bis bald! +Just a moment, please!==Einen Moment bitte! +Application will terminate after working off all scheduled tasks.==YaCy Proxy wird beendet, nachdem alle ausstehenden Aufgaben abgearbeitet wurden. +Then YaCy will restart.==Dann wird YaCy neu gestartet. +If you can't reach YaCy's interface after 5 minutes restart failed.==Wenn Sie nach 5 Minuten nicht auf das YaCy Interface zugreifen können, dann ist der Neustart fehlgeschlagen. +Installing release==Installiere Release +YaCy will be restarted after installation==YaCy wird nach der Installation neugestartet +#----------------------------- +#File: Supporter.html +#--------------------------- +Supporter<==Unterstützer< +"Please enter a comment to your link recommendation. (Your Vote is also considered without a comment.)" +Supporter are switched off for users without authorization==Die Unterstützer-Seiten sind ausgeschaltet für Benutzer ohne Erlaubnis +"bookmark"=="Lesezeichen" +"Add to bookmarks"=="Zu den Lesezeichen hinzufügen" +"positive vote"=="Positive Bewertung" +"Give positive vote"=="Link positiv bewerten" +"negative vote"=="Negative Bewertung" +"Give negative vote"=="Link negativ bewerten" +provided by YaCy peers with an URL in their profile. This shows only URLs from peers that are currently online.==bereitgestellt durch YaCy Peers mit einer URL in ihrem Profil. Es werden nur URLs von Peers angezeigt, die online sind. +#----------------------------- +#File: Surftips.html +#--------------------------- +Surftips==Surftipps +Surftips

    ==Surftipps +Surftips are switched off==Surftipps sind ausgeschaltet +title="bookmark"==title="Lesezeichen" +alt="Add to bookmarks"==alt="Zu den Lesezeichen hinzufügen" +title="positive vote"==title="Positive Bewertung" +alt="Give positive vote"==alt="Link positiv bewerten" +title="negative vote"==title="Negative Bewertung" +alt="Give negative vote"==alt="Link negativ bewerten" +YaCy Supporters<==YaCy Unterstützer< +>a list of home pages of yacy users<==>Eine Liste von Homepages von YaCy Nutzern< +provided by YaCy peers using public bookmarks, link votes and crawl start points==automatisch erzeugt durch öffentliche Lesezeichen, Link-Bewertungen und Crawl-Startpunkte anderer YaCy-Peers +"Please enter a comment to your link recommendation. \(Your Vote is also considered without a comment.\)"=="Bitte geben Sie zu Ihrer Linkempfehlung einen Kommentar ein. (Ihre Stimme wird auch ohne Kommentar angenommen.)" +"authentication required"=="Autorisierung erforderlich" +Hide surftips for users without autorization==Verberge Surftipps für Benutzer ohne Autorisierung +Show surftips to everyone==Zeige Surftipps allen Benutzern +#----------------------------- +#File: Table_API_p.html +#--------------------------- +: Peer Steering==: Peer Steuerung +Steering of API Actions<==Steuerung der API Aktionen< +This table shows actions that had been issued on the YaCy interface==Diese Tabelle zeigt Aktionen, die auf dem YaCy Interface ausgelöst wurden, +to change the configuration or to request crawl actions.==um Konfigurationen zu ändern oder Crawl Aktionen anzufordern. +These recorded actions can be used to repeat specific actions and to send them==Diese aufgezeichneten Aktionen können dazu verwendet werden, bestimmte Aktionen wiederholt auszuführen und um sie +to a scheduler for a periodic execution.==einem Scheduler für periodische Ausführung zu übergeben. +>Recorded Actions<==>Aufgezeichnete Aktionen< +"previous page"=="предыдущая страница" +"next page"=="следующая страница" + of \#\[of\]\#== von #[of]# +>Date==>Дата +>Type==>Тип +>Comment==>Комментарий +Call
    Count<==Aufruf
    Zähler< +Recording<==Aufzeichnungs< +Last Exec==Последний  запуск +Next Exec==Следующий запуск +>Scheduler<==>Планировщик< +#>URL<==>URL +>no repetition<==>keine Wiederholung< +>activate scheduler<==>Ausführung planen< +"Execute Selected Actions"=="Führe ausgewählte Aktionen aus" +"Delete Selected Actions"=="Lösche ausgewählte Aktionen" +>Result of API execution==>Ergebnis der API Ausführung +#>Status<==>Status> +#>URL<==>URL< +>minutes<==>минут< +>hours<==>часов< +>days<==>дней< +Scheduled actions are executed after the next execution date has arrived within a time frame of \#\[tfminutes\]\# minutes.==Geplante Aktionen werden innerhalb eines #[tfminutes]# Minuten Zeitfensters ausgeführt wenn der nächste Ausführungszeitpunkt erreicht wurde. +#----------------------------- +#File: Table_RobotsTxt_p.html +#--------------------------- +Table Viewer==Tabellenanzeige +The information that is presented on this page can also be retrieved as XML==Die Informationen auf dieser Seite können auch im XML Format abgerufen werden +Click the API icon to see the XML.==Klicken Sie auf das API Symbol, um das XML anzeigen zu lassen. +To see a list of all APIs, please visit the API wiki page.==Um eine Liste aller APIs zu sehen, besuchen Sie die API Seite im Wiki. +>robots.txt table<==>robots.txt Tabelle< +#----------------------------- +### This Tables section is removed in current SVN Versions +#File: Tables_p.html +#--------------------------- +Table Administration==Administration der Datenbank Tabellen +Table Selection==Tabellenauswahl +Select Table:==Auswahl Tabelle: +#"Show Table"=="Zeige Tabelle" +show max.==Zeige max. +>all<==>alle< +entries,==Einträge, +search rows for==filtere Zeilen nach +"Search"=="Suche" +Table Editor: showing table==Tabellen Editor: zeige Tabelle +#PK==Primärschlüssel +"Edit Selected Row"=="Bearbeite ausgwählte Zeile" +"Add a new Row"=="Füge neue Zeile ein" +"Delete Selected Rows"=="Lösche ausgewählte Zeile" +"Delete Table"=="Удалить таблицу" +Row Editor==Zeileneditor +Primary Key==Primärschlüssel +"Commit"=="Absenden" +#----------------------------- +#File: Table_YMark_p.html +#--------------------------- +Table Viewer==Tabellen Anzeige +YMark Table Administration==YMark Tabellen Administration +Table Editor: showing table==Tabellen Editor: Angezeigte Tabelle +"Edit Selected Row"=="Bearbeite angezeigte Reihe" +"Add a new Row"=="Füge neue Zeile ein" +"Delete Selected Rows"=="Lösche ausgewählte Reihe" +"Delete Table"=="Lösche Tabelle" +"Rebuild Index"=="Index neu aufbauen" +Primary Key==Primärschlüssel +>Row Editor<==>Reihen Editor< +"Commit"=="Eintragen" +Table Selection==Tabellen Auswahl +Select Table:==Wähle Tabelle: +show max. entries==Zeige max. Einträge +>all<==>Alle< +Display columns:==Zeige Spalten: +"load"=="Laden" +Search/Filter Table==Suche/Filter Tabelle +search rows for==Suche Reihen mit +"Search"=="Suche" +#>Tags<==>Tags< +>select a tag<==>Tag auswählen< +>Folders<==>Ordner< +>select a folder<==>Ordner auswählen< +>Import Bookmarks<==>Importiere Lesezeichen< +#Importer:==Importer: +#>XBEL Importer<==>XBEL Importer< +#>Netscape HTML Importer<==>Netscape HTML Importer< +"import"=="Importieren" +#----------------------------- +#File: terminal_p.html +#--------------------------- +#YaCy System Monitor==YaCy System Monitor +Search Form==Suchformular +Crawl Start==Crawl starten +Status Page==Status Seite +Confirm Shutdown==Bestätige Herunterfahren +><Shutdown==><Herunterfahren +Event Terminal==Ereignis Terminal +Image Terminal==Bilder Terminal +#Domain Monitor==Domain Monitor +"Loading Processing software..."=="Verarbeitungs Software wird geladen..." +This browser does not have a Java Plug-in.==Dieser Browser besitzt kein Java Plug-In. +Get the latest Java Plug-in here.==Holen Sie sich das neueste Java Plug-In hier. +Resource Monitor==Ressourcen Monitor +Network Monitor==Netzwerk Monitor +#----------------------------- +#File: Threaddump_p.html +#--------------------------- +YaCy Debugging: Thread Dump==YaCy Debug: Thread Dump +Threaddump<==Thread Dump< +"Single Threaddump"=="Einzelner Thread Dump" +"Multiple Dump Statistic"=="Mehrfache Dump Statistiken" +#"create Threaddump"=="Threaddump erstellen" +#----------------------------- +#File: User.html +#--------------------------- +User Page==Benutzer Seite +You are not logged in.
    ==Sie sind nicht angemeldet.
    +Username:==Benutzername: +Password: Get URL Viewer<==>URL Betrachter< +>URL Metadata<==>URL Metadaten< +#URL==URL +#Hash==Hash +Word Count==Anzahl Wörter +Description==Beschreibung +Size==Größe +View as==Zeige als +#Original==Original +Plain Text==Quelltext +Parsed Text==Geparster Text +Parsed Sentences==Geparste Sätze +Parsed Tokens/Words==Geparste Zeichen/Wörter +Link List==Linkliste +"Show"=="Anzeigen" +Unable to find URL Entry in DB==Es war nicht möglich den URL Eintrag in der DB zu finden. +Invalid URL==Ungültige URL +Unable to download resource content.==Es war nicht möglich den Inhalt der Quelle runterzuladen. +Unable to parse resource content.==Es war nicht möglich den Inhalt der Quelle zu parsen. +Unsupported protocol.==Nicht unterstütztes Protokoll. +>Original Content from Web<==>Quelltext aus dem Web< +Parsed Content==Geparster Quellen Inhalt +>Original from Web<==>Original aus dem Web< +>Original from Cache<==>Original aus dem Cache< +>Parsed Tokens<==>Geparste Zeichen/Wörter< +#----------------------------- +#File: ViewLog_p.html +#--------------------------- +Lines==Zeilen +reversed order==umgekehrte Reihenfolge +"refresh"=="Aktualisieren" +#----------------------------- +#File: ViewProfile.html +#--------------------------- +Local Peer Profile:==Профиль локального пира: +Remote Peer Profile==Профиль удаленного пира +Wrong access of this page==Неверный доступ на эту страницу +The requested peer is unknown or a potential peer.==Der gewünschte Peer ist nicht bekannt oder ein potenzieller Peer. +The profile can't be fetched.==Этот профиль не может быть выбран +The peer==Пир +is not online.==не на свящи. +This is the Profile of==Профиль +>Name<==>Имя< +Nick Name==Ник +Homepage==Домашная страница +#eMail==eMail +#ICQ==ICQ +#Jabber==Jabber +#Yahoo!==Yahoo! +#MSN==MSN +#Skype==Skype +Comment==Комментарий +View this profile as==Просмотр этого профиля как +> or==> или +#vCard==vCard +You can edit your profile here==Вы можете изменить свой профиль по этой ссылке +#----------------------------- +#File: Crawler_p.html +#--------------------------- +Crawler Queues==Запросы сканирования +PPM \(Pages Per Minute\)==Страниц в Минуту (СвМ) +Traffic \(Crawler\)==Трафик (Сканера) +RWI RAM \(Word Cache\)==RWI RAM (Кэш слов) +Error with profile management. Please stop YaCy, delete the file DATA/PLASMADB/crawlProfiles0.db==Fehler im Profil Management. Bitte stoppen Sie YaCy, löschen Sie die Datei DATA/PLASMADB/crawlProfiles0.db +and restart.==und starten Sie YaCy neu. +Error:==Ошибка: +Application not yet initialized. Sorry. Please wait some seconds and repeat==Anwendung noch nicht initialisiert. Bitte warten Sie noch ein paar Sekunden und versuchen +ERROR: Crawl filter==ОШИБКА: фильтр сканирования +does not match with==не совпадает с +crawl root==корень сканирования +Please try again with different==Попробуйте ещё раз с различием +filter. ::==фильтр. :: +Crawling of==Сканирование +failed. Reason:==неудачно. Grund: +Error with URL input==Ошибка с указаным URL +Error with file input==Fehler mit Datei Eingabe +started.==запущено. +Please wait some seconds,==Пожалуйста, ожидайне несколько секун, +it may take some seconds until the first result appears there.==это может занять несколько секунд пока ожидается первый результат. +If you crawl any un-wanted pages, you can delete them here.==Wenn Ihr Crawl Seiten indexiert, die Sie nicht indexiert haben wollen, können Sie diese hier löschen. +Crawl Queue:==Очередь сканирования: +Queue==Очередь +Profile==Профиль +Initiator==Инициатор +Depth==Глубина +Modified Date==Дата модифицирования +Anchor Name==Имя якоря +#URL==URL +Delete==Удалить +Next update in==Следующее обновление через +/> seconds.==/> секунд. +See a access timing here==Смотрите сроки доступа по этой ссылке +Queue==Очередь +>Size==>Размер +Max<==Максимально< +#Indexing==Indexieren +Loader==Загрузка +Local Crawler==Локальный сканер +Limit Crawler==Ограничения сканера +Remote Crawler==Удаленный сканер +unlimited==неограниченно +Speed<==Скорость< +"minimum"=="минимально" +"custom"=="по заказу" +"maximum"=="максимально" +Database==База данных +Entries==Einträge +Pages \(URLs\)==Страниц (URL адресов) +RWIs \(Words\)==RWIs (Слов) +Indicator==Индикатор +Level==Уровень +#----------------------------- +#File: WatchWebStructure_p.html +#--------------------------- +The data that is visualized here can also be retrieved in a XML file, which lists the reference relation between the domains.==Die Daten die hier visualisiert werden können auch in einer XML geladen werden, die die verweisenden Relationen zwischen den Domains auflistet. +With a GET-property 'about' you get only reference relations about the host that you give in the argument field for 'about'.==Mit der GET Eigenschaft 'about' können Sie nur die verweisenden Relationen über den im 'about' Argument Feld angegebenen Host abrufen. +With a GET-property 'latest' you get a list of references that had been computed during the current run-time of YaCy, and with each next call only an update to the next list of references.==Mit der GET Eigenschaft 'latest' können Sie eine Liste der Referenzen abrufen, die während der aktuellen Laufzeit von YaCy berechnet wurden. Und mit jedem Aufruf nur ein Update der jeweils bis dahin neuen Referenzen. +Click the API icon to see the XML file.==Klicken Sie auf die API Sprechblase, um die XML Datei anzusehen. +To see a list of all APIs, please visit the API wiki page.==Um eine Liste aller APIs zu sehen, besuchen Sie die API Seite im Wiki. +Web Structure==Netz Struktur +host<==Host< +depth<==Tiefe< +nodes<==Knoten< +time<==Zeit< +size<==Größe< +>Background<==>Hintergrund< +#>Text<==>Text< +>Line<==>Linie< +>Dot<==>Punkt< +>Dot-end<==>Punktende< +>Color <==>Farbe < +"change"=="Ändern" +#----------------------------- +#File: Wiki.html +#--------------------------- +YaCyWiki page:==YaCyWiki Seite: +last edited by==zuletzt bearbeitet von +change date==Änderungsdatum +Edit<==Bearbeiten< +only granted to admin==nur als Admin erlaubt +Grant Write Access to==Erlaube es folgenden Benutzern das Wiki zu bearbeiten +# !!! Do not translate the input buttons because that breaks the function to switch rights !!! +#"all"=="Allen" +#"admin"=="Administrator" +Start Page==Startseite +#Index==Index +Versions==Versionen +Author:==Автор: +#Text:==Text: +You can use==Sie können hier +Wiki Code here.==Wiki Befehle benutzen. +"edit"=="bearbeiten" +"Submit"=="Absenden" +"Preview"=="Vorschau" +"Discard"=="Verwerfen" +>Preview==>Vorschau +No changes have been submitted so far!==Es wurden noch keine Änderungen übertragen! +Subject==Тема +Change Date==Änderungsdatum +Last Author==Последний автор +IO Error reading wiki database:==I0 Fehler beim Lesen der Wiki Datenbank: +Select versions of page==Wähle Versionen der Seite +Compare version from==Vergleiche Version vom +"Show"=="Anzeigen" +with version from==mit Version vom +"current"=="aktuelle" +"Compare"=="Vergleichen" +Return to==Kehre zurück zu +Changes will be published as announcement on YaCyNews==Änderungen werden über den YaCy News Service bekannt gegeben. +#----------------------------- +#File: WikiHelp.html +#--------------------------- +Wiki Help==Wiki Hilfe +Wiki-Code==Wiki-Befehle +This table contains a short description of the tags that can be used in the Wiki and several other servlets==Diese Tabelle enthält eine kurze Beschreibung der Tags, die in diesem Wiki und an anderen Stellen +of YaCy. For a more detailed description visit the==in YaCy benutzt werden können. Für eine detailliertere Beschreibung besuchen Sie bitte das +#YaCy Wiki==YaCy Wiki +Description==Beschreibung +\=headline===Überschrift +These tags create headlines. If a page has three or more headlines, a table of content will be created automatically.==Diese Tags erzeugen Überschriften. Wenn die Seite drei oder mehr Überschriften enthält, wird automatisch ein Inhaltsverzeichnis erstellt. +Headlines of level 1 will be ignored in the table of content.==Überschriften im ersten Level werden beim Erstellen des Inhaltsverzeichnisses ignoriert. +#text==Text +These tags create stressed texts. The first pair emphasizes the text \(most browsers will display it in italics\),==Diese Tags erzeugen hervorgehobenen Text. Das erste Paar betont den Text (die meisten Browser zeigen die Texte kursiv), +the second one emphazises it more strongly \(i.e. bold\) and the last tags create a combination of both.==das Zweite betont den Text stärker (z.B. fett) und der letzte Tag erzeugt eine Mischung aus beidem. +Text will be displayed stricken through.==Text wird durchgestrichen angezeigt. +Lines will be indented. This tag is supposed to mark citations, but may as well be used for styling purposes.==Der Text erscheint eingerückt. Dieser Tag eignet sich, um Zitate zu markieren, wird aber auch zum Designen benutzt. +point==Punkt +These tags create a numbered list.==Diese Tags erstellen eine nummerierte Liste. +something<==etwas< +another thing==was anderes +and yet another==und wieder was anderes +something else==irgendwas +These tags create an unnumbered list.==Diese Tags erstellen eine unnummerierte Liste. +word==Wort +\:definition==:Definition +These tags create a definition list.==Diese Tags erstellen eine definierte Liste. +This tag creates a horizontal line.==Dieser Tag erzeugt eine horizontale Linie. +pagename==Seitenname +description\]\]==Beschreibung]] +This tag creates links to other pages of the wiki.==Dieser Tag erzeugt einen Link zu einer anderen Seite im Wiki. +This tag displays an image, it can be aligned left, right or center.==Dieser Tag fügt ein Bild ein, es kann links (left), rechts (right) oder mittig (center) ausgerichtet werden. +These tags create a table, whereas the first marks the beginning of the table, the second starts==Diese Tags erstellen eine Tabelle, wobei der erste den Anfang der Tabelle markiert, der zweite beginnt +a new line, the third and fourth each create a new cell in the line. The last displayed tag==eine neue Zeile, der dritte und vierte erzeugen eine neue Zelle in der Zeile. Der zuletzt dargestellte Tag +closes the table.==schließt die Tabelle. +#The escape tags will cause all tags in the text between the starting and the closing tag to not be treated as wiki-code.==Durch diesen Tag wird der Text, der zwischen den Klammern steht, nicht interpretiert und unformatiert als normaler Text ausgegeben. +A text between these tags will keep all the spaces and linebreaks in it. Great for ASCII-art and program code.==Ein Text zwischen diesen Tags wird alle Leerzeichen und Zeilenumbrüche beinhalten. Gut geeignet für ASCII-Kunst und Programm Code. +If a line starts with a space, it will be displayed in a non-proportional font.==Wenn eine Zeile mit einem Leerzeichen anfängt, wird diese als nicht-proportionale Schriftart dargestellt. +url description==URL Beschreibung +This tag creates links to external websites.==Dieser Tag erstellt einen Link zu einer externen Internetseite. +alt text==alt Beschreibung +#----------------------------- +#File: yacyinteractive.html +#--------------------------- +YaCy Interactive Search==YaCy interaktive Suche +This search result can also be retrieved as RSS/opensearch output.==Das Suchergebnis kann auch als RSS/opensearch Ausgabe abgerufen werden. +The query format is similar to SRU.==Das Abfrageformat ist ähnlich dem SRU. +Click the API icon to see an example call to the search rss API.==Klicken Sie auf das API Symbol, um einen Beispielaufruf der RSS Such API zu sehen. +To see a list of all APIs, please visit the API wiki page.==Um eine Liste aller APIs zu sehen, besuchen Sie die API Seite im Wiki. +#----------------------------- +#File: yacysearch.html +#--------------------------- +Search Page==Страница поиска +This search result can also be retrieved as RSS/opensearch output.==Diese Suchergebnisse können auch als RSS/opensearch abgerufen werden. +The query format is similar to SRU.==Das Abfrageformat ist so ähnlich wie SRU. +Click the API icon to see an example call to the search rss API.==Klicken Sie auf den API Button, um ein Beispiel zu sehen, wie das Such-RSS-API aufgerufen werden kann. +To see a list of all APIs, please visit the API wiki page.==Um eine Liste aller APIs zu sehen, besuchen Sie die API Seite im Wiki. +Did you mean:==Meinten Sie vielleicht: +"Search"=="Поиск" +'Search'=='Поиск' +"search again"=="Искать ещё" +more options==Расширенный поиск... +Text==Текст +Images==Картинки +Audio==Аудио +Video==Видео +Applications==Приложения +The following words are stop-words and had been excluded from the search:==Folgende Wörter sind Stopwords und wurden von der Suche ausgeschlossen: +No Results.==Нет результата. +length of search words must be at least 3 characters==Die Länge der Suchbegriffe muss mindestens 3 Zeichen betragen +> of==> из +g> local,==g> локально, +#g> remote),==g> удаленно), +> from==> из +remote YaCy peers.==удаленных YaCy пиров. +#----------------------------- +#File: yacysearchitem.html +#--------------------------- +"bookmark"=="закладка" +"recommend"=="рекомендовать" +"delete"=="удалить" +Pictures==Картинка +#----------------------------- +#File: yacysearchtrailer.html +#--------------------------- +Show search results for "\#\[query\]\#" on map==Zeige die Suchergebnisse für "#[query]#" auf der Karte +#>Domain Navigator==>Domain Navigator +>Name Space Navigator==>Namespace Navigator +>Author Navigator==>Autoren Navigator +#----------------------------- +### Subdirectory api ### +#File: api/table_p.html +#--------------------------- +Table Viewer==Tabellen Betrachter +#>PK<==>Primärschlüssel< +"Edit Table"=="Tabelle bearbeiten" +#----------------------------- +#File: api/yacydoc.html +#--------------------------- +>Author<==>Автор< +>Description<==>Beschreibung< +>Subject<==>Тема< +#>Publisher<==>Veröffentlicher< +#>Contributor<==>Beiträger< +>Date<==>Datum< +>Type<==>Typ< +>Identifier<==>Identifizierer< +>Language<==>Язык< +>Load Date<==>Lade Datum< +>Referrer Identifier<==>Referrer Identifizierer< +#>Referrer URL<==>Referrer URL< +>Document size<==>Dokument Größe< +>Number of Words<==>Anzahl der Wörter< +#----------------------------- +### Subdirectory env/templates ### +#File: env/templates/header.template +#--------------------------- +YaCy - Distributed Search Engine==YaCy - Распределенный поисковый движок +### SEARCH & BROWSE ### +>Search==>Поиск +Web Search==Веб-поиск +File Search==Поиск файла +Search & Browse==Настройка & обзор +Search Page==Страница поиска +Rich Client Search==Rich Client Suche +Interactive local Search==Interaktive lokale Suche +Compare Search==Сравнить поиск +Ranking Config==Ranking Einstellungen +Browse==Обзор +>Surftips==>Советы +Local Peer Wiki==Локальный Wiki +>Bookmarks==>Закладки +>Help==>Помощь +### INDEX CONTROL ### +Index Production==Индексирование +Index Control==Index Kontrolle +Index Creation==Создание индекса +Crawler Monitor==Монитор сканирования +Crawl Results==Результат сканирования +Crawler / Harvester==Сканирование / Сбор +Creation Monitor==Монитор сканирования +Index Administration==Администрирование индекса +Filter & Blacklists==Фильтр & Черный список +### SEARCH INTEGRATION ### +Search Integration==Настройка поисковика +Search Portals==Such Portale +Customization==Anpassungen +### MONITORING ### +Monitoring==Мониторинг +Network Access==Доступ к сети +YaCy Network==YaCy сеть +Web Visualization==Веб визуализация +Access Tracker==Zugriffe +#Server Log==Server Log +>Messages==>Сообщения +#>Terminal==>Terminal +"New Messages"=="Новые сообщения" +### PEER CONTROL +Peer Control==Управление пиром +Admin Console==Консоль администратора +>API Action Steering<==>Руководство по API< +Confirm Restart==Подтвердить перезапуск +Re-Start==Перезапустить +Confirm Shutdown==Подтвердить выключение +>Shutdown==>Выключить +### THE PROJECT ### +The Project==Проект +Project Home==Домашная страница +Deutsches Forum==Форум на Немецком +English Forum==Форум на Английском +YaCy Project Wiki==Wiki сайт проекта YaCy +# Development Change Log==Entwicklung Änderungshistorie +amp;language=en==amp;язык=de +Development Change Log==Entwicklung Changelog +Peer Statistics::YaCy Statistics==Peer Statistiken::YaCy Statistiken +#----------------------------- +#File: env/templates/simpleheader.template +#--------------------------- +Administration<==Администрирование< +>Web Search<==>Веб поиск< +>Search Network<==>Поиск сети< +Peer Owner Profile==Профиль владельца пира +Help / YaCy Wiki==Помощь / YaCy Wiki +#----------------------------- +#File: env/templates/submenuAccessTracker.template +#--------------------------- +Access Tracker==Zugriffe +Server Access==Server-Zugriff +Overview==Überblick +#Details==Details +Connections==Verbindungen +Local Search==Lokale Suche +#Log==Log +#Host Tracker==Host Tracker +Remote Search==Remote Suche +#----------------------------- +#File: env/templates/submenuBlacklist.template +#--------------------------- +Filter & Blacklists==Filter & Sperrlisten +Blacklist Administration==Blacklist Verwaltung +Blacklist Cleaner==Blacklist aufräumen +Blacklist Test==Blacklist testen +Import/Export==Import / Export +Index Cleaner==Index Aufräumer +#----------------------------- +#File: env/templates/submenuConfig.template +#--------------------------- +Peer Administration Console==Консоль администрирования пира +Status<==Статус< +Basic Configuration==Основная конфигурация +>Accounts==>Учетные записи +Network Configuration==Конфигурация сети +>Heuristics<==>Эвристика< +Dictionary Loader==Загрузка словоря +System Update==Обновление системы +>Performance==>Производительность +Advanced Settings==Расширенные настройки +Parser Configuration==Конфигурация обработки +Local robots.txt==Локальный robots.txt +Web Cache==Веб кэш +Advanced Properties==Расширенные настройки +#----------------------------- +#File: env/templates/submenuContentIntegration.template +#--------------------------- +External Content Integration==Integration von externen Inhalten +Import phpBB3 forum==Importiere phpBB3 Forum +Import Mediawiki dumps==Importiere Mediawiki Dumps +Import OAI-PMH Sources==Importiere OAI-PMH Quellen +#----------------------------- +#File: env/templates/submenuCookie.template +#--------------------------- +Cookie Menu==Меню куки +Incoming Cookies==Входящие куки +Outgoing Cookies==Исходящие куки +#----------------------------- +#File: env/templates/submenuCrawlMonitor.template +#--------------------------- +Web Crawler==Сканер веб +Processing Monitor==Монитор процессов +Crawler Queues==Запросы сканирования +Loader<==Загрузчик< +Rejected URLs==Отклоненные URL адреса +>Queues<==>Очередь< +Local<==Локально< +Global==Глобально +Remote==Удаленный +Crawl Results==Результаты сканирования +Overview==Обзор +Receipts==Прием +Queries==Запросы +DHT Transfer==DHT пересылка +Proxy Use==Использование прокси +Local Crawling==Локальное сканирование +Global Crawling==Глобальное сканирование +Surrogate Import==Сурогатный испорт +Crawler Steering==Управление сканированием +Scheduler and Profile Editor<==Расписание и Редактор профиля< +robots.txt Monitor==Монитор robots.txt +#----------------------------- +#File: env/templates/submenuCustomization.template +#--------------------------- +Customization==Anpassung +>Appearance==>Erscheinungsbild +User Profile==Benutzerprofil +>Language==>Язык +#----------------------------- +#File: env/templates/submenuIndexControl.template +#--------------------------- +Index Administration==Indexverwaltung +Reverse Word Index Administration==Reverse Wort Indexverwaltung +URL References Database==URL Referenzen Datenbank +URL Viewer==URL Betrachter +#----------------------------- +#File: env/templates/submenuIndexCreate.template +#--------------------------- +#Web Crawler Control==Web Crawler Steuerung +#Start a Web Crawl==Starte einen Web Crawl +#Crawl Start==Crawl starten +#Crawl Profile Editor==Crawl Profil Editor +#Crawler Queues==Crawler Puffer +#Indexing<==Indexierung< +#Loader<==Lader< +#URLs to be processed==zu verarbeitende URLs +#Processing Queues==Warteschlangen +#Local<==Lokal< +#Global<==Global< +#Remote<==Remote< +#Overhang<==Überhang< +#Media Crawl Queues==Medien Crawl-Puffer +#>Images==>Картинки +#>Movies==>Фильмы +#>Music==>Музыка +#--- New menu items --- +Index Creation==Индексирование +Crawler/Spider<==Сбор/Паук< +Full Site Crawl==Полное сканирование сайта +Sitemap Loader==Sitemap Lader +Crawl Start
    \(Expert\)==Запуск сканирования
    (Эксперт) +Network
    Scanner==Сетевой
    сканер +#>Intranet
    Scanner<==>Интернет
    сканер< +Crawling of==Сканирование +#MediaWikis==MediaWikis +>phpBB3 Forums<==>phpBB3 форумы< +Content Import<==Импорт контента< +Network Harvesting<==Сеть сбора< +#Remote
    Crawling==Remote
    Crawling +#Scraping
    Proxy==Scraping
    Proxy +Database Reader<==Обозреватель БД< +for phpBB3 Forums==для форумов phpBB3 +Dump Reader for==Dump Leser für +#MediaWiki dumps==MediaWiki дамп +#----------------------------- +#File: env/templates/submenuPortalIntegration.template +#--------------------------- +Search Portal Integration==Интеграция портала поиска +Live Search Anywhere==Живой поиск везде +Generic Search Portal==Общий поисковый портал +Search Box Anywhere==Поле поиска везде +Appearance==Внешний вид +User Profile==Профиль пользователя +Language<==Язык< +Ranking Config==Конфигурация рейтинга +#----------------------------- +#File: env/templates/submenuPublication.template +#--------------------------- +Publication==Veröffentlichung +#Wiki==Wiki +#Blog==Blog +File Hosting==Datei Freigabe +#----------------------------- +#File: env/templates/submenuViewLog.template +#--------------------------- +Server Log Menu==Server Log Menü +#Server Log==Server Log +#----------------------------- +#File: env/templates/submenuWebStructure.template +#--------------------------- +Web Visualization==Internet Visualisierung +Web Structure==Internet Struktur +Image Collage==Bilder Collage +#----------------------------- +#File: proxymsg/authfail.inc +#--------------------------- +Your Username/Password is wrong.==Логин и/или пароль не верный. +Username==Логин +Password==Пароль +"login"=="логин" +#----------------------------- +#File: proxymsg/error.html +#--------------------------- +YaCy: Error Message==YaCy: Fehlermeldung +request:==Anfrage: +unspecified error==unspezifizierter Fehler +not-yet-assigned error==noch nicht vergebener Fehler +You don't have an active internet connection. Please go online.==Sie haben keine aktive Internetverbindung. Bitte gehen Sie online. +Could not load resource. The file is not available.==Datei konnte nicht geladen werden. Die Datei ist nicht vorhanden. +Exception occurred==Dieser Fehler trat auf +Generated \#\[date\]\# by==Erstellt am #[date]# von +#----------------------------- +#File: proxymsg/proxylimits.inc +#--------------------------- +Your Account is disabled for surfing.==Ihr Account ist deaktivert zum surfen. +Your Timelimit \(\#\[timelimit\]\# Minutes per Day\) is reached.==Ihr Zeitlimit (#[timelimit]# Minuten am Tag) wurde erreicht. +#----------------------------- +#File: proxymsg/unknownHost.inc +#--------------------------- +The server==Сервер +could not be found.==не найден. +Did you mean:==Meinten Sie vielleicht: +#----------------------------- +#File: www/welcome.html +#--------------------------- +YaCy: Default Page for Individual Peer Content==YACY: Standardseite für eigene Peer-Inhalte +Individual Web Page==eigene Webseite +Welcome to your own web page
    in the YaCy Network==Willkommen auf Ihrer eigenen Webseite
    im YaCy-Netzwerk +THIS IS A DEMONSTRATION PAGE FOR YOUR OWN INDIVIDUAL WEB SERVER!==DIES IST EINE DEMONSTRATIONSSEITE FÜR IHREN EIGENEN WEB SERVER! +PLEASE REPLACE THIS PAGE BY PUTTING A FILE index.html INTO THE PATH==BITTE ERSETZEN SIE DIESE SEITE, INDEM SIE EINE DATEI MIT DEM NAMEN index.html IM VERZEICHNIS +<YaCy-application-home>\#\[wwwpath\]\#==<YaCy-Programmpfad>#[wwwpath]# ABLEGEN. +#----------------------------- +#File: js/Crawler.js +#--------------------------- +"Continue this queue"=="Diese Queue weiter abarbeiten" +"Pause this queue"=="Diese Queue anhalten" +#----------------------------- +#File: js/yacyinteractive.js +#--------------------------- +>total results==>всего в результате + topwords:== Topwörter: +>Name==>Имя +>Size==>Размер +>Date==>Дата +#----------------------------- +#File: yacy/ui/js/jquery-flexigrid.js +#--------------------------- +'Displaying \{from\} to \{to\} of \{total}\ items'=='Zeige {from} bis {to} von {total} Elementen' +'Processing, please wait ...'=='In Bearbeitung. Bitte warten ...' +'No items'=='Keine Elemente' +#----------------------------- +#File: yacy/ui/js/jquery-ui-1.7.2.min.js +#--------------------------- +Loading…==Lade… +#----------------------------- +#File: yacy/ui/js/jquery.ui.all.min.js +#--------------------------- +Loading…==Lade… +#----------------------------- +#File: yacy/ui/index.html +#--------------------------- +About YaCy-UI==Über YaCy-UI +Admin Console==Admin Konsole +"Bookmarks"=="Lesezeichen" +>Bookmarks==>Lesezeichen +#Server Log==Server Log +#----------------------------- +#File: yacy/ui/yacyui-admin.html +#--------------------------- +Peer Control==Peer +"Login"=="Login" +#Login==Anmelden +Themes==Aussehen +Messages==Nachrichten +Re-Start==Neustart +Shutdown==Beenden +Web Indexing==Web Indexierung +Crawl Start==Crawl starten +Monitoring==Überwachung +YaCy Network==YaCy Netzwerk +>Settings==>Einstellungen +"Basic Settings"=="Eingangskonfiguration" +\tBasic==Basis +Accounts==Konten +"Network"=="Netzwerk" +\tNetwork==Netzwerk +"Advanced Settings"=="Erweiterte Einstellungen" +\tAdvanced==Erweitert +"Update Settings"=="System Aktualisierung" +\tUpdate==Aktualisierung +>YaCy Project==>YaCy Projekt +"YaCy Project Home"=="YaCy Projekt Homepage" +\tProject==Projekt +"YaCy Statistics"=="YaCy Statistiken" +\tStatistics==Statistiken +"YaCy Forum"=="YaCy форум" +#Forum==Forum +"Help"=="Hilfe" +#"YaCy Wiki"=="YaCy Wiki" +#Wiki==Wiki +#----------------------------- +#File: yacy/ui/yacyui-bookmarks.html +#--------------------------- +'Add'=='Hinzufügen' +'Crawl'=='Crawlen' +'Edit'=='Bearbeiten' +'Delete'=='Löschen' +'Rename'=='Umbenennen' +'Help'=='Hilfe' + +#"public bookmark"=="öffentliches Lesezeichen" +#"private bookmark"=="privates Lesezeichen" + +#"delete bookmark"=="Lesezeichen löschen" +"YaCy Bookmarks"=="YaCy Lesezeichen" +#>Title==>Titel +#>Tags==>Tags +#>Date==>Datum +#'Hash'=='Hash' +'Public'=='Öffentlich' +'Title'=='Titel' +#'Tags'=='Tags' +'Folders'=='Ordner' +'Date'=='Datum' +#----------------------------- +#File: yacy/ui/sidebar/sidebar_1.html +#--------------------------- +YaCy P2P Websearch==YaCy P2P Websuche +"Search"=="Suchen" +>Text==>Text +>Images==>Bilder +>Audio==>Audio +>Video==>Videos +>Applications==>Anwendungen +Search term:==Suchbegriff: +"help"=="Hilfe" +Resource/Network:==Ressource/Netzwerk: +freeworld==freeworld +local peer==локальный пир +>bookmarks==>Lesezeichen +sciencenet==ScienceNet +>Language:==>Язык: +any language==jede Sprache +Bookmark Folders==Lesezeichen Ordner +#----------------------------- +#File: yacy/ui/sidebar/sidebar_2.html +#--------------------------- +Bookmark Tags<==Lesezeichen Tags< +Search Options==Suchoptionen +Constraint:==Einschränkungen: +all pages==alle Seiten +index pages==Index Seiten +URL mask:==URL Filter: +Prefer mask:==Vorzugsmaske: +Bookmark TagCloud==Lesezeichen TagWolke +Topwords<==Top Wörter< +alt="help"==alt="Hilfe" +title="help"==title="Hilfe" +#----------------------------- +#File: yacy/ui/yacyui-welcome.html +#--------------------------- +>Overview==>Übersicht +YaCy-UI is going to be a JavaScript based client for YaCy based on the existing XML and JSON API.==YaCy-UI wird ein in JavaScript geschriebener Client für YaCy, der auf der existierenden XML und JSON API aufbaut. +YaCy-UI is at most alpha status, as there is still problems with retriving the search results.==YaCy-UI ist bestenfalls im Alpha Stadium, da es immer noch Probleme beim Abholen der Suchergebnisse gibt. +I am currently changing the backend to a more application friendly format and getting good results with it \(I will check that in some time after the stable release 0.7\).==Ich ändere gerade das Backend in ein andwendungsfreundlicheres Format und bekomme gute Ergebnisse damit (Ich werde die Änderungen einige Zeit nach der Veröffentlichung der stabilen Version 0.7 einchecken). +For now have a look at the bookmarks, performance has increased significantly, due to the use of JSON and Flexigrid!==Aktuell können Sie sich die Lesezeichen ansehen - Die Performance hat sich signifikant gebessert durch die Verwendung von JSON und Flexigrid! +#----------------------------- + +# EOF \ No newline at end of file diff --git a/source/de/anomic/crawler/Balancer.java b/source/de/anomic/crawler/Balancer.java index 3e27dd0cc..8afb9eb6a 100644 --- a/source/de/anomic/crawler/Balancer.java +++ b/source/de/anomic/crawler/Balancer.java @@ -41,6 +41,7 @@ import java.util.concurrent.ConcurrentMap; import net.yacy.cora.document.ASCII; import net.yacy.cora.document.UTF8; +import net.yacy.cora.order.CloneableIterator; import net.yacy.cora.services.federated.yacy.CacheStrategy; import net.yacy.kelondro.data.meta.URIMetadataRow; import net.yacy.kelondro.index.BufferedObjectIndex; @@ -49,7 +50,6 @@ import net.yacy.kelondro.index.Row; import net.yacy.kelondro.index.RowSpaceExceededException; import net.yacy.kelondro.logging.Log; import net.yacy.kelondro.order.Base64Order; -import net.yacy.kelondro.order.CloneableIterator; import net.yacy.kelondro.table.Table; import net.yacy.kelondro.util.ByteBuffer; import net.yacy.kelondro.util.MemoryControl; diff --git a/source/de/anomic/crawler/ResultURLs.java b/source/de/anomic/crawler/ResultURLs.java index 78e63db13..0eeb89c79 100644 --- a/source/de/anomic/crawler/ResultURLs.java +++ b/source/de/anomic/crawler/ResultURLs.java @@ -34,8 +34,8 @@ import java.util.concurrent.ConcurrentHashMap; import net.yacy.cora.document.ASCII; import net.yacy.cora.document.UTF8; -import net.yacy.cora.ranking.ClusteredScoreMap; -import net.yacy.cora.ranking.ScoreMap; +import net.yacy.cora.sorting.ClusteredScoreMap; +import net.yacy.cora.sorting.ScoreMap; import net.yacy.kelondro.data.meta.DigestURI; import net.yacy.kelondro.data.meta.URIMetadataRow; import net.yacy.kelondro.logging.Log; @@ -115,7 +115,7 @@ public final class ResultURLs { try { final ScoreMap domains = getDomains(stackType); if (domains != null) { - domains.inc(e.metadata().url().getHost()); + domains.inc(e.url().getHost()); } } catch (final Exception ex) { System.out.println("INTERNAL ERROR in newEntry/3: " + ex.toString()); diff --git a/source/de/anomic/data/DidYouMean.java b/source/de/anomic/data/DidYouMean.java index c8de2f564..e6ae07c8f 100644 --- a/source/de/anomic/data/DidYouMean.java +++ b/source/de/anomic/data/DidYouMean.java @@ -7,8 +7,8 @@ import java.util.SortedSet; import java.util.TreeSet; import java.util.concurrent.LinkedBlockingQueue; -import net.yacy.cora.ranking.ClusteredScoreMap; -import net.yacy.cora.ranking.ReversibleScoreMap; +import net.yacy.cora.sorting.ClusteredScoreMap; +import net.yacy.cora.sorting.ReversibleScoreMap; import net.yacy.document.LibraryProvider; import net.yacy.document.StringBuilderComparator; import net.yacy.kelondro.data.word.Word; diff --git a/source/de/anomic/data/UserDB.java b/source/de/anomic/data/UserDB.java index f7bfae34b..a794cc995 100644 --- a/source/de/anomic/data/UserDB.java +++ b/source/de/anomic/data/UserDB.java @@ -37,12 +37,12 @@ import java.util.Map; import java.util.Random; import net.yacy.cora.document.UTF8; +import net.yacy.cora.order.CloneableIterator; import net.yacy.cora.protocol.RequestHeader; import net.yacy.kelondro.blob.MapHeap; import net.yacy.kelondro.index.RowSpaceExceededException; import net.yacy.kelondro.logging.Log; import net.yacy.kelondro.order.Base64Order; -import net.yacy.kelondro.order.CloneableIterator; import net.yacy.kelondro.order.Digest; import net.yacy.kelondro.order.NaturalOrder; import net.yacy.kelondro.util.FileUtils; diff --git a/source/de/anomic/data/ymark/YMarkMetadata.java b/source/de/anomic/data/ymark/YMarkMetadata.java index 68b1a3752..cd05270a6 100644 --- a/source/de/anomic/data/ymark/YMarkMetadata.java +++ b/source/de/anomic/data/ymark/YMarkMetadata.java @@ -81,7 +81,7 @@ public class YMarkMetadata { public YMarkMetadata(final byte[] urlHash, final Segments indexSegment) { this.document = null; this.indexSegment = indexSegment; - this.uri = this.indexSegment.segment(Segments.Process.PUBLIC).urlMetadata().load(urlHash).metadata().url(); + this.uri = this.indexSegment.segment(Segments.Process.PUBLIC).urlMetadata().load(urlHash).url(); } public YMarkMetadata(final Document document) { @@ -115,14 +115,10 @@ public class YMarkMetadata { metadata.put(METADATA.WORDCOUNT, String.valueOf(urlEntry.wordCount())); metadata.put(METADATA.MIMETYPE, String.valueOf(urlEntry.doctype())); metadata.put(METADATA.LANGUAGE, UTF8.String(urlEntry.language())); - - final URIMetadataRow.Components meta = urlEntry.metadata(); - if (meta != null) { - metadata.put(METADATA.TITLE, meta.dc_title()); - metadata.put(METADATA.CREATOR, meta.dc_creator()); - metadata.put(METADATA.KEYWORDS, meta.dc_subject()); - metadata.put(METADATA.PUBLISHER, meta.dc_publisher()); - } + metadata.put(METADATA.TITLE, urlEntry.dc_title()); + metadata.put(METADATA.CREATOR, urlEntry.dc_creator()); + metadata.put(METADATA.KEYWORDS, urlEntry.dc_subject()); + metadata.put(METADATA.PUBLISHER, urlEntry.dc_publisher()); } return metadata; } diff --git a/source/net/yacy/cora/language/phonetic/ColognePhonetic.java b/source/net/yacy/cora/language/phonetic/ColognePhonetic.java new file mode 100644 index 000000000..be37e2035 --- /dev/null +++ b/source/net/yacy/cora/language/phonetic/ColognePhonetic.java @@ -0,0 +1,429 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package net.yacy.cora.language.phonetic; + +import java.util.Locale; + +import org.apache.commons.codec.EncoderException; +import org.apache.commons.codec.StringEncoder; + +/** + *

    + * Encodes a string into a Cologne Phonetic value. + *

    + *

    + * Implements the Kölner Phonetik (Cologne Phonetic) + * algorithm issued by Hans Joachim Postel in 1969. + *

    + * + *

    + * The Kölner Phonetik is a phonetic algorithm which is optimized for the German language. It is related to the + * well-known soundex algorithm. + *

    + * + *

    Algorithm

    + * + *
      + * + *
    • + *

      Step 1:

      + * After preprocessing (conversion to upper case, transcription of germanic umlauts, removal of non alphabetical characters) the + * letters of the supplied text are replaced by their phonetic code according to the following table. + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
      LetterContextCode
      A, E, I, J, O, U, Y0
      H-
      B1
      Pnot before H
      D, Tnot before C, S, Z2
      F, V, W3
      Pbefore H
      G, K, Q4
      Cat onset before A, H, K, L, O, Q, R, U, X
      before A, H, K, O, Q, U, X except after S, Z
      Xnot after C, K, Q48
      L5
      M, N6
      R7
      S, Z8
      Cafter S, Z
      at onset except before A, H, K, L, O, Q, R, U, X
      not before A, H, K, O, Q, U, X
      D, Tbefore C, S, Z
      Xafter C, K, Q
      + *

      + * (Source: Wikipedia (de): + * Kölner Phonetik -- Buchstabencodes) + *

      + * + *

      Example:

      + * + * {@code "M}ü{@code ller-L}ü{@code denscheidt" => "MULLERLUDENSCHEIDT" => "6005507500206880022"} + * + *
    • + * + *
    • + *

      Step 2:

      + * Collapse of all multiple consecutive code digits. + *

      Example:

      + * {@code "6005507500206880022" => "6050750206802"}
    • + * + *
    • + *

      Step 3:

      + * Removal of all codes "0" except at the beginning. This means that two or more identical consecutive digits can occur + * if they occur after removing the "0" digits. + * + *

      Example:

      + * {@code "6050750206802" => "65752682"}
    • + * + *
    + * + * @see Wikipedia (de): Kölner Phonetik (in German) + * @author Apache Software Foundation + * @since 1.5 + */ +public class ColognePhonetic implements StringEncoder { + + private abstract class CologneBuffer { + + protected final char[] data; + + protected int length = 0; + + public CologneBuffer(char[] data) { + this.data = data; + this.length = data.length; + } + + public CologneBuffer(int buffSize) { + this.data = new char[buffSize]; + this.length = 0; + } + + protected abstract char[] copyData(int start, final int length); + + public int length() { + return length; + } + + @Override + public String toString() { + return new String(copyData(0, length)); + } + } + + private class CologneOutputBuffer extends CologneBuffer { + + public CologneOutputBuffer(int buffSize) { + super(buffSize); + } + + public void addRight(char chr) { + data[length] = chr; + length++; + } + + @Override + protected char[] copyData(int start, final int length) { + char[] newData = new char[length]; + System.arraycopy(data, start, newData, 0, length); + return newData; + } + } + + private class CologneInputBuffer extends CologneBuffer { + + public CologneInputBuffer(char[] data) { + super(data); + } + + public void addLeft(char ch) { + length++; + data[getNextPos()] = ch; + } + + @Override + protected char[] copyData(int start, final int length) { + char[] newData = new char[length]; + System.arraycopy(data, data.length - this.length + start, newData, 0, length); + return newData; + } + + public char getNextChar() { + return data[getNextPos()]; + } + + protected int getNextPos() { + return data.length - length; + } + + public char removeNext() { + char ch = getNextChar(); + length--; + return ch; + } + } + + /** + * Maps some Germanic characters to plain for internal processing. The following characters are mapped: + *
      + *
    • capital a, umlaut mark
    • + *
    • capital u, umlaut mark
    • + *
    • capital o, umlaut mark
    • + *
    • small sharp s, German
    • + *
    + */ + private static final char[][] PREPROCESS_MAP = new char[][]{ + {'\u00C4', 'A'}, // capital a, umlaut mark + {'\u00DC', 'U'}, // capital u, umlaut mark + {'\u00D6', 'O'}, // capital o, umlaut mark + {'\u00DF', 'S'} // small sharp s, German + }; + + /* + * Returns whether the array contains the key, or not. + */ + private static boolean arrayContains(char[] arr, char key) { + for (char element : arr) { + if (element == key) { + return true; + } + } + return false; + } + + /** + *

    + * Implements the Kölner Phonetik algorithm. + *

    + *

    + * In contrast to the initial description of the algorithm, this implementation does the encoding in one pass. + *

    + * + * @param text + * @return the corresponding encoding according to the Kölner Phonetik algorithm + */ + public String colognePhonetic(String text) { + if (text == null) { + return null; + } + + text = preprocess(text); + + CologneOutputBuffer output = new CologneOutputBuffer(text.length() * 2); + CologneInputBuffer input = new CologneInputBuffer(text.toCharArray()); + + char nextChar; + + char lastChar = '-'; + char lastCode = '/'; + char code; + char chr; + + int rightLength = input.length(); + + while (rightLength > 0) { + chr = input.removeNext(); + + if ((rightLength = input.length()) > 0) { + nextChar = input.getNextChar(); + } else { + nextChar = '-'; + } + + if (arrayContains(new char[]{'A', 'E', 'I', 'J', 'O', 'U', 'Y'}, chr)) { + code = '0'; + } else if (chr == 'H' || chr < 'A' || chr > 'Z') { + if (lastCode == '/') { + continue; + } + code = '-'; + } else if (chr == 'B' || (chr == 'P' && nextChar != 'H')) { + code = '1'; + } else if ((chr == 'D' || chr == 'T') && !arrayContains(new char[]{'S', 'C', 'Z'}, nextChar)) { + code = '2'; + } else if (arrayContains(new char[]{'W', 'F', 'P', 'V'}, chr)) { + code = '3'; + } else if (arrayContains(new char[]{'G', 'K', 'Q'}, chr)) { + code = '4'; + } else if (chr == 'X' && !arrayContains(new char[]{'C', 'K', 'Q'}, lastChar)) { + code = '4'; + input.addLeft('S'); + rightLength++; + } else if (chr == 'S' || chr == 'Z') { + code = '8'; + } else if (chr == 'C') { + if (lastCode == '/') { + if (arrayContains(new char[]{'A', 'H', 'K', 'L', 'O', 'Q', 'R', 'U', 'X'}, nextChar)) { + code = '4'; + } else { + code = '8'; + } + } else { + if (arrayContains(new char[]{'S', 'Z'}, lastChar) || + !arrayContains(new char[]{'A', 'H', 'O', 'U', 'K', 'Q', 'X'}, nextChar)) { + code = '8'; + } else { + code = '4'; + } + } + } else if (arrayContains(new char[]{'T', 'D', 'X'}, chr)) { + code = '8'; + } else if (chr == 'R') { + code = '7'; + } else if (chr == 'L') { + code = '5'; + } else if (chr == 'M' || chr == 'N') { + code = '6'; + } else { + code = chr; + } + + if (code != '-' && (lastCode != code && (code != '0' || lastCode == '/') || code < '0' || code > '8')) { + output.addRight(code); + } + + lastChar = chr; + lastCode = code; + } + return output.toString(); + } + + public Object encode(Object object) throws EncoderException { + if (!(object instanceof String)) { + throw new EncoderException("This method's parameter was expected to be of the type " + + String.class.getName() + + ". But actually it was of the type " + + object.getClass().getName() + + "."); + } + return encode((String) object); + } + + public String encode(String text) { + return colognePhonetic(text); + } + + public boolean isEncodeEqual(String text1, String text2) { + return colognePhonetic(text1).equals(colognePhonetic(text2)); + } + + /** + * Converts the string to upper case and replaces germanic characters as defined in {@link #PREPROCESS_MAP}. + */ + private String preprocess(String text) { + text = text.toUpperCase(Locale.GERMAN); + + char[] chrs = text.toCharArray(); + + for (int index = 0; index < chrs.length; index++) { + if (chrs[index] > 'Z') { + for (char[] element : PREPROCESS_MAP) { + if (chrs[index] == element[0]) { + chrs[index] = element[1]; + break; + } + } + } + } + return new String(chrs); + } +} diff --git a/source/net/yacy/cora/language/phonetic/DoubleMetaphone.java b/source/net/yacy/cora/language/phonetic/DoubleMetaphone.java new file mode 100644 index 000000000..1ccbf73c2 --- /dev/null +++ b/source/net/yacy/cora/language/phonetic/DoubleMetaphone.java @@ -0,0 +1,1105 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package net.yacy.cora.language.phonetic; + +import org.apache.commons.codec.EncoderException; +import org.apache.commons.codec.StringEncoder; + +/** + * Encodes a string into a double metaphone value. + * This Implementation is based on the algorithm by Lawrence Philips. + * + * + * @author Apache Software Foundation + * @version $Id: DoubleMetaphone.java 1157192 2011-08-12 17:27:38Z ggregory $ + */ +public class DoubleMetaphone implements StringEncoder { + + /** + * "Vowels" to test for + */ + private static final String VOWELS = "AEIOUY"; + + /** + * Prefixes when present which are not pronounced + */ + private static final String[] SILENT_START = + { "GN", "KN", "PN", "WR", "PS" }; + private static final String[] L_R_N_M_B_H_F_V_W_SPACE = + { "L", "R", "N", "M", "B", "H", "F", "V", "W", " " }; + private static final String[] ES_EP_EB_EL_EY_IB_IL_IN_IE_EI_ER = + { "ES", "EP", "EB", "EL", "EY", "IB", "IL", "IN", "IE", "EI", "ER" }; + private static final String[] L_T_K_S_N_M_B_Z = + { "L", "T", "K", "S", "N", "M", "B", "Z" }; + + /** + * Maximum length of an encoding, default is 4 + */ + private int maxCodeLen = 4; + + /** + * Creates an instance of this DoubleMetaphone encoder + */ + public DoubleMetaphone() { + super(); + } + + /** + * Encode a value with Double Metaphone + * + * @param value String to encode + * @return an encoded string + */ + public String doubleMetaphone(String value) { + return doubleMetaphone(value, false); + } + + /** + * Encode a value with Double Metaphone, optionally using the alternate + * encoding. + * + * @param value String to encode + * @param alternate use alternate encode + * @return an encoded string + */ + public String doubleMetaphone(String value, boolean alternate) { + value = cleanInput(value); + if (value == null) { + return null; + } + + boolean slavoGermanic = isSlavoGermanic(value); + int index = isSilentStart(value) ? 1 : 0; + + DoubleMetaphoneResult result = new DoubleMetaphoneResult(this.getMaxCodeLen()); + + while (!result.isComplete() && index <= value.length() - 1) { + switch (value.charAt(index)) { + case 'A': + case 'E': + case 'I': + case 'O': + case 'U': + case 'Y': + index = handleAEIOUY(result, index); + break; + case 'B': + result.append('P'); + index = charAt(value, index + 1) == 'B' ? index + 2 : index + 1; + break; + case '\u00C7': + // A C with a Cedilla + result.append('S'); + index++; + break; + case 'C': + index = handleC(value, result, index); + break; + case 'D': + index = handleD(value, result, index); + break; + case 'F': + result.append('F'); + index = charAt(value, index + 1) == 'F' ? index + 2 : index + 1; + break; + case 'G': + index = handleG(value, result, index, slavoGermanic); + break; + case 'H': + index = handleH(value, result, index); + break; + case 'J': + index = handleJ(value, result, index, slavoGermanic); + break; + case 'K': + result.append('K'); + index = charAt(value, index + 1) == 'K' ? index + 2 : index + 1; + break; + case 'L': + index = handleL(value, result, index); + break; + case 'M': + result.append('M'); + index = conditionM0(value, index) ? index + 2 : index + 1; + break; + case 'N': + result.append('N'); + index = charAt(value, index + 1) == 'N' ? index + 2 : index + 1; + break; + case '\u00D1': + // N with a tilde (spanish ene) + result.append('N'); + index++; + break; + case 'P': + index = handleP(value, result, index); + break; + case 'Q': + result.append('K'); + index = charAt(value, index + 1) == 'Q' ? index + 2 : index + 1; + break; + case 'R': + index = handleR(value, result, index, slavoGermanic); + break; + case 'S': + index = handleS(value, result, index, slavoGermanic); + break; + case 'T': + index = handleT(value, result, index); + break; + case 'V': + result.append('F'); + index = charAt(value, index + 1) == 'V' ? index + 2 : index + 1; + break; + case 'W': + index = handleW(value, result, index); + break; + case 'X': + index = handleX(value, result, index); + break; + case 'Z': + index = handleZ(value, result, index, slavoGermanic); + break; + default: + index++; + break; + } + } + + return alternate ? result.getAlternate() : result.getPrimary(); + } + + /** + * Encode the value using DoubleMetaphone. It will only work if + * obj is a String (like Metaphone). + * + * @param obj Object to encode (should be of type String) + * @return An encoded Object (will be of type String) + * @throws EncoderException encode parameter is not of type String + */ + public Object encode(Object obj) throws EncoderException { + if (!(obj instanceof String)) { + throw new EncoderException("DoubleMetaphone encode parameter is not of type String"); + } + return doubleMetaphone((String) obj); + } + + /** + * Encode the value using DoubleMetaphone. + * + * @param value String to encode + * @return An encoded String + */ + public String encode(String value) { + return doubleMetaphone(value); + } + + /** + * Check if the Double Metaphone values of two String values + * are equal. + * + * @param value1 The left-hand side of the encoded {@link String#equals(Object)}. + * @param value2 The right-hand side of the encoded {@link String#equals(Object)}. + * @return true if the encoded Strings are equal; + * false otherwise. + * @see #isDoubleMetaphoneEqual(String,String,boolean) + */ + public boolean isDoubleMetaphoneEqual(String value1, String value2) { + return isDoubleMetaphoneEqual(value1, value2, false); + } + + /** + * Check if the Double Metaphone values of two String values + * are equal, optionally using the alternate value. + * + * @param value1 The left-hand side of the encoded {@link String#equals(Object)}. + * @param value2 The right-hand side of the encoded {@link String#equals(Object)}. + * @param alternate use the alternate value if true. + * @return true if the encoded Strings are equal; + * false otherwise. + */ + public boolean isDoubleMetaphoneEqual(String value1, + String value2, + boolean alternate) { + return doubleMetaphone(value1, alternate).equals(doubleMetaphone + (value2, alternate)); + } + + /** + * Returns the maxCodeLen. + * @return int + */ + public int getMaxCodeLen() { + return this.maxCodeLen; + } + + /** + * Sets the maxCodeLen. + * @param maxCodeLen The maxCodeLen to set + */ + public void setMaxCodeLen(int maxCodeLen) { + this.maxCodeLen = maxCodeLen; + } + + //-- BEGIN HANDLERS --// + + /** + * Handles 'A', 'E', 'I', 'O', 'U', and 'Y' cases + */ + private int handleAEIOUY(DoubleMetaphoneResult result, int + index) { + if (index == 0) { + result.append('A'); + } + return index + 1; + } + + /** + * Handles 'C' cases + */ + private int handleC(String value, + DoubleMetaphoneResult result, + int index) { + if (conditionC0(value, index)) { // very confusing, moved out + result.append('K'); + index += 2; + } else if (index == 0 && contains(value, index, 6, "CAESAR")) { + result.append('S'); + index += 2; + } else if (contains(value, index, 2, "CH")) { + index = handleCH(value, result, index); + } else if (contains(value, index, 2, "CZ") && + !contains(value, index - 2, 4, "WICZ")) { + //-- "Czerny" --// + result.append('S', 'X'); + index += 2; + } else if (contains(value, index + 1, 3, "CIA")) { + //-- "focaccia" --// + result.append('X'); + index += 3; + } else if (contains(value, index, 2, "CC") && + !(index == 1 && charAt(value, 0) == 'M')) { + //-- double "cc" but not "McClelland" --// + return handleCC(value, result, index); + } else if (contains(value, index, 2, "CK", "CG", "CQ")) { + result.append('K'); + index += 2; + } else if (contains(value, index, 2, "CI", "CE", "CY")) { + //-- Italian vs. English --// + if (contains(value, index, 3, "CIO", "CIE", "CIA")) { + result.append('S', 'X'); + } else { + result.append('S'); + } + index += 2; + } else { + result.append('K'); + if (contains(value, index + 1, 2, " C", " Q", " G")) { + //-- Mac Caffrey, Mac Gregor --// + index += 3; + } else if (contains(value, index + 1, 1, "C", "K", "Q") && + !contains(value, index + 1, 2, "CE", "CI")) { + index += 2; + } else { + index++; + } + } + + return index; + } + + /** + * Handles 'CC' cases + */ + private int handleCC(String value, + DoubleMetaphoneResult result, + int index) { + if (contains(value, index + 2, 1, "I", "E", "H") && + !contains(value, index + 2, 2, "HU")) { + //-- "bellocchio" but not "bacchus" --// + if ((index == 1 && charAt(value, index - 1) == 'A') || + contains(value, index - 1, 5, "UCCEE", "UCCES")) { + //-- "accident", "accede", "succeed" --// + result.append("KS"); + } else { + //-- "bacci", "bertucci", other Italian --// + result.append('X'); + } + index += 3; + } else { // Pierce's rule + result.append('K'); + index += 2; + } + + return index; + } + + /** + * Handles 'CH' cases + */ + private int handleCH(String value, + DoubleMetaphoneResult result, + int index) { + if (index > 0 && contains(value, index, 4, "CHAE")) { // Michael + result.append('K', 'X'); + return index + 2; + } else if (conditionCH0(value, index)) { + //-- Greek roots ("chemistry", "chorus", etc.) --// + result.append('K'); + return index + 2; + } else if (conditionCH1(value, index)) { + //-- Germanic, Greek, or otherwise 'ch' for 'kh' sound --// + result.append('K'); + return index + 2; + } else { + if (index > 0) { + if (contains(value, 0, 2, "MC")) { + result.append('K'); + } else { + result.append('X', 'K'); + } + } else { + result.append('X'); + } + return index + 2; + } + } + + /** + * Handles 'D' cases + */ + private int handleD(String value, + DoubleMetaphoneResult result, + int index) { + if (contains(value, index, 2, "DG")) { + //-- "Edge" --// + if (contains(value, index + 2, 1, "I", "E", "Y")) { + result.append('J'); + index += 3; + //-- "Edgar" --// + } else { + result.append("TK"); + index += 2; + } + } else if (contains(value, index, 2, "DT", "DD")) { + result.append('T'); + index += 2; + } else { + result.append('T'); + index++; + } + return index; + } + + /** + * Handles 'G' cases + */ + private int handleG(String value, + DoubleMetaphoneResult result, + int index, + boolean slavoGermanic) { + if (charAt(value, index + 1) == 'H') { + index = handleGH(value, result, index); + } else if (charAt(value, index + 1) == 'N') { + if (index == 1 && isVowel(charAt(value, 0)) && !slavoGermanic) { + result.append("KN", "N"); + } else if (!contains(value, index + 2, 2, "EY") && + charAt(value, index + 1) != 'Y' && !slavoGermanic) { + result.append("N", "KN"); + } else { + result.append("KN"); + } + index = index + 2; + } else if (contains(value, index + 1, 2, "LI") && !slavoGermanic) { + result.append("KL", "L"); + index += 2; + } else if (index == 0 && (charAt(value, index + 1) == 'Y' || contains(value, index + 1, 2, ES_EP_EB_EL_EY_IB_IL_IN_IE_EI_ER))) { + //-- -ges-, -gep-, -gel-, -gie- at beginning --// + result.append('K', 'J'); + index += 2; + } else if ((contains(value, index + 1, 2, "ER") || + charAt(value, index + 1) == 'Y') && + !contains(value, 0, 6, "DANGER", "RANGER", "MANGER") && + !contains(value, index - 1, 1, "E", "I") && + !contains(value, index - 1, 3, "RGY", "OGY")) { + //-- -ger-, -gy- --// + result.append('K', 'J'); + index += 2; + } else if (contains(value, index + 1, 1, "E", "I", "Y") || + contains(value, index - 1, 4, "AGGI", "OGGI")) { + //-- Italian "biaggi" --// + if ((contains(value, 0 ,4, "VAN ", "VON ") || contains(value, 0, 3, "SCH")) || contains(value, index + 1, 2, "ET")) { + //-- obvious germanic --// + result.append('K'); + } else if (contains(value, index + 1, 3, "IER")) { + result.append('J'); + } else { + result.append('J', 'K'); + } + index += 2; + } else if (charAt(value, index + 1) == 'G') { + index += 2; + result.append('K'); + } else { + index++; + result.append('K'); + } + return index; + } + + /** + * Handles 'GH' cases + */ + private int handleGH(String value, + DoubleMetaphoneResult result, + int index) { + if (index > 0 && !isVowel(charAt(value, index - 1))) { + result.append('K'); + index += 2; + } else if (index == 0) { + if (charAt(value, index + 2) == 'I') { + result.append('J'); + } else { + result.append('K'); + } + index += 2; + } else if ((index > 1 && contains(value, index - 2, 1, "B", "H", "D")) || + (index > 2 && contains(value, index - 3, 1, "B", "H", "D")) || + (index > 3 && contains(value, index - 4, 1, "B", "H"))) { + //-- Parker's rule (with some further refinements) - "hugh" + index += 2; + } else { + if (index > 2 && charAt(value, index - 1) == 'U' && + contains(value, index - 3, 1, "C", "G", "L", "R", "T")) { + //-- "laugh", "McLaughlin", "cough", "gough", "rough", "tough" + result.append('F'); + } else if (index > 0 && charAt(value, index - 1) != 'I') { + result.append('K'); + } + index += 2; + } + return index; + } + + /** + * Handles 'H' cases + */ + private int handleH(String value, + DoubleMetaphoneResult result, + int index) { + //-- only keep if first & before vowel or between 2 vowels --// + if ((index == 0 || isVowel(charAt(value, index - 1))) && + isVowel(charAt(value, index + 1))) { + result.append('H'); + index += 2; + //-- also takes car of "HH" --// + } else { + index++; + } + return index; + } + + /** + * Handles 'J' cases + */ + private int handleJ(String value, DoubleMetaphoneResult result, int index, + boolean slavoGermanic) { + if (contains(value, index, 4, "JOSE") || contains(value, 0, 4, "SAN ")) { + //-- obvious Spanish, "Jose", "San Jacinto" --// + if ((index == 0 && (charAt(value, index + 4) == ' ') || + value.length() == 4) || contains(value, 0, 4, "SAN ")) { + result.append('H'); + } else { + result.append('J', 'H'); + } + index++; + } else { + if (index == 0 && !contains(value, index, 4, "JOSE")) { + result.append('J', 'A'); + } else if (isVowel(charAt(value, index - 1)) && !slavoGermanic && + (charAt(value, index + 1) == 'A' || charAt(value, index + 1) == 'O')) { + result.append('J', 'H'); + } else if (index == value.length() - 1) { + result.append('J', ' '); + } else if (!contains(value, index + 1, 1, L_T_K_S_N_M_B_Z) && !contains(value, index - 1, 1, "S", "K", "L")) { + result.append('J'); + } + + if (charAt(value, index + 1) == 'J') { + index += 2; + } else { + index++; + } + } + return index; + } + + /** + * Handles 'L' cases + */ + private int handleL(String value, + DoubleMetaphoneResult result, + int index) { + if (charAt(value, index + 1) == 'L') { + if (conditionL0(value, index)) { + result.appendPrimary('L'); + } else { + result.append('L'); + } + index += 2; + } else { + index++; + result.append('L'); + } + return index; + } + + /** + * Handles 'P' cases + */ + private int handleP(String value, + DoubleMetaphoneResult result, + int index) { + if (charAt(value, index + 1) == 'H') { + result.append('F'); + index += 2; + } else { + result.append('P'); + index = contains(value, index + 1, 1, "P", "B") ? index + 2 : index + 1; + } + return index; + } + + /** + * Handles 'R' cases + */ + private int handleR(String value, + DoubleMetaphoneResult result, + int index, + boolean slavoGermanic) { + if (index == value.length() - 1 && !slavoGermanic && + contains(value, index - 2, 2, "IE") && + !contains(value, index - 4, 2, "ME", "MA")) { + result.appendAlternate('R'); + } else { + result.append('R'); + } + return charAt(value, index + 1) == 'R' ? index + 2 : index + 1; + } + + /** + * Handles 'S' cases + */ + private int handleS(String value, + DoubleMetaphoneResult result, + int index, + boolean slavoGermanic) { + if (contains(value, index - 1, 3, "ISL", "YSL")) { + //-- special cases "island", "isle", "carlisle", "carlysle" --// + index++; + } else if (index == 0 && contains(value, index, 5, "SUGAR")) { + //-- special case "sugar-" --// + result.append('X', 'S'); + index++; + } else if (contains(value, index, 2, "SH")) { + if (contains(value, index + 1, 4, + "HEIM", "HOEK", "HOLM", "HOLZ")) { + //-- germanic --// + result.append('S'); + } else { + result.append('X'); + } + index += 2; + } else if (contains(value, index, 3, "SIO", "SIA") || contains(value, index, 4, "SIAN")) { + //-- Italian and Armenian --// + if (slavoGermanic) { + result.append('S'); + } else { + result.append('S', 'X'); + } + index += 3; + } else if ((index == 0 && contains(value, index + 1, 1, "M", "N", "L", "W")) || contains(value, index + 1, 1, "Z")) { + //-- german & anglicisations, e.g. "smith" match "schmidt" // + // "snider" match "schneider" --// + //-- also, -sz- in slavic language altho in hungarian it // + // is pronounced "s" --// + result.append('S', 'X'); + index = contains(value, index + 1, 1, "Z") ? index + 2 : index + 1; + } else if (contains(value, index, 2, "SC")) { + index = handleSC(value, result, index); + } else { + if (index == value.length() - 1 && contains(value, index - 2, + 2, "AI", "OI")){ + //-- french e.g. "resnais", "artois" --// + result.appendAlternate('S'); + } else { + result.append('S'); + } + index = contains(value, index + 1, 1, "S", "Z") ? index + 2 : index + 1; + } + return index; + } + + /** + * Handles 'SC' cases + */ + private int handleSC(String value, + DoubleMetaphoneResult result, + int index) { + if (charAt(value, index + 2) == 'H') { + //-- Schlesinger's rule --// + if (contains(value, index + 3, + 2, "OO", "ER", "EN", "UY", "ED", "EM")) { + //-- Dutch origin, e.g. "school", "schooner" --// + if (contains(value, index + 3, 2, "ER", "EN")) { + //-- "schermerhorn", "schenker" --// + result.append("X", "SK"); + } else { + result.append("SK"); + } + } else { + if (index == 0 && !isVowel(charAt(value, 3)) && charAt(value, 3) != 'W') { + result.append('X', 'S'); + } else { + result.append('X'); + } + } + } else if (contains(value, index + 2, 1, "I", "E", "Y")) { + result.append('S'); + } else { + result.append("SK"); + } + return index + 3; + } + + /** + * Handles 'T' cases + */ + private int handleT(String value, + DoubleMetaphoneResult result, + int index) { + if (contains(value, index, 4, "TION")) { + result.append('X'); + index += 3; + } else if (contains(value, index, 3, "TIA", "TCH")) { + result.append('X'); + index += 3; + } else if (contains(value, index, 2, "TH") || contains(value, index, + 3, "TTH")) { + if (contains(value, index + 2, 2, "OM", "AM") || + //-- special case "thomas", "thames" or germanic --// + contains(value, 0, 4, "VAN ", "VON ") || + contains(value, 0, 3, "SCH")) { + result.append('T'); + } else { + result.append('0', 'T'); + } + index += 2; + } else { + result.append('T'); + index = contains(value, index + 1, 1, "T", "D") ? index + 2 : index + 1; + } + return index; + } + + /** + * Handles 'W' cases + */ + private int handleW(String value, + DoubleMetaphoneResult result, + int index) { + if (contains(value, index, 2, "WR")) { + //-- can also be in middle of word --// + result.append('R'); + index += 2; + } else { + if (index == 0 && (isVowel(charAt(value, index + 1)) || + contains(value, index, 2, "WH"))) { + if (isVowel(charAt(value, index + 1))) { + //-- Wasserman should match Vasserman --// + result.append('A', 'F'); + } else { + //-- need Uomo to match Womo --// + result.append('A'); + } + index++; + } else if ((index == value.length() - 1 && isVowel(charAt(value, index - 1))) || + contains(value, index - 1, + 5, "EWSKI", "EWSKY", "OWSKI", "OWSKY") || + contains(value, 0, 3, "SCH")) { + //-- Arnow should match Arnoff --// + result.appendAlternate('F'); + index++; + } else if (contains(value, index, 4, "WICZ", "WITZ")) { + //-- Polish e.g. "filipowicz" --// + result.append("TS", "FX"); + index += 4; + } else { + index++; + } + } + return index; + } + + /** + * Handles 'X' cases + */ + private int handleX(String value, + DoubleMetaphoneResult result, + int index) { + if (index == 0) { + result.append('S'); + index++; + } else { + if (!((index == value.length() - 1) && + (contains(value, index - 3, 3, "IAU", "EAU") || + contains(value, index - 2, 2, "AU", "OU")))) { + //-- French e.g. breaux --// + result.append("KS"); + } + index = contains(value, index + 1, 1, "C", "X") ? index + 2 : index + 1; + } + return index; + } + + /** + * Handles 'Z' cases + */ + private int handleZ(String value, DoubleMetaphoneResult result, int index, + boolean slavoGermanic) { + if (charAt(value, index + 1) == 'H') { + //-- Chinese pinyin e.g. "zhao" or Angelina "Zhang" --// + result.append('J'); + index += 2; + } else { + if (contains(value, index + 1, 2, "ZO", "ZI", "ZA") || (slavoGermanic && (index > 0 && charAt(value, index - 1) != 'T'))) { + result.append("S", "TS"); + } else { + result.append('S'); + } + index = charAt(value, index + 1) == 'Z' ? index + 2 : index + 1; + } + return index; + } + + //-- BEGIN CONDITIONS --// + + /** + * Complex condition 0 for 'C' + */ + private boolean conditionC0(String value, int index) { + if (contains(value, index, 4, "CHIA")) { + return true; + } else if (index <= 1) { + return false; + } else if (isVowel(charAt(value, index - 2))) { + return false; + } else if (!contains(value, index - 1, 3, "ACH")) { + return false; + } else { + char c = charAt(value, index + 2); + return (c != 'I' && c != 'E') || + contains(value, index - 2, 6, "BACHER", "MACHER"); + } + } + + /** + * Complex condition 0 for 'CH' + */ + private boolean conditionCH0(String value, int index) { + if (index != 0) { + return false; + } else if (!contains(value, index + 1, 5, "HARAC", "HARIS") && + !contains(value, index + 1, 3, "HOR", "HYM", "HIA", "HEM")) { + return false; + } else if (contains(value, 0, 5, "CHORE")) { + return false; + } else { + return true; + } + } + + /** + * Complex condition 1 for 'CH' + */ + private boolean conditionCH1(String value, int index) { + return ((contains(value, 0, 4, "VAN ", "VON ") || contains(value, 0, + 3, "SCH")) || + contains(value, index - 2, 6, "ORCHES", "ARCHIT", "ORCHID") || + contains(value, index + 2, 1, "T", "S") || + ((contains(value, index - 1, 1, "A", "O", "U", "E") || index == 0) && + (contains(value, index + 2, 1, L_R_N_M_B_H_F_V_W_SPACE) || index + 1 == value.length() - 1))); + } + + /** + * Complex condition 0 for 'L' + */ + private boolean conditionL0(String value, int index) { + if (index == value.length() - 3 && + contains(value, index - 1, 4, "ILLO", "ILLA", "ALLE")) { + return true; + } else if ((contains(value, value.length() - 2, 2, "AS", "OS") || + contains(value, value.length() - 1, 1, "A", "O")) && + contains(value, index - 1, 4, "ALLE")) { + return true; + } else { + return false; + } + } + + /** + * Complex condition 0 for 'M' + */ + private boolean conditionM0(String value, int index) { + if (charAt(value, index + 1) == 'M') { + return true; + } + return contains(value, index - 1, 3, "UMB") && + ((index + 1) == value.length() - 1 || contains(value, + index + 2, 2, "ER")); + } + + //-- BEGIN HELPER FUNCTIONS --// + + /** + * Determines whether or not a value is of slavo-germanic orgin. A value is + * of slavo-germanic origin if it contians any of 'W', 'K', 'CZ', or 'WITZ'. + */ + private boolean isSlavoGermanic(String value) { + return value.indexOf('W') > -1 || value.indexOf('K') > -1 || + value.indexOf("CZ") > -1 || value.indexOf("WITZ") > -1; + } + + /** + * Determines whether or not a character is a vowel or not + */ + private boolean isVowel(char ch) { + return VOWELS.indexOf(ch) != -1; + } + + /** + * Determines whether or not the value starts with a silent letter. It will + * return true if the value starts with any of 'GN', 'KN', + * 'PN', 'WR' or 'PS'. + */ + private boolean isSilentStart(String value) { + boolean result = false; + for (String element : SILENT_START) { + if (value.startsWith(element)) { + result = true; + break; + } + } + return result; + } + + /** + * Cleans the input + */ + private String cleanInput(String input) { + if (input == null) { + return null; + } + input = input.trim(); + if (input.length() == 0) { + return null; + } + return input.toUpperCase(java.util.Locale.ENGLISH); + } + + /** + * Gets the character at index index if available, otherwise + * it returns Character.MIN_VALUE so that there is some sort + * of a default + */ + protected char charAt(String value, int index) { + if (index < 0 || index >= value.length()) { + return Character.MIN_VALUE; + } + return value.charAt(index); + } + + /** + * Shortcut method with 1 criteria + */ + private static boolean contains(String value, int start, int length, + String criteria) { + return contains(value, start, length, + new String[] { criteria }); + } + + /** + * Shortcut method with 2 criteria + */ + private static boolean contains(String value, int start, int length, + String criteria1, String criteria2) { + return contains(value, start, length, + new String[] { criteria1, criteria2 }); + } + + /** + * Shortcut method with 3 criteria + */ + private static boolean contains(String value, int start, int length, + String criteria1, String criteria2, + String criteria3) { + return contains(value, start, length, + new String[] { criteria1, criteria2, criteria3 }); + } + + /** + * Shortcut method with 4 criteria + */ + private static boolean contains(String value, int start, int length, + String criteria1, String criteria2, + String criteria3, String criteria4) { + return contains(value, start, length, + new String[] { criteria1, criteria2, criteria3, + criteria4 }); + } + + /** + * Shortcut method with 5 criteria + */ + private static boolean contains(String value, int start, int length, + String criteria1, String criteria2, + String criteria3, String criteria4, + String criteria5) { + return contains(value, start, length, + new String[] { criteria1, criteria2, criteria3, + criteria4, criteria5 }); + } + + /** + * Shortcut method with 6 criteria + */ + private static boolean contains(String value, int start, int length, + String criteria1, String criteria2, + String criteria3, String criteria4, + String criteria5, String criteria6) { + return contains(value, start, length, + new String[] { criteria1, criteria2, criteria3, + criteria4, criteria5, criteria6 }); + } + + /** + * Determines whether value contains any of the criteria starting at index start and + * matching up to length length + */ + protected static boolean contains(String value, int start, int length, + String[] criteria) { + boolean result = false; + if (start >= 0 && start + length <= value.length()) { + String target = value.substring(start, start + length); + + for (String element : criteria) { + if (target.equals(element)) { + result = true; + break; + } + } + } + return result; + } + + //-- BEGIN INNER CLASSES --// + + /** + * Inner class for storing results, since there is the optional alternate + * encoding. + */ + public class DoubleMetaphoneResult { + + private final StringBuffer primary = new StringBuffer(getMaxCodeLen()); + private final StringBuffer alternate = new StringBuffer(getMaxCodeLen()); + private final int maxLength; + + public DoubleMetaphoneResult(int maxLength) { + this.maxLength = maxLength; + } + + public void append(char value) { + appendPrimary(value); + appendAlternate(value); + } + + public void append(char primary, char alternate) { + appendPrimary(primary); + appendAlternate(alternate); + } + + public void appendPrimary(char value) { + if (this.primary.length() < this.maxLength) { + this.primary.append(value); + } + } + + public void appendAlternate(char value) { + if (this.alternate.length() < this.maxLength) { + this.alternate.append(value); + } + } + + public void append(String value) { + appendPrimary(value); + appendAlternate(value); + } + + public void append(String primary, String alternate) { + appendPrimary(primary); + appendAlternate(alternate); + } + + public void appendPrimary(String value) { + int addChars = this.maxLength - this.primary.length(); + if (value.length() <= addChars) { + this.primary.append(value); + } else { + this.primary.append(value.substring(0, addChars)); + } + } + + public void appendAlternate(String value) { + int addChars = this.maxLength - this.alternate.length(); + if (value.length() <= addChars) { + this.alternate.append(value); + } else { + this.alternate.append(value.substring(0, addChars)); + } + } + + public String getPrimary() { + return this.primary.toString(); + } + + public String getAlternate() { + return this.alternate.toString(); + } + + public boolean isComplete() { + return this.primary.length() >= this.maxLength && + this.alternate.length() >= this.maxLength; + } + } +} diff --git a/source/net/yacy/cora/language/phonetic/Metaphone.java b/source/net/yacy/cora/language/phonetic/Metaphone.java new file mode 100644 index 000000000..65f4f0716 --- /dev/null +++ b/source/net/yacy/cora/language/phonetic/Metaphone.java @@ -0,0 +1,407 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package net.yacy.cora.language.phonetic; + +import org.apache.commons.codec.EncoderException; +import org.apache.commons.codec.StringEncoder; + +/** + * Encodes a string into a Metaphone value. + *

    + * Initial Java implementation by William B. Brogden. December, 1997. + * Permission given by wbrogden for code to be used anywhere. + *

    + *

    + * Hanging on the Metaphone by Lawrence Philips in Computer Language of Dec. 1990, p + * 39. + *

    + *

    + * Note, that this does not match the algorithm that ships with PHP, or the algorithm + * found in the Perl Text:Metaphone-1.96. + * They have had undocumented changes from the originally published algorithm. + * For more information, see CODEC-57. + *

    + * + * @author Apache Software Foundation + * @version $Id: Metaphone.java 1157192 2011-08-12 17:27:38Z ggregory $ + */ +public class Metaphone implements StringEncoder { + + /** + * Five values in the English language + */ + private static final String VOWELS = "AEIOU" ; + + /** + * Variable used in Metaphone algorithm + */ + private static final String FRONTV = "EIY" ; + + /** + * Variable used in Metaphone algorithm + */ + private static final String VARSON = "CSPTG" ; + + /** + * The max code length for metaphone is 4 + */ + private int maxCodeLen = 4 ; + + /** + * Creates an instance of the Metaphone encoder + */ + public Metaphone() { + super(); + } + + /** + * Find the metaphone value of a String. This is similar to the + * soundex algorithm, but better at finding similar sounding words. + * All input is converted to upper case. + * Limitations: Input format is expected to be a single ASCII word + * with only characters in the A - Z range, no punctuation or numbers. + * + * @param txt String to find the metaphone code for + * @return A metaphone code corresponding to the String supplied + */ + public String metaphone(String txt) { + boolean hard = false ; + if ((txt == null) || (txt.length() == 0)) { + return "" ; + } + // single character is itself + if (txt.length() == 1) { + return txt.toUpperCase(java.util.Locale.ENGLISH) ; + } + + char[] inwd = txt.toUpperCase(java.util.Locale.ENGLISH).toCharArray() ; + + StringBuffer local = new StringBuffer(40); // manipulate + StringBuffer code = new StringBuffer(10) ; // output + // handle initial 2 characters exceptions + switch(inwd[0]) { + case 'K' : + case 'G' : + case 'P' : /* looking for KN, etc*/ + if (inwd[1] == 'N') { + local.append(inwd, 1, inwd.length - 1); + } else { + local.append(inwd); + } + break; + case 'A': /* looking for AE */ + if (inwd[1] == 'E') { + local.append(inwd, 1, inwd.length - 1); + } else { + local.append(inwd); + } + break; + case 'W' : /* looking for WR or WH */ + if (inwd[1] == 'R') { // WR -> R + local.append(inwd, 1, inwd.length - 1); + break ; + } + if (inwd[1] == 'H') { + local.append(inwd, 1, inwd.length - 1); + local.setCharAt(0, 'W'); // WH -> W + } else { + local.append(inwd); + } + break; + case 'X' : /* initial X becomes S */ + inwd[0] = 'S'; + local.append(inwd); + break ; + default : + local.append(inwd); + } // now local has working string with initials fixed + + int wdsz = local.length(); + int n = 0 ; + + while ((code.length() < this.getMaxCodeLen()) && + (n < wdsz) ) { // max code size of 4 works well + char symb = local.charAt(n) ; + // remove duplicate letters except C + if ((symb != 'C') && (isPreviousChar( local, n, symb )) ) { + n++ ; + } else { // not dup + switch(symb) { + case 'A' : case 'E' : case 'I' : case 'O' : case 'U' : + if (n == 0) { + code.append(symb); + } + break ; // only use vowel if leading char + case 'B' : + if ( isPreviousChar(local, n, 'M') && + isLastChar(wdsz, n) ) { // B is silent if word ends in MB + break; + } + code.append(symb); + break; + case 'C' : // lots of C special cases + /* discard if SCI, SCE or SCY */ + if ( isPreviousChar(local, n, 'S') && + !isLastChar(wdsz, n) && + (FRONTV.indexOf(local.charAt(n + 1)) >= 0) ) { + break; + } + if (regionMatch(local, n, "CIA")) { // "CIA" -> X + code.append('X'); + break; + } + if (!isLastChar(wdsz, n) && + (FRONTV.indexOf(local.charAt(n + 1)) >= 0)) { + code.append('S'); + break; // CI,CE,CY -> S + } + if (isPreviousChar(local, n, 'S') && + isNextChar(local, n, 'H') ) { // SCH->sk + code.append('K') ; + break ; + } + if (isNextChar(local, n, 'H')) { // detect CH + if ((n == 0) && + (wdsz >= 3) && + isVowel(local,2) ) { // CH consonant -> K consonant + code.append('K'); + } else { + code.append('X'); // CHvowel -> X + } + } else { + code.append('K'); + } + break ; + case 'D' : + if (!isLastChar(wdsz, n + 1) && + isNextChar(local, n, 'G') && + (FRONTV.indexOf(local.charAt(n + 2)) >= 0)) { // DGE DGI DGY -> J + code.append('J'); n += 2 ; + } else { + code.append('T'); + } + break ; + case 'G' : // GH silent at end or before consonant + if (isLastChar(wdsz, n + 1) && + isNextChar(local, n, 'H')) { + break; + } + if (!isLastChar(wdsz, n + 1) && + isNextChar(local,n,'H') && + !isVowel(local,n+2)) { + break; + } + if ((n > 0) && + ( regionMatch(local, n, "GN") || + regionMatch(local, n, "GNED") ) ) { + break; // silent G + } + if (isPreviousChar(local, n, 'G')) { + // NOTE: Given that duplicated chars are removed, I don't see how this can ever be true + hard = true ; + } else { + hard = false ; + } + if (!isLastChar(wdsz, n) && + (FRONTV.indexOf(local.charAt(n + 1)) >= 0) && + (!hard)) { + code.append('J'); + } else { + code.append('K'); + } + break ; + case 'H': + if (isLastChar(wdsz, n)) { + break ; // terminal H + } + if ((n > 0) && + (VARSON.indexOf(local.charAt(n - 1)) >= 0)) { + break; + } + if (isVowel(local,n+1)) { + code.append('H'); // Hvowel + } + break; + case 'F': + case 'J' : + case 'L' : + case 'M': + case 'N' : + case 'R' : + code.append(symb); + break; + case 'K' : + if (n > 0) { // not initial + if (!isPreviousChar(local, n, 'C')) { + code.append(symb); + } + } else { + code.append(symb); // initial K + } + break ; + case 'P' : + if (isNextChar(local,n,'H')) { + // PH -> F + code.append('F'); + } else { + code.append(symb); + } + break ; + case 'Q' : + code.append('K'); + break; + case 'S' : + if (regionMatch(local,n,"SH") || + regionMatch(local,n,"SIO") || + regionMatch(local,n,"SIA")) { + code.append('X'); + } else { + code.append('S'); + } + break; + case 'T' : + if (regionMatch(local,n,"TIA") || + regionMatch(local,n,"TIO")) { + code.append('X'); + break; + } + if (regionMatch(local,n,"TCH")) { + // Silent if in "TCH" + break; + } + // substitute numeral 0 for TH (resembles theta after all) + if (regionMatch(local,n,"TH")) { + code.append('0'); + } else { + code.append('T'); + } + break ; + case 'V' : + code.append('F'); break ; + case 'W' : case 'Y' : // silent if not followed by vowel + if (!isLastChar(wdsz,n) && + isVowel(local,n+1)) { + code.append(symb); + } + break ; + case 'X' : + code.append('K'); code.append('S'); + break ; + case 'Z' : + code.append('S'); break ; + } // end switch + n++ ; + } // end else from symb != 'C' + if (code.length() > this.getMaxCodeLen()) { + code.setLength(this.getMaxCodeLen()); + } + } + return code.toString(); + } + + private boolean isVowel(StringBuffer string, int index) { + return VOWELS.indexOf(string.charAt(index)) >= 0; + } + + private boolean isPreviousChar(StringBuffer string, int index, char c) { + boolean matches = false; + if( index > 0 && + index < string.length() ) { + matches = string.charAt(index - 1) == c; + } + return matches; + } + + private boolean isNextChar(StringBuffer string, int index, char c) { + boolean matches = false; + if( index >= 0 && + index < string.length() - 1 ) { + matches = string.charAt(index + 1) == c; + } + return matches; + } + + private boolean regionMatch(StringBuffer string, int index, String test) { + boolean matches = false; + if( index >= 0 && + (index + test.length() - 1) < string.length() ) { + String substring = string.substring( index, index + test.length()); + matches = substring.equals( test ); + } + return matches; + } + + private boolean isLastChar(int wdsz, int n) { + return n + 1 == wdsz; + } + + + /** + * Encodes an Object using the metaphone algorithm. This method + * is provided in order to satisfy the requirements of the + * Encoder interface, and will throw an EncoderException if the + * supplied object is not of type java.lang.String. + * + * @param pObject Object to encode + * @return An object (or type java.lang.String) containing the + * metaphone code which corresponds to the String supplied. + * @throws EncoderException if the parameter supplied is not + * of type java.lang.String + */ + public Object encode(Object pObject) throws EncoderException { + if (!(pObject instanceof String)) { + throw new EncoderException("Parameter supplied to Metaphone encode is not of type java.lang.String"); + } + return metaphone((String) pObject); + } + + /** + * Encodes a String using the Metaphone algorithm. + * + * @param pString String object to encode + * @return The metaphone code corresponding to the String supplied + */ + public String encode(String pString) { + return metaphone(pString); + } + + /** + * Tests is the metaphones of two strings are identical. + * + * @param str1 First of two strings to compare + * @param str2 Second of two strings to compare + * @return true if the metaphones of these strings are identical, + * false otherwise. + */ + public boolean isMetaphoneEqual(String str1, String str2) { + return metaphone(str1).equals(metaphone(str2)); + } + + /** + * Returns the maxCodeLen. + * @return int + */ + public int getMaxCodeLen() { return this.maxCodeLen; } + + /** + * Sets the maxCodeLen. + * @param maxCodeLen The maxCodeLen to set + */ + public void setMaxCodeLen(int maxCodeLen) { this.maxCodeLen = maxCodeLen; } + +} diff --git a/source/net/yacy/cora/language/phonetic/Phonetic.java b/source/net/yacy/cora/language/phonetic/Phonetic.java new file mode 100644 index 000000000..f59bbd137 --- /dev/null +++ b/source/net/yacy/cora/language/phonetic/Phonetic.java @@ -0,0 +1,73 @@ +/** + * Phonetic + * Copyright 201 by Michael Peter Christen, mc@yacy.net, Frankfurt a. M., Germany + * First released 13.12.2011 at http://yacy.net + * + * $LastChangedDate$ + * $LastChangedRevision$ + * $LastChangedBy$ + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program in the file lgpl21.txt + * If not, see . + */ + +package net.yacy.cora.language.phonetic; + +public class Phonetic { + + public enum Encoder { + SOUNDEX("Soundex", ""), + COLONE_PHONETIC("Koelner Phonetik", "http://de.wikipedia.org/wiki/K%C3%B6lner_Phonetik"), + METAPHONE("Metaphone", ""), + DOUBLE_METAPHONE("Double Metaphone", ""), + NONE("", ""); + + final String printName; + final String infoUrl; + + private Encoder(final String printName, final String infoUrl) { + this.printName = printName; + this.infoUrl = infoUrl; + } + } + + private static final Soundex soundexEncoder = new Soundex(); + private static final Metaphone metaphoneEncoder = new Metaphone(); + private static final DoubleMetaphone doubleMetaphoneEncoder = new DoubleMetaphone(); + private static final ColognePhonetic colognePhonetic = new ColognePhonetic(); + + public static String encode(final Encoder encoder, final String s) { + try { + if (encoder == Encoder.SOUNDEX) return soundexEncoder.encode(s); + if (encoder == Encoder.COLONE_PHONETIC) return colognePhonetic.encode(s); + if (encoder == Encoder.METAPHONE) return metaphoneEncoder.encode(s); + if (encoder == Encoder.DOUBLE_METAPHONE) return doubleMetaphoneEncoder.encode(s); + return s; + } catch (Throwable e) { + // some encoders do not work with non-ASCII charachters and throw an exception + return s; + } + } + + public static void main(String[] args) { + for (Encoder encoder: Encoder.values()) { + for (String s: args) { + System.out.print(Phonetic.encode(encoder, s)); + System.out.print(" "); + } + System.out.println(); + } + } + +} diff --git a/source/net/yacy/cora/language/phonetic/Soundex.java b/source/net/yacy/cora/language/phonetic/Soundex.java new file mode 100644 index 000000000..7581aa944 --- /dev/null +++ b/source/net/yacy/cora/language/phonetic/Soundex.java @@ -0,0 +1,340 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package net.yacy.cora.language.phonetic; + +import org.apache.commons.codec.EncoderException; +import org.apache.commons.codec.StringEncoder; + +/** + * Encodes a string into a Soundex value. Soundex is an encoding used to relate similar names, but can also be used as a + * general purpose scheme to find word with similar phonemes. + * + * @author Apache Software Foundation + * @version $Id: Soundex.java 1201529 2011-11-13 21:57:16Z ggregory $ + */ +public class Soundex implements StringEncoder { + + /** + * This is a default mapping of the 26 letters used in US English. A value of 0 for a letter position + * means do not encode. + *

    + * (This constant is provided as both an implementation convenience and to allow Javadoc to pick + * up the value for the constant values page.) + *

    + * + * @see #US_ENGLISH_MAPPING + */ + public static final String US_ENGLISH_MAPPING_STRING = "01230120022455012623010202"; + + /** + * This is a default mapping of the 26 letters used in US English. A value of 0 for a letter position + * means do not encode. + * + * @see Soundex#Soundex(char[]) + */ + private static final char[] US_ENGLISH_MAPPING = US_ENGLISH_MAPPING_STRING.toCharArray(); + + /** + * An instance of Soundex using the US_ENGLISH_MAPPING mapping. + * + * @see #US_ENGLISH_MAPPING + */ + public static final Soundex US_ENGLISH = new Soundex(); + + /** + * Every letter of the alphabet is "mapped" to a numerical value. This char array holds the values to which each + * letter is mapped. This implementation contains a default map for US_ENGLISH + */ + private final char[] soundexMapping; + + /** + * Creates an instance using US_ENGLISH_MAPPING + * + * @see Soundex#Soundex(char[]) + * @see Soundex#US_ENGLISH_MAPPING + */ + public Soundex() { + this.soundexMapping = US_ENGLISH_MAPPING; + } + + /** + * Creates a soundex instance using the given mapping. This constructor can be used to provide an internationalized + * mapping for a non-Western character set. + * + * Every letter of the alphabet is "mapped" to a numerical value. This char array holds the values to which each + * letter is mapped. This implementation contains a default map for US_ENGLISH + * + * @param mapping + * Mapping array to use when finding the corresponding code for a given character + */ + public Soundex(char[] mapping) { + this.soundexMapping = new char[mapping.length]; + System.arraycopy(mapping, 0, this.soundexMapping, 0, mapping.length); + } + + /** + * Creates a refined soundex instance using a custom mapping. This constructor can be used to customize the mapping, + * and/or possibly provide an internationalized mapping for a non-Western character set. + * + * @param mapping + * Mapping string to use when finding the corresponding code for a given character + * @since 1.4 + */ + public Soundex(String mapping) { + this.soundexMapping = mapping.toCharArray(); + } + + /** + * Encodes the Strings and returns the number of characters in the two encoded Strings that are the same. This + * return value ranges from 0 through 4: 0 indicates little or no similarity, and 4 indicates strong similarity or + * identical values. + * + * @param s1 + * A String that will be encoded and compared. + * @param s2 + * A String that will be encoded and compared. + * @return The number of characters in the two encoded Strings that are the same from 0 to 4. + * + * @see SoundexUtils#difference(StringEncoder,String,String) + * @see MS + * T-SQL DIFFERENCE + * + * @throws EncoderException + * if an error occurs encoding one of the strings + * @since 1.3 + */ + public int difference(String s1, String s2) throws EncoderException { + return difference(this, s1, s2); + } + + /** + * Encodes an Object using the soundex algorithm. This method is provided in order to satisfy the requirements of + * the Encoder interface, and will throw an EncoderException if the supplied object is not of type java.lang.String. + * + * @param pObject + * Object to encode + * @return An object (or type java.lang.String) containing the soundex code which corresponds to the String + * supplied. + * @throws EncoderException + * if the parameter supplied is not of type java.lang.String + * @throws IllegalArgumentException + * if a character is not mapped + */ + public Object encode(Object pObject) throws EncoderException { + if (!(pObject instanceof String)) { + throw new EncoderException("Parameter supplied to Soundex encode is not of type java.lang.String"); + } + return soundex((String) pObject); + } + + /** + * Encodes a String using the soundex algorithm. + * + * @param pString + * A String object to encode + * @return A Soundex code corresponding to the String supplied + * @throws IllegalArgumentException + * if a character is not mapped + */ + public String encode(String pString) { + return soundex(pString); + } + + /** + * Used internally by the SoundEx algorithm. + * + * Consonants from the same code group separated by W or H are treated as one. + * + * @param str + * the cleaned working string to encode (in upper case). + * @param index + * the character position to encode + * @return Mapping code for a particular character + * @throws IllegalArgumentException + * if the character is not mapped + */ + private char getMappingCode(String str, int index) { + // map() throws IllegalArgumentException + char mappedChar = this.map(str.charAt(index)); + // HW rule check + if (index > 1 && mappedChar != '0') { + char hwChar = str.charAt(index - 1); + if ('H' == hwChar || 'W' == hwChar) { + char preHWChar = str.charAt(index - 2); + char firstCode = this.map(preHWChar); + if (firstCode == mappedChar || 'H' == preHWChar || 'W' == preHWChar) { + return 0; + } + } + } + return mappedChar; + } + + /** + * Returns the soundex mapping. + * + * @return soundexMapping. + */ + private char[] getSoundexMapping() { + return this.soundexMapping; + } + + /** + * Maps the given upper-case character to its Soundex code. + * + * @param ch + * An upper-case character. + * @return A Soundex code. + * @throws IllegalArgumentException + * Thrown if ch is not mapped. + */ + private char map(char ch) { + int index = ch - 'A'; + if (index < 0 || index >= this.getSoundexMapping().length) { + throw new IllegalArgumentException("The character is not mapped: " + ch); + } + return this.getSoundexMapping()[index]; + } + + /** + * Retrieves the Soundex code for a given String object. + * + * @param str + * String to encode using the Soundex algorithm + * @return A soundex code for the String supplied + * @throws IllegalArgumentException + * if a character is not mapped + */ + public String soundex(String str) { + if (str == null) { + return null; + } + str = clean(str); + if (str.length() == 0) { + return str; + } + char out[] = {'0', '0', '0', '0'}; + char last, mapped; + int incount = 1, count = 1; + out[0] = str.charAt(0); + // getMappingCode() throws IllegalArgumentException + last = getMappingCode(str, 0); + while ((incount < str.length()) && (count < out.length)) { + mapped = getMappingCode(str, incount++); + if (mapped != 0) { + if ((mapped != '0') && (mapped != last)) { + out[count++] = mapped; + } + last = mapped; + } + } + return new String(out); + } + + + /** + * Cleans up the input string before Soundex processing by only returning + * upper case letters. + * + * @param str + * The String to clean. + * @return A clean String. + */ + static String clean(String str) { + if (str == null || str.length() == 0) { + return str; + } + int len = str.length(); + char[] chars = new char[len]; + int count = 0; + for (int i = 0; i < len; i++) { + if (Character.isLetter(str.charAt(i))) { + chars[count++] = str.charAt(i); + } + } + if (count == len) { + return str.toUpperCase(java.util.Locale.ENGLISH); + } + return new String(chars, 0, count).toUpperCase(java.util.Locale.ENGLISH); + } + + /** + * Encodes the Strings and returns the number of characters in the two + * encoded Strings that are the same. + *
      + *
    • For Soundex, this return value ranges from 0 through 4: 0 indicates + * little or no similarity, and 4 indicates strong similarity or identical + * values.
    • + *
    • For refined Soundex, the return value can be greater than 4.
    • + *
    + * + * @param encoder + * The encoder to use to encode the Strings. + * @param s1 + * A String that will be encoded and compared. + * @param s2 + * A String that will be encoded and compared. + * @return The number of characters in the two Soundex encoded Strings that + * are the same. + * + * @see #differenceEncoded(String,String) + * @see + * MS T-SQL DIFFERENCE + * + * @throws EncoderException + * if an error occurs encoding one of the strings + */ + static int difference(StringEncoder encoder, String s1, String s2) throws EncoderException { + return differenceEncoded(encoder.encode(s1), encoder.encode(s2)); + } + + /** + * Returns the number of characters in the two Soundex encoded Strings that + * are the same. + *
      + *
    • For Soundex, this return value ranges from 0 through 4: 0 indicates + * little or no similarity, and 4 indicates strong similarity or identical + * values.
    • + *
    • For refined Soundex, the return value can be greater than 4.
    • + *
    + * + * @param es1 + * An encoded String. + * @param es2 + * An encoded String. + * @return The number of characters in the two Soundex encoded Strings that + * are the same. + * + * @see + * MS T-SQL DIFFERENCE + */ + static int differenceEncoded(String es1, String es2) { + + if (es1 == null || es2 == null) { + return 0; + } + int lengthToMatch = Math.min(es1.length(), es2.length()); + int diff = 0; + for (int i = 0; i < lengthToMatch; i++) { + if (es1.charAt(i) == es2.charAt(i)) { + diff++; + } + } + return diff; + } +} diff --git a/source/net/yacy/cora/lod/Literal.java b/source/net/yacy/cora/lod/Literal.java new file mode 100644 index 000000000..c5794c5c2 --- /dev/null +++ b/source/net/yacy/cora/lod/Literal.java @@ -0,0 +1,74 @@ +/** + * Literal + * Copyright 2011 by Michael Peter Christen, mc@yacy.net, Frankfurt am Main, Germany + * First released 18.12.2011 at http://yacy.net + * + * $LastChangedDate: 2011-04-14 00:04:23 +0200 (Do, 14 Apr 2011) $ + * $LastChangedRevision: 7653 $ + * $LastChangedBy: orbiter $ + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program in the file lgpl21.txt + * If not, see . + */ + +package net.yacy.cora.lod; + +import java.util.regex.Pattern; + +import net.yacy.cora.document.MultiProtocolURI; + +/** + * A literal is the possible value for a predicate. + * A set of literals is the norm of a predicate. + * Each literal can have an attached explanation which we express + * as a link to the resource that explains the literal. + */ +public interface Literal { + + /** + * the terminal is the actual content of the property and also + * the visual representation of the content of a property if the + * literal is assigned to that property. + * @return a string representing the literal + */ + public String getTerminal(); + + /** + * the subject of a literal is a reference to a resource that + * explains the literal. If an object has attached properties + * from different vocabularies and properties assigned to the + * object have actual literal instances assigned, then the set + * of subjects of these literals explain the object as a co-notation + * to knowledge. Subjects of literals shall therefore be + * knowledge authorities for the predicates where the literal is + * assigned. + * @return an url to a knowledge authority for the literal + */ + public MultiProtocolURI getSubject(); + + /** + * if a resource is poorly annotated with metadata an it shall + * be automatically annotated, then the terminal of a literal + * may be too weak to discover literals in the resource. An additional + * discovery pattern may help to reduce the set of literals that can + * be discovered automatically. A discovery pattern is then not + * a replacement of the terminal itself, it is an additional pattern + * that must occur also in the resource where also the terminal of + * the literal appears. If the terminal itself is sufficient to discover + * the literal, then the discovery pattern may be a catch-all '.*' pattern. + * @return the discovery pattern to identify the literal in the resource. + */ + public Pattern getDiscoveryPattern(); + +} diff --git a/source/net/yacy/cora/lod/Node.java b/source/net/yacy/cora/lod/Node.java new file mode 100644 index 000000000..d1b0fc34a --- /dev/null +++ b/source/net/yacy/cora/lod/Node.java @@ -0,0 +1,113 @@ +/** + * AbstractScoreMap + * Copyright 2011 by Michael Peter Christen, mc@yacy.net, Frankfurt am Main, Germany + * First released 16.12.2011 at http://yacy.net + * + * $LastChangedDate: 2011-04-14 00:04:23 +0200 (Do, 14 Apr 2011) $ + * $LastChangedRevision: 7653 $ + * $LastChangedBy: orbiter $ + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program in the file lgpl21.txt + * If not, see . + */ + +package net.yacy.cora.lod; + +import java.util.HashMap; +import java.util.Map; + +import net.yacy.cora.document.UTF8; +import net.yacy.cora.lod.vocabulary.Rdf; + +/** + * class for a RDF node element. For a short primer see + * http://www.w3.org/TR/REC-rdf-syntax/ + */ +public class Node extends HashMap implements Map { + + private static final long serialVersionUID = -6715118942251224832L; + + public static final String SUBJECT = "rdf:about"; + + private final Rdf type; + + public Node(Rdf type) { + super(); + this.type = type; + } + + public Node(Rdf type, byte[] subject) { + this(type); + this.put(SUBJECT, subject); + } + + /** + * initialize the triples. + * one of the properties must be the resource SUBJECT + * for a blank node the SUBJECT can be omitted + * @param set + */ + public Node(Rdf type, Map set) { + this(type); + this.putAll(set); + } + + public Rdf getType() { + return this.type; + } + + public boolean isBlank() { + return !this.containsKey(SUBJECT); + } + + public byte[] getSubject() { + return this.get(SUBJECT); + } + + public void setSubject(byte[] subject) { + this.put(SUBJECT, subject); + } + + public byte[] getObject(Vocabulary predicate) { + return this.get(predicate.getPredicate()); + } + + public byte[] setObject(Vocabulary predicate, byte[] object) { + return this.put(predicate.getPredicate(), object); + } + + public byte[] removePredicate(Vocabulary predicate) { + return this.remove(predicate.getPredicate()); + } + + public byte[] toObject() { + StringBuilder sb = new StringBuilder(this.size() * 50); + sb.append("<"); + sb.append(this.type.getPredicate()); + byte[] subject = this.get(SUBJECT); + if (subject != null) sb.append(" rdf:about=\"").append(UTF8.String(subject)).append('\"'); + sb.append(">\n"); + for (Map.Entry entry: this.entrySet()) { + if (entry.getKey().equals(SUBJECT)) continue; + sb.append('<').append(entry.getKey()).append('>'); + sb.append(UTF8.String(entry.getValue())); + sb.append("\n"); + } + sb.append("\n"); + return UTF8.getBytes(sb); + } + +} diff --git a/source/net/yacy/cora/lod/Syntax.java b/source/net/yacy/cora/lod/Syntax.java new file mode 100644 index 000000000..b34a78e87 --- /dev/null +++ b/source/net/yacy/cora/lod/Syntax.java @@ -0,0 +1,78 @@ +/** + * Syntax + * Copyright 2011 by Michael Peter Christen, mc@yacy.net, Frankfurt am Main, Germany + * First released 17.12.2011 at http://yacy.net + * + * $LastChangedDate: 2011-04-14 00:04:23 +0200 (Do, 14 Apr 2011) $ + * $LastChangedRevision: 7653 $ + * $LastChangedBy: orbiter $ + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program in the file lgpl21.txt + * If not, see . + */ + +package net.yacy.cora.lod; + +import java.util.HashMap; +import java.util.Map; + +import net.yacy.cora.lod.vocabulary.CreativeCommons; +import net.yacy.cora.lod.vocabulary.DublinCore; +import net.yacy.cora.lod.vocabulary.Foaf; +import net.yacy.cora.lod.vocabulary.Geo; +import net.yacy.cora.lod.vocabulary.HttpHeader; +import net.yacy.cora.lod.vocabulary.Rdf; +import net.yacy.cora.lod.vocabulary.YaCyMetadata; + +/** + * helper class to understand xml tags and vocabularies + */ +public class Syntax { + + private final static Class[] vocabularies = new Class[]{ + CreativeCommons.class, + DublinCore.class, + Foaf.class, + Geo.class, + HttpHeader.class, + Rdf.class, + YaCyMetadata.class + }; + + private final static Map tagMap = new HashMap(); + + static { + Vocabulary voc; + for (Class v: vocabularies) { + Object[] cs = v.getEnumConstants(); + for (Object c: cs) { + voc = (Vocabulary) c; + tagMap.put(voc.getPredicate(), voc); + } + } + } + + /** + * recognizer for vocabulary tag names + * @param tag + * @return the vocabulary object for the given tag + */ + public static Vocabulary getVocabulary(String tag) { + return tagMap.get(tag); + } + + public static void main(String[] args) { + System.out.println(tagMap); + } +} diff --git a/source/net/yacy/cora/lod/TripleStore.java b/source/net/yacy/cora/lod/TripleStore.java new file mode 100644 index 000000000..f39bcd4c1 --- /dev/null +++ b/source/net/yacy/cora/lod/TripleStore.java @@ -0,0 +1,124 @@ +/** + * TripleStore + * Copyright 2011 by Michael Peter Christen, mc@yacy.net, Frankfurt am Main, Germany + * First released 16.12.2011 at http://yacy.net + * + * $LastChangedDate: 2011-04-14 00:04:23 +0200 (Do, 14 Apr 2011) $ + * $LastChangedRevision: 7653 $ + * $LastChangedBy: orbiter $ + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program in the file lgpl21.txt + * If not, see . + */ + + +package net.yacy.cora.lod; + +import java.util.AbstractMap; +import java.util.Iterator; +import java.util.Map; + +import net.yacy.cora.lod.vocabulary.Rdf; +import net.yacy.cora.order.ByteOrder; +import net.yacy.cora.order.CloneableIterator; +import net.yacy.cora.storage.MapStore; + +public class TripleStore { + + MapStore store; + + public TripleStore(MapStore store) { + this.store = store; + } + + public void clear() { + this.store.clear(); + } + + public boolean contains(byte[] id) { + return this.store.containsKey(id); + } + + public Node get(byte[] id) { + Map n = this.store.get(id); + if (n == null) return null; + return new Node(Rdf.Description, n); + } + + public boolean isEmpty() { + return this.store.isEmpty(); + } + + public Node put(byte[] id, Node node) { + Map n = this.store.put(id, node); + if (n == null) return null; + return new Node(Rdf.Description, n); + } + + public void putAll(TripleStore entries) { + Iterator> i = entries.iterator(); + Map.Entry entry; + while (i.hasNext()) { + entry = i.next(); + this.put(entry.getKey(), entry.getValue()); + } + } + + public Node remove(byte[] id) { + Map n = this.store.remove(id); + if (n == null) return null; + return new Node(Rdf.Description, n); + } + + public int size() { + return this.store.size(); + } + + public Iterator> iterator() { + final Iterator id = this.idIterator(); + return new Iterator>(){ + + @Override + public boolean hasNext() { + return id.hasNext(); + } + + @Override + public Map.Entry next() { + byte[] key = id.next(); + if (key == null) return null; + return new AbstractMap.SimpleImmutableEntry(key, TripleStore.this.get(key)); + } + + @Override + public void remove() { + id.remove(); + } + + }; + } + + public ByteOrder getOrdering() { + return this.store.getOrdering(); + } + + public CloneableIterator idIterator() { + return this.store.keyIterator(); + } + + public void close() { + this.store.close(); + } + +} diff --git a/source/net/yacy/cora/lod/Vocabulary.java b/source/net/yacy/cora/lod/Vocabulary.java new file mode 100644 index 000000000..cc1c0d658 --- /dev/null +++ b/source/net/yacy/cora/lod/Vocabulary.java @@ -0,0 +1,72 @@ +/** + * Vocabulary + * Copyright 2011 by Michael Peter Christen, mc@yacy.net, Frankfurt am Main, Germany + * First released 16.12.2011 at http://yacy.net + * + * $LastChangedDate: 2011-04-14 00:04:23 +0200 (Do, 14 Apr 2011) $ + * $LastChangedRevision: 7653 $ + * $LastChangedBy: orbiter $ + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program in the file lgpl21.txt + * If not, see . + */ + +package net.yacy.cora.lod; + +import java.util.Set; + + +/* + * A Vocabulary is an interface to an 'extensible enum pattern'. + * We want to have an kind of extensible enum for vocabularies. + * Since enum classes cannot be extended we use a hack as explained in + * http://blogs.oracle.com/darcy/entry/enums_and_mixins . + * For an example for 'extensible enum pattern' see + * http://stackoverflow.com/questions/1414755/java-extend-enum + */ +public interface Vocabulary { + + /** + * get the RDF identifier + * @return + */ + public String getIdentifier(); + + /** + * get the prefix for the predicates of this vocabulary + * @return + */ + public String getPrefix(); + + /** + * get the predicate name which already contains the prefix and the ':' + * @return + */ + public String getPredicate(); + + /** + * get a set of literals that are allowed for the predicate as values + * @return + */ + public Set getLiterals(); + + /** + * the name method is identical to the java.lang.Enum method. + * If an Enum class for vocabularies + * implements this interface, the name() method is automatically implemented + * + * @return Returns the name of the enum constant as declared in the enum declaration. + */ + public String name(); +} diff --git a/source/net/yacy/cora/lod/vocabulary/CreativeCommons.java b/source/net/yacy/cora/lod/vocabulary/CreativeCommons.java new file mode 100644 index 000000000..f6c5f9aae --- /dev/null +++ b/source/net/yacy/cora/lod/vocabulary/CreativeCommons.java @@ -0,0 +1,207 @@ +/** + * CreativeCommons + * Copyright 2011 by Michael Peter Christen, mc@yacy.net, Frankfurt am Main, Germany + * First released 17.12.2011 at http://yacy.net + * + * $LastChangedDate: 2011-04-14 00:04:23 +0200 (Do, 14 Apr 2011) $ + * $LastChangedRevision: 7653 $ + * $LastChangedBy: orbiter $ + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program in the file lgpl21.txt + * If not, see . + */ + +package net.yacy.cora.lod.vocabulary; + +import java.net.MalformedURLException; +import java.util.HashSet; +import java.util.Set; +import java.util.regex.Pattern; + +import net.yacy.cora.document.MultiProtocolURI; +import net.yacy.cora.lod.Literal; +import net.yacy.cora.lod.Vocabulary; + +/** + * a vocabulary for creative commons license declarations. see: + * http://creativecommons.org/ns# + */ +public enum CreativeCommons implements Vocabulary { + + // License Properties + permits(new Literal[]{ + PermitLiteral.Reproduction, + PermitLiteral.Distribution, + PermitLiteral.DerivativeWorks, + PermitLiteral.Sharing}), + requires(new Literal[]{ + RequirementLiteral.Notice, + RequirementLiteral.Attribution, + RequirementLiteral.ShareAlike, + RequirementLiteral.SourceCode, + RequirementLiteral.Copyleft, + RequirementLiteral.LesserCopyleft}), + prohibits(new Literal[]{ + ProhibitionLiteral.CommercialUse, + ProhibitionLiteral.HighIncomeNationUse}), + jurisdiction, + legalcode, + deprecatedOn, + + // Work Properties + license, + morePermissions, + attributionName, + attributionURL, + useGuidelines; + + enum PermitLiteral implements Literal { + + Reproduction("Reproduction", "http://creativecommons.org/ns#Permission", ".*"), + Distribution("Distribution", "http://creativecommons.org/ns#Permission", ".*"), + DerivativeWorks("Derivative Works", "http://creativecommons.org/ns#Permission", ".*"), + Sharing("Sharing", "http://creativecommons.org/ns#Permission", ".*"); + + String terminal; + MultiProtocolURI subject; + Pattern discoveryPattern; + + private PermitLiteral( + String terminal, + String subject, + String discoveryPattern) { + this.terminal = terminal; + try { + this.subject = subject == null ? null : new MultiProtocolURI(subject); + } catch (MalformedURLException e) { + this.subject = null; + } + this.discoveryPattern = Pattern.compile(discoveryPattern == null ? ".*" : discoveryPattern); + } + + @Override + public String getTerminal() { return this.terminal; } + + @Override + public MultiProtocolURI getSubject() { return this.subject; } + + @Override + public Pattern getDiscoveryPattern() { return this.discoveryPattern; } + } + + enum RequirementLiteral implements Literal { + + Notice("Notice", "http://creativecommons.org/ns#Requirement", ".*"), + Attribution("Attribution", "http://creativecommons.org/ns#Requirement", ".*"), + ShareAlike("Share Alike", "http://creativecommons.org/ns#Requirement", ".*"), + SourceCode("Source Code", "http://creativecommons.org/ns#Requirement", ".*"), + Copyleft("Copyleft", "http://creativecommons.org/ns#Requirement", ".*"), + LesserCopyleft("Lesser Copyleft", "http://creativecommons.org/ns#Requirement", ".*"); + + String terminal; + MultiProtocolURI subject; + Pattern discoveryPattern; + + private RequirementLiteral( + String terminal, + String subject, + String discoveryPattern) { + this.terminal = terminal; + try { + this.subject = subject == null ? null : new MultiProtocolURI(subject); + } catch (MalformedURLException e) { + this.subject = null; + } + this.discoveryPattern = Pattern.compile(discoveryPattern == null ? ".*" : discoveryPattern); + } + + @Override + public String getTerminal() { return this.terminal; } + + @Override + public MultiProtocolURI getSubject() { return this.subject; } + + @Override + public Pattern getDiscoveryPattern() { return this.discoveryPattern; } + } + + enum ProhibitionLiteral implements Literal { + + CommercialUse("Commercial Use", "http://creativecommons.org/ns#Prohibition", ".*"), + HighIncomeNationUse("High Income Nation Use", "http://creativecommons.org/ns#Prohibition", ".*"); + + String terminal; + MultiProtocolURI subject; + Pattern discoveryPattern; + + private ProhibitionLiteral( + String terminal, + String subject, + String discoveryPattern) { + this.terminal = terminal; + try { + this.subject = subject == null ? null : new MultiProtocolURI(subject); + } catch (MalformedURLException e) { + this.subject = null; + } + this.discoveryPattern = Pattern.compile(discoveryPattern == null ? ".*" : discoveryPattern); + } + + @Override + public String getTerminal() { return this.terminal; } + + @Override + public MultiProtocolURI getSubject() { return this.subject; } + + @Override + public Pattern getDiscoveryPattern() { return this.discoveryPattern; } + } + + public final static String IDENTIFIER = "http://creativecommons.org/ns#"; + public final static String PREFIX = "cc"; + + private final String predicate; + private final Set literals; + + private CreativeCommons() { + this.predicate = PREFIX + ":" + this.name(); + this.literals = null; + } + + private CreativeCommons(Literal[] literals) { + this.predicate = PREFIX + ":" + this.name(); + this.literals = new HashSet(); + for (Literal l: literals) this.literals.add(l); + } + + @Override + public String getIdentifier() { + return IDENTIFIER; + } + + @Override + public String getPrefix() { + return PREFIX; + } + + @Override + public Set getLiterals() { + return null; + } + + @Override + public String getPredicate() { + return this.predicate; + } +} diff --git a/source/net/yacy/cora/lod/vocabulary/DublinCore.java b/source/net/yacy/cora/lod/vocabulary/DublinCore.java new file mode 100644 index 000000000..cd461be8c --- /dev/null +++ b/source/net/yacy/cora/lod/vocabulary/DublinCore.java @@ -0,0 +1,79 @@ +/** + * DublinCore + * Copyright 2011 by Michael Peter Christen, mc@yacy.net, Frankfurt am Main, Germany + * First released 16.12.2011 at http://yacy.net + * + * $LastChangedDate: 2011-04-14 00:04:23 +0200 (Do, 14 Apr 2011) $ + * $LastChangedRevision: 7653 $ + * $LastChangedBy: orbiter $ + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program in the file lgpl21.txt + * If not, see . + */ + + +package net.yacy.cora.lod.vocabulary; + +import java.util.Set; + +import net.yacy.cora.lod.Literal; +import net.yacy.cora.lod.Vocabulary; + +public enum DublinCore implements Vocabulary { + + Contributor, + Coverage, + Creator, + Date, + Description, + Format, + Identifier, + Language, + Publisher, + Relation, + Rights, + Source, + Subject, + Title, + Type; + + public final static String IDENTIFIER = "http://dublincore.org/documents/2010/10/11/dces/"; + public final static String PREFIX = "dc"; + + private final String predicate; + + private DublinCore() { + this.predicate = PREFIX + ":" + this.name().toLowerCase(); + } + + @Override + public String getIdentifier() { + return IDENTIFIER; + } + + @Override + public String getPrefix() { + return PREFIX; + } + + @Override + public Set getLiterals() { + return null; + } + + @Override + public String getPredicate() { + return this.predicate; + } +} diff --git a/source/net/yacy/cora/lod/vocabulary/Foaf.java b/source/net/yacy/cora/lod/vocabulary/Foaf.java new file mode 100644 index 000000000..aaa92482d --- /dev/null +++ b/source/net/yacy/cora/lod/vocabulary/Foaf.java @@ -0,0 +1,62 @@ +/** + * Foaf + * Copyright 2011 by Michael Peter Christen, mc@yacy.net, Frankfurt am Main, Germany + * First released 17.12.2011 at http://yacy.net + * + * $LastChangedDate: 2011-04-14 00:04:23 +0200 (Do, 14 Apr 2011) $ + * $LastChangedRevision: 7653 $ + * $LastChangedBy: orbiter $ + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program in the file lgpl21.txt + * If not, see . + */ + +package net.yacy.cora.lod.vocabulary; + +import java.util.Set; + +import net.yacy.cora.lod.Literal; +import net.yacy.cora.lod.Vocabulary; + +/** + * The friend of a friend vocabulary. see: + * http://xmlns.com/foaf/spec/ + */ +public enum Foaf implements Vocabulary { + ; + + @Override + public String getIdentifier() { + // TODO Auto-generated method stub + return null; + } + + @Override + public String getPrefix() { + // TODO Auto-generated method stub + return null; + } + + @Override + public Set getLiterals() { + return null; + } + + @Override + public String getPredicate() { + // TODO Auto-generated method stub + return null; + } + +} diff --git a/source/net/yacy/cora/lod/vocabulary/Geo.java b/source/net/yacy/cora/lod/vocabulary/Geo.java new file mode 100644 index 000000000..60558e405 --- /dev/null +++ b/source/net/yacy/cora/lod/vocabulary/Geo.java @@ -0,0 +1,65 @@ +/** + * Geo + * Copyright 2011 by Michael Peter Christen, mc@yacy.net, Frankfurt am Main, Germany + * First released 16.12.2011 at http://yacy.net + * + * $LastChangedDate: 2011-04-14 00:04:23 +0200 (Do, 14 Apr 2011) $ + * $LastChangedRevision: 7653 $ + * $LastChangedBy: orbiter $ + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program in the file lgpl21.txt + * If not, see . + */ + +package net.yacy.cora.lod.vocabulary; + +import java.util.Set; + +import net.yacy.cora.lod.Literal; +import net.yacy.cora.lod.Vocabulary; + +public enum Geo implements Vocabulary { + + Long, + Lat; + + public final static String IDENTIFIER = "http://www.w3.org/2003/01/geo/wgs84_pos#"; + public final static String PREFIX = "geo"; + + private final String predicate; + + private Geo() { + this.predicate = PREFIX + ":" + this.name().toLowerCase(); + } + + @Override + public String getIdentifier() { + return IDENTIFIER; + } + + @Override + public String getPrefix() { + return PREFIX; + } + + @Override + public Set getLiterals() { + return null; + } + + @Override + public String getPredicate() { + return this.predicate; + } +} \ No newline at end of file diff --git a/source/net/yacy/cora/lod/vocabulary/HttpHeader.java b/source/net/yacy/cora/lod/vocabulary/HttpHeader.java new file mode 100644 index 000000000..34ae898d3 --- /dev/null +++ b/source/net/yacy/cora/lod/vocabulary/HttpHeader.java @@ -0,0 +1,117 @@ +/** + * HttpHeader + * Copyright 2011 by Michael Peter Christen, mc@yacy.net, Frankfurt am Main, Germany + * First released 16.12.2011 at http://yacy.net + * + * $LastChangedDate: 2011-04-14 00:04:23 +0200 (Do, 14 Apr 2011) $ + * $LastChangedRevision: 7653 $ + * $LastChangedBy: orbiter $ + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program in the file lgpl21.txt + * If not, see . + */ + + +package net.yacy.cora.lod.vocabulary; + +import java.util.Set; + +import net.yacy.cora.lod.Literal; +import net.yacy.cora.lod.Vocabulary; + +public enum HttpHeader implements Vocabulary { + + //The following properties may appear in nodes of type Request: + + accept, // representing an Accept header, + acceptCharset, // representing an Accept-Charset header, + acceptEncoding, // representing an Accept-Encoding header, + acceptLanguage, // representing an Accept-Language header, + authorization, // representing an Authorization header, + expect, // representing an Expect header, + from, // representing a From header, + host, // representing a Host header, + ifMatch, // representing an If-Match header, + ifModifiedSince, // representing an If-Modified-Since header, + ifNoneMatch, // representing an If-None-Match header, + ifRange, // representing an If-Range header, + ifUnmodifiedSince, // representing an If-Unmodified-Since header, + maxForwards, // representing a Max-Forwards header, + proxyAuthorization, // representing a Proxy-Authorization header, + range, // representing a Range header, + referer, // representing a Referer header, + te, // representing a TE header, + userAgent, // representing a User-Agent header. + + //The following properties may appear in nodes of type Response: + acceptRanges, // representing a Accept-Ranges header, + age, // representing an Age header, + etag, // representing an ETag header, + location, // representing a Location header, + proxyAuthenticate, // representing a Proxy-Authenticate header, + retryAfter, // representing a Retry-After header, + server, // representing a Server header, + vary, // representing a Vary header, + wwwAuthenticate, // representing a WWW-Authenticate header. + + //The following properties may appear in nodes of type Request or Response: + allow, // representing an Allow header, + cacheControl, // representing a Cache-Control header, + connection, // representing a Connection header, + contentEncoding, // representing a Content-Encoding header, + contentLanguage, // representing a Content-Language header, + contentLength, // representing a Content-Length header, + contentLocation, // representing a Content-Location header, + contentMD5, // representing a Content-MD5 header, + contentRange, // representing a Content-Range header, + contentType, // representing a Content-Type header, + date, // representing a Date header, + expires, // representing an Expires header, + lastModified, // representing a Last-Modified header, + pragma, // representing a Pragma header, + trailer, // representing a Trailer header, + transferEncoding, // representing a Transfer-Encoding header, + upgrade, // representing an Upgrade header, + via, // representing a Via header, + warning; // representing a Warning header. + + public final static String IDENTIFIER = "http://www.w3.org/WAI/ER/HTTP/WD-HTTP-in-RDF-20060131"; + public final static String PREFIX = "http"; + + private final String predicate; + + private HttpHeader() { + this.predicate = PREFIX + ":" + this.name(); + } + + @Override + public String getIdentifier() { + return IDENTIFIER; + } + + @Override + public String getPrefix() { + return PREFIX; + } + + @Override + public Set getLiterals() { + return null; + } + + @Override + public String getPredicate() { + return this.predicate; + } +} diff --git a/source/net/yacy/cora/lod/vocabulary/Rdf.java b/source/net/yacy/cora/lod/vocabulary/Rdf.java new file mode 100644 index 000000000..0081d2fee --- /dev/null +++ b/source/net/yacy/cora/lod/vocabulary/Rdf.java @@ -0,0 +1,69 @@ +/** + * Rdf + * Copyright 2011 by Michael Peter Christen, mc@yacy.net, Frankfurt am Main, Germany + * First released 17.12.2011 at http://yacy.net + * + * $LastChangedDate: 2011-04-14 00:04:23 +0200 (Do, 14 Apr 2011) $ + * $LastChangedRevision: 7653 $ + * $LastChangedBy: orbiter $ + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program in the file lgpl21.txt + * If not, see . + */ + +package net.yacy.cora.lod.vocabulary; + +import java.util.Set; + +import net.yacy.cora.lod.Literal; +import net.yacy.cora.lod.Vocabulary; + +public enum Rdf implements Vocabulary { + + RDF, + Description, + Bag, + Seq, + Alt; + + public final static String IDENTIFIER = "http://www.w3.org/1999/02/22-rdf-syntax-ns#"; + public final static String PREFIX = "rdf"; + + private final String predicate; + + private Rdf() { + this.predicate = PREFIX + ":" + this.name(); + } + + @Override + public String getIdentifier() { + return IDENTIFIER; + } + + @Override + public String getPrefix() { + return PREFIX; + } + + @Override + public Set getLiterals() { + return null; + } + + @Override + public String getPredicate() { + return this.predicate; + } + +} diff --git a/source/net/yacy/cora/lod/vocabulary/YaCyMetadata.java b/source/net/yacy/cora/lod/vocabulary/YaCyMetadata.java new file mode 100644 index 000000000..34d526521 --- /dev/null +++ b/source/net/yacy/cora/lod/vocabulary/YaCyMetadata.java @@ -0,0 +1,105 @@ +/** + * YaCyMetadata + * Copyright 2011 by Michael Peter Christen, mc@yacy.net, Frankfurt am Main, Germany + * First released 16.12.2011 at http://yacy.net + * + * $LastChangedDate: 2011-04-14 00:04:23 +0200 (Do, 14 Apr 2011) $ + * $LastChangedRevision: 7653 $ + * $LastChangedBy: orbiter $ + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program in the file lgpl21.txt + * If not, see . + */ + + +package net.yacy.cora.lod.vocabulary; + +import java.util.Set; + +import net.yacy.cora.lod.Literal; +import net.yacy.cora.lod.Vocabulary; + +/** + * this is the vocabulary of the 'classic' YaCy metadata database + */ +public enum YaCyMetadata implements Vocabulary { + + hash, // the url's hash + mod, // last-modified from the httpd + load, // time when the url was loaded + fresh, // time until this url is fresh + referrer, // (one of) the url's referrer hash(es) + md5, // the md5 of the url content (to identify changes) + size, // size of file in bytes + wc, // size of file by number of words; for video and audio: seconds + dt, // doctype, taken from extension or any other heuristic + flags, // flags; any stuff (see Word-Entity definition) + lang, // language + llocal, // # of outlinks to same domain; for video and image: width + lother, // # of outlinks to outside domain; for video and image: height + limage, // # of embedded image links + laudio, // # of embedded audio links; for audio: track number; for video: number of audio tracks + lvideo, // # of embedded video links + lapp; // # of embedded links to applications + + /* + "String hash-12, " + // the url's hash + "Cardinal mod-4 {b256}, " + // last-modified from the httpd + "Cardinal load-4 {b256}, " + // time when the url was loaded + "Cardinal fresh-4 {b256}, " + // time until this url is fresh + "String referrer-12, " + // (one of) the url's referrer hash(es) + "byte[] md5-8, " + // the md5 of the url content (to identify changes) + "Cardinal size-6 {b256}, " + // size of file in bytes + "Cardinal wc-3 {b256}, " + // size of file by number of words; for video and audio: seconds + "byte[] dt-1, " + // doctype, taken from extension or any other heuristic + "Bitfield flags-4, " + // flags; any stuff (see Word-Entity definition) + "String lang-2, " + // language + "Cardinal llocal-2 {b256}, " + // # of outlinks to same domain; for video and image: width + "Cardinal lother-2 {b256}, " + // # of outlinks to outside domain; for video and image: height + "Cardinal limage-2 {b256}, " + // # of embedded image links + "Cardinal laudio-2 {b256}, " + // # of embedded audio links; for audio: track number; for video: number of audio tracks + "Cardinal lvideo-2 {b256}, " + // # of embedded video links + "Cardinal lapp-2 {b256}", // # of embedded links to applications + */ + + public final static String IDENTIFIER = "http://yacy.net/vocabularies/yacymetadata#"; + public final static String PREFIX = "yacy"; + + private final String predicate; + + private YaCyMetadata() { + this.predicate = PREFIX + ":" + this.name(); + } + + @Override + public String getIdentifier() { + return IDENTIFIER; + } + + @Override + public String getPrefix() { + return PREFIX; + } + + @Override + public Set getLiterals() { + return null; + } + + @Override + public String getPredicate() { + return this.predicate; + } + +} diff --git a/source/net/yacy/cora/ranking/AbstractOrder.java b/source/net/yacy/cora/order/AbstractOrder.java similarity index 98% rename from source/net/yacy/cora/ranking/AbstractOrder.java rename to source/net/yacy/cora/order/AbstractOrder.java index cbc74d556..239d5efd2 100644 --- a/source/net/yacy/cora/ranking/AbstractOrder.java +++ b/source/net/yacy/cora/order/AbstractOrder.java @@ -22,7 +22,8 @@ * If not, see . */ -package net.yacy.cora.ranking; +package net.yacy.cora.order; + public abstract class AbstractOrder implements Order { diff --git a/source/net/yacy/cora/order/ByteOrder.java b/source/net/yacy/cora/order/ByteOrder.java new file mode 100644 index 000000000..b7fc41f12 --- /dev/null +++ b/source/net/yacy/cora/order/ByteOrder.java @@ -0,0 +1,52 @@ +/** + * ByteOrder + * (C) 2008 by Michael Peter Christen; mc@yacy.net, Frankfurt a. M., Germany + * first published 10.01.2008 on http://yacy.net + * + * $LastChangedDate$ + * $LastChangedRevision$ + * $LastChangedBy$ + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program in the file lgpl21.txt + * If not, see . + */ + +package net.yacy.cora.order; + + +public interface ByteOrder extends Order { + + @Override + public boolean wellformed(byte[] a); + + public boolean wellformed(byte[] a, int start, int len); + + @Override + public int compare(byte[] a, byte[] b); + + public int compare(byte[] a, byte[] b, int len); + + public int compare(byte[] a, int astart, byte[] b, int bstart, int len); + + @Override + public boolean equal(final byte[] a, final byte[] b); + + public boolean equal(final byte[] a, int astart, final byte[] b, int bstart, int length); + + public long cardinal(final byte[] a, int off, int len); + + public byte[] smallest(byte[] a, byte[] b); + + public byte[] largest(byte[] a, byte[] b); +} diff --git a/source/net/yacy/cora/order/CloneableIterator.java b/source/net/yacy/cora/order/CloneableIterator.java new file mode 100644 index 000000000..001e48694 --- /dev/null +++ b/source/net/yacy/cora/order/CloneableIterator.java @@ -0,0 +1,35 @@ +/** + * ByteOrder + * (C) 2008 by Michael Peter Christen; mc@yacy.net, Frankfurt a. M., Germany + * first published 10.01.2008 on http://yacy.net + * + * $LastChangedDate$ + * $LastChangedRevision$ + * $LastChangedBy$ + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program in the file lgpl21.txt + * If not, see . + */ + +package net.yacy.cora.order; + +import java.util.Iterator; + +public interface CloneableIterator extends Iterator { + + // clone the iterator using a modifier + // the modifier can be i.e. a re-start position + public CloneableIterator clone(Object modifier); + +} diff --git a/source/net/yacy/cora/order/CloneableMapIterator.java b/source/net/yacy/cora/order/CloneableMapIterator.java new file mode 100644 index 000000000..9ba736c91 --- /dev/null +++ b/source/net/yacy/cora/order/CloneableMapIterator.java @@ -0,0 +1,84 @@ +/** + * ByteOrder + * (C) 2007 by Michael Peter Christen; mc@yacy.net, Frankfurt a. M., Germany + * first published 25.04.2007 on http://yacy.net + * + * $LastChangedDate$ + * $LastChangedRevision$ + * $LastChangedBy$ + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program in the file lgpl21.txt + * If not, see . + */ + +package net.yacy.cora.order; + +import java.util.Iterator; +import java.util.TreeMap; + + + +public class CloneableMapIterator implements CloneableIterator { + + TreeMap map; + E next, last; + Object start; + Iterator iter; + + + public CloneableMapIterator(final TreeMap map, final E start) { + // map must contain eiter a byte[]/Object or a String/Object mapping. + // start must be either of type byte[] or String + // this iterator iterates then only the key elements of the map + this.map = map; + this.start = start; + this.iter = map.keySet().iterator(); + if (this.start == null) { + if (this.iter.hasNext()) this.next = this.iter.next(); else this.next = null; + } else while (this.iter.hasNext()) { + this.next = this.iter.next(); + if (map.comparator().compare(this.next, start) > 1) break; + } + this.last = null; + } + + @Override + @SuppressWarnings("unchecked") + public CloneableMapIterator clone(final Object modifier) { + return new CloneableMapIterator(this.map, (E) modifier); + } + + @Override + public boolean hasNext() { + return this.next != null; + } + + @Override + public E next() { + // returns key-elements, not entry-elements + this.last = this.next; + if (this.iter.hasNext()) { + this.next = this.iter.next(); + } else { + this.next = null; + } + return this.last; + } + + @Override + public void remove() { + this.map.remove(this.last); + } + +} diff --git a/source/net/yacy/cora/ranking/Order.java b/source/net/yacy/cora/order/Order.java similarity index 98% rename from source/net/yacy/cora/ranking/Order.java rename to source/net/yacy/cora/order/Order.java index 6b66cd157..35752f4ec 100644 --- a/source/net/yacy/cora/ranking/Order.java +++ b/source/net/yacy/cora/order/Order.java @@ -22,7 +22,7 @@ * If not, see . */ -package net.yacy.cora.ranking; +package net.yacy.cora.order; import java.util.Comparator; diff --git a/source/net/yacy/cora/order/RatingOrder.java b/source/net/yacy/cora/order/RatingOrder.java new file mode 100644 index 000000000..95b6cb64c --- /dev/null +++ b/source/net/yacy/cora/order/RatingOrder.java @@ -0,0 +1,69 @@ +/** + * RatingOrder.java + * Copyright 2011 by Michael Peter Christen, mc@yacy.net, Frankfurt am Main, Germany + * First released 25.08.2011 at http://yacy.net + * + * $LastChangedDate: 2011-04-14 00:04:23 +0200 (Do, 14 Apr 2011) $ + * $LastChangedRevision: 7653 $ + * $LastChangedBy: orbiter $ + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program in the file lgpl21.txt + * If not, see . + */ + + +package net.yacy.cora.order; + +import net.yacy.cora.sorting.Rating; + + + +public class RatingOrder extends AbstractOrder> implements Order> { + + Order ordering; + + public RatingOrder(final Order ordering) { + this.ordering = ordering; + } + + @Override + public int compare(final Rating a, final Rating b) { + return this.ordering.compare(a.getObject(), b.getObject()); + } + + @Override + public boolean wellformed(final Rating a) { + return true; + } + + @Override + public String signature() { + return "RA"; + } + + @Override + public long cardinal(final Rating key) { + return key.getScore(); + } + + @Override + public boolean equal(final Rating a, final Rating b) { + return this.ordering.compare(a.getObject(), b.getObject()) == 1; + } + + @Override + public Order> clone() { + return this; + } +} diff --git a/source/net/yacy/cora/plugin/ClassProvider.java b/source/net/yacy/cora/plugin/ClassProvider.java index 31cc58a02..988631067 100644 --- a/source/net/yacy/cora/plugin/ClassProvider.java +++ b/source/net/yacy/cora/plugin/ClassProvider.java @@ -1,3 +1,27 @@ +/** + * ClassProvider + * Copyright 201 by Michael Peter Christen, mc@yacy.net, Frankfurt a. M., Germany + * First released 13.12.2011 at http://yacy.net + * + * $LastChangedDate$ + * $LastChangedRevision$ + * $LastChangedBy$ + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program in the file lgpl21.txt + * If not, see . + */ + package net.yacy.cora.plugin; import java.io.File; diff --git a/source/net/yacy/cora/ranking/RatingOrder.java b/source/net/yacy/cora/ranking/RatingOrder.java deleted file mode 100644 index 5d85680ba..000000000 --- a/source/net/yacy/cora/ranking/RatingOrder.java +++ /dev/null @@ -1,66 +0,0 @@ -// RatingOrder.java -// ----------------------- -// (C) by Michael Peter Christen; mc@yacy.net -// first published on http://yacy.net -// Frankfurt, Germany, 2011 -// created 25.08.2011 -// -// $LastChangedDate: 2011-03-08 02:51:51 +0100 (Di, 08 Mrz 2011) $ -// $LastChangedRevision: 7567 $ -// $LastChangedBy: low012 $ -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 2 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - -package net.yacy.cora.ranking; - - -public class RatingOrder extends AbstractOrder> implements Order> { - - Order ordering; - - public RatingOrder(final Order ordering) { - this.ordering = ordering; - } - - public int compare(final Rating a, final Rating b) { - return this.ordering.compare(a.getObject(), b.getObject()); - } - - @Override - public boolean wellformed(final Rating a) { - return true; - } - - @Override - public String signature() { - return "RA"; - } - - @Override - public long cardinal(final Rating key) { - return key.getScore(); - } - - @Override - public boolean equal(final Rating a, final Rating b) { - return this.ordering.compare(a.getObject(), b.getObject()) == 1; - } - - @Override - public Order> clone() { - return this; - } -} diff --git a/source/net/yacy/cora/services/federated/SearchHub.java b/source/net/yacy/cora/services/federated/SearchHub.java index de74ff40c..7394a0225 100644 --- a/source/net/yacy/cora/services/federated/SearchHub.java +++ b/source/net/yacy/cora/services/federated/SearchHub.java @@ -32,10 +32,10 @@ import java.util.concurrent.ConcurrentHashMap; import net.yacy.cora.document.RSSMessage; import net.yacy.cora.protocol.http.HTTPClient; -import net.yacy.cora.ranking.ConcurrentScoreMap; -import net.yacy.cora.ranking.ScoreMap; import net.yacy.cora.services.federated.opensearch.SRURSSConnector; import net.yacy.cora.services.federated.yacy.CacheStrategy; +import net.yacy.cora.sorting.ConcurrentScoreMap; +import net.yacy.cora.sorting.ScoreMap; public class SearchHub { diff --git a/source/net/yacy/cora/services/federated/SearchResult.java b/source/net/yacy/cora/services/federated/SearchResult.java index 820f0e6b6..c0c9e19dd 100644 --- a/source/net/yacy/cora/services/federated/SearchResult.java +++ b/source/net/yacy/cora/services/federated/SearchResult.java @@ -26,7 +26,7 @@ package net.yacy.cora.services.federated; -import net.yacy.cora.ranking.WeakPriorityBlockingQueue; +import net.yacy.cora.sorting.WeakPriorityBlockingQueue; public class SearchResult extends WeakPriorityBlockingQueue { diff --git a/source/net/yacy/cora/ranking/AbstractScoreMap.java b/source/net/yacy/cora/sorting/AbstractScoreMap.java similarity index 98% rename from source/net/yacy/cora/ranking/AbstractScoreMap.java rename to source/net/yacy/cora/sorting/AbstractScoreMap.java index 9a933d31a..40182d476 100644 --- a/source/net/yacy/cora/ranking/AbstractScoreMap.java +++ b/source/net/yacy/cora/sorting/AbstractScoreMap.java @@ -22,7 +22,7 @@ * If not, see . */ -package net.yacy.cora.ranking; +package net.yacy.cora.sorting; import java.util.ArrayList; import java.util.List; diff --git a/source/net/yacy/cora/ranking/ClusteredScoreMap.java b/source/net/yacy/cora/sorting/ClusteredScoreMap.java similarity index 93% rename from source/net/yacy/cora/ranking/ClusteredScoreMap.java rename to source/net/yacy/cora/sorting/ClusteredScoreMap.java index 3aa518c0a..397bd756d 100644 --- a/source/net/yacy/cora/ranking/ClusteredScoreMap.java +++ b/source/net/yacy/cora/sorting/ClusteredScoreMap.java @@ -22,7 +22,7 @@ * If not, see . */ -package net.yacy.cora.ranking; +package net.yacy.cora.sorting; import java.text.ParseException; import java.text.SimpleDateFormat; @@ -58,10 +58,12 @@ public final class ClusteredScoreMap extends AbstractScoreMap implements R this.encnt = 0; } + @Override public Iterator iterator() { return this.map.keySet().iterator(); } + @Override public synchronized void clear() { this.map.clear(); this.pam.clear(); @@ -73,6 +75,7 @@ public final class ClusteredScoreMap extends AbstractScoreMap implements R * shrink the cluster to a demanded size * @param maxsize */ + @Override public void shrinkToMaxSize(final int maxsize) { if (maxsize < 0) return; Long key; @@ -90,6 +93,7 @@ public final class ClusteredScoreMap extends AbstractScoreMap implements R * shrink the cluster in such a way that the smallest score is equal or greater than a given minScore * @param minScore */ + @Override public void shrinkToMinScore(final int minScore) { int score; Long key; @@ -121,7 +125,7 @@ public final class ClusteredScoreMap extends AbstractScoreMap implements R if (o instanceof Long) { final long l = ((Long) o).longValue(); if (l < Integer.MAX_VALUE) return (int) l; - o = ((Long) o).toString(); + return (int) (l & Integer.MAX_VALUE); } if (o instanceof Float) { final double d = 1000f * ((Float) o).floatValue(); @@ -148,13 +152,13 @@ public final class ClusteredScoreMap extends AbstractScoreMap implements R l = Long.parseLong(s); } // fix out-of-ranges - if (l > Integer.MAX_VALUE) return Integer.MAX_VALUE; //(int) (l & (Integer.MAX_VALUE)); + if (l > Integer.MAX_VALUE) return (int) (l & Integer.MAX_VALUE); if (l < 0) { System.out.println("string2score: negative score for input " + s); return 0; } return (int) l; - } catch (final Exception e) { + } catch (final Throwable e) { // try it lex int len = s.length(); if (len > 5) len = 5; @@ -188,26 +192,32 @@ public final class ClusteredScoreMap extends AbstractScoreMap implements R return this.gcount; } + @Override public synchronized int size() { return this.map.size(); } + @Override public boolean sizeSmaller(final int size) { return this.map.size() < size; } + @Override public synchronized boolean isEmpty() { return this.map.isEmpty(); } + @Override public synchronized void inc(final E obj) { inc(obj, 1); } + @Override public synchronized void dec(final E obj) { inc(obj, -1); } + @Override public void set(final E obj, final int newScore) { if (obj == null) return; synchronized (this) { @@ -242,6 +252,7 @@ public final class ClusteredScoreMap extends AbstractScoreMap implements R this.gcount += newScore; } + @Override public void inc(final E obj, final int incrementScore) { if (obj == null) return; synchronized (this) { @@ -277,10 +288,12 @@ public final class ClusteredScoreMap extends AbstractScoreMap implements R this.gcount += incrementScore; } + @Override public void dec(final E obj, final int incrementScore) { inc(obj, -incrementScore); } + @Override public int delete(final E obj) { // deletes entry and returns previous score if (obj == null) return 0; @@ -302,10 +315,12 @@ public final class ClusteredScoreMap extends AbstractScoreMap implements R return oldScore; } + @Override public synchronized boolean containsKey(final E obj) { return this.map.containsKey(obj); } + @Override public int get(final E obj) { if (obj == null) return 0; final Long cs; @@ -316,30 +331,36 @@ public final class ClusteredScoreMap extends AbstractScoreMap implements R return (int) ((cs.longValue() & 0xFFFFFFFF00000000L) >> 32); } + @Override public synchronized int getMaxScore() { if (this.map.isEmpty()) return -1; return (int) ((this.pam.lastKey().longValue() & 0xFFFFFFFF00000000L) >> 32); } + @Override public synchronized int getMinScore() { if (this.map.isEmpty()) return -1; return (int) ((this.pam.firstKey().longValue() & 0xFFFFFFFF00000000L) >> 32); } + @Override public synchronized E getMaxKey() { if (this.map.isEmpty()) return null; return this.pam.get(this.pam.lastKey()); } + @Override public synchronized E getMinKey() { if (this.map.isEmpty()) return null; return this.pam.get(this.pam.firstKey()); } + @Override public String toString() { return this.map + " / " + this.pam; } + @Override public synchronized Iterator keys(final boolean up) { if (up) return new simpleScoreIterator(); return new reverseScoreIterator(); @@ -354,10 +375,12 @@ public final class ClusteredScoreMap extends AbstractScoreMap implements R this.view = ClusteredScoreMap.this.pam; } + @Override public boolean hasNext() { return !this.view.isEmpty(); } + @Override public E next() { this.key = this.view.lastKey(); this.view = this.view.headMap(this.key); @@ -366,6 +389,7 @@ public final class ClusteredScoreMap extends AbstractScoreMap implements R return value; } + @Override public void remove() { final Object val = ClusteredScoreMap.this.pam.remove(this.key); if (val != null) ClusteredScoreMap.this.map.remove(val); @@ -382,16 +406,19 @@ public final class ClusteredScoreMap extends AbstractScoreMap implements R this.ii = ClusteredScoreMap.this.pam.entrySet().iterator(); } + @Override public boolean hasNext() { return this.ii.hasNext(); } + @Override public E next() { this.entry = this.ii.next(); //System.out.println("cluster simple iterator: score = " + ((((Long) entry.getKey()).longValue() & 0xFFFFFFFF00000000L) >> 32) + ", handle = " + (((Long) entry.getKey()).longValue() & 0xFFFFFFFFL) + ", value = " + entry.getValue()); return this.entry.getValue(); } + @Override public void remove() { this.ii.remove(); if (this.entry.getValue() != null) ClusteredScoreMap.this.map.remove(this.entry.getValue()); diff --git a/source/net/yacy/cora/ranking/ConcurrentScoreMap.java b/source/net/yacy/cora/sorting/ConcurrentScoreMap.java similarity index 99% rename from source/net/yacy/cora/ranking/ConcurrentScoreMap.java rename to source/net/yacy/cora/sorting/ConcurrentScoreMap.java index 102335835..2a0ac3b4c 100644 --- a/source/net/yacy/cora/ranking/ConcurrentScoreMap.java +++ b/source/net/yacy/cora/sorting/ConcurrentScoreMap.java @@ -22,7 +22,7 @@ * If not, see . */ -package net.yacy.cora.ranking; +package net.yacy.cora.sorting; import java.util.ArrayList; import java.util.HashSet; diff --git a/source/net/yacy/cora/ranking/OrderedScoreMap.java b/source/net/yacy/cora/sorting/OrderedScoreMap.java similarity index 99% rename from source/net/yacy/cora/ranking/OrderedScoreMap.java rename to source/net/yacy/cora/sorting/OrderedScoreMap.java index 2ad3872a9..d0b2e40a3 100644 --- a/source/net/yacy/cora/ranking/OrderedScoreMap.java +++ b/source/net/yacy/cora/sorting/OrderedScoreMap.java @@ -22,7 +22,7 @@ * If not, see . */ -package net.yacy.cora.ranking; +package net.yacy.cora.sorting; import java.util.ArrayList; import java.util.Comparator; diff --git a/source/net/yacy/cora/ranking/Rating.java b/source/net/yacy/cora/sorting/Rating.java similarity index 98% rename from source/net/yacy/cora/ranking/Rating.java rename to source/net/yacy/cora/sorting/Rating.java index 6b8fc80c7..96f50d33d 100644 --- a/source/net/yacy/cora/ranking/Rating.java +++ b/source/net/yacy/cora/sorting/Rating.java @@ -22,7 +22,7 @@ * If not, see . */ -package net.yacy.cora.ranking; +package net.yacy.cora.sorting; import java.util.Comparator; diff --git a/source/net/yacy/cora/ranking/ReversibleScoreMap.java b/source/net/yacy/cora/sorting/ReversibleScoreMap.java similarity index 97% rename from source/net/yacy/cora/ranking/ReversibleScoreMap.java rename to source/net/yacy/cora/sorting/ReversibleScoreMap.java index 6b35ea074..09e2fe74a 100644 --- a/source/net/yacy/cora/ranking/ReversibleScoreMap.java +++ b/source/net/yacy/cora/sorting/ReversibleScoreMap.java @@ -22,7 +22,7 @@ * If not, see . */ -package net.yacy.cora.ranking; +package net.yacy.cora.sorting; public interface ReversibleScoreMap extends ScoreMap { diff --git a/source/net/yacy/cora/ranking/ScoreComparator.java b/source/net/yacy/cora/sorting/ScoreComparator.java similarity index 98% rename from source/net/yacy/cora/ranking/ScoreComparator.java rename to source/net/yacy/cora/sorting/ScoreComparator.java index 41493073c..23919e443 100644 --- a/source/net/yacy/cora/ranking/ScoreComparator.java +++ b/source/net/yacy/cora/sorting/ScoreComparator.java @@ -22,7 +22,7 @@ * If not, see . */ -package net.yacy.cora.ranking; +package net.yacy.cora.sorting; import java.util.Comparator; diff --git a/source/net/yacy/cora/ranking/ScoreMap.java b/source/net/yacy/cora/sorting/ScoreMap.java similarity index 98% rename from source/net/yacy/cora/ranking/ScoreMap.java rename to source/net/yacy/cora/sorting/ScoreMap.java index 2f53d99dc..66e90bf3b 100644 --- a/source/net/yacy/cora/ranking/ScoreMap.java +++ b/source/net/yacy/cora/sorting/ScoreMap.java @@ -22,7 +22,7 @@ * If not, see . */ -package net.yacy.cora.ranking; +package net.yacy.cora.sorting; import java.util.Iterator; import java.util.List; diff --git a/source/net/yacy/cora/ranking/WeakPriorityBlockingQueue.java b/source/net/yacy/cora/sorting/WeakPriorityBlockingQueue.java similarity index 99% rename from source/net/yacy/cora/ranking/WeakPriorityBlockingQueue.java rename to source/net/yacy/cora/sorting/WeakPriorityBlockingQueue.java index 9e35a5b36..879e6e5ed 100644 --- a/source/net/yacy/cora/ranking/WeakPriorityBlockingQueue.java +++ b/source/net/yacy/cora/sorting/WeakPriorityBlockingQueue.java @@ -23,7 +23,7 @@ * If not, see . */ -package net.yacy.cora.ranking; +package net.yacy.cora.sorting; import java.util.ArrayList; import java.util.Comparator; diff --git a/source/net/yacy/cora/storage/AbstractMapStore.java b/source/net/yacy/cora/storage/AbstractMapStore.java new file mode 100644 index 000000000..df030c3e2 --- /dev/null +++ b/source/net/yacy/cora/storage/AbstractMapStore.java @@ -0,0 +1,110 @@ +/** + * AbstractMapStore + * Copyright 2011 by Michael Peter Christen, mc@yacy.net, Frankfurt am Main, Germany + * First released 16.12.2011 at http://yacy.net + * + * $LastChangedDate: 2011-04-14 00:04:23 +0200 (Do, 14 Apr 2011) $ + * $LastChangedRevision: 7653 $ + * $LastChangedBy: orbiter $ + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program in the file lgpl21.txt + * If not, see . + */ + +package net.yacy.cora.storage; + +import java.util.AbstractMap; +import java.util.Collection; +import java.util.Iterator; +import java.util.Map; +import java.util.Set; + +import net.yacy.cora.document.UTF8; + +public abstract class AbstractMapStore implements MapStore { + + @Override + public boolean containsValue(Object arg0) { + throw new UnsupportedOperationException("ContainsValue() not appropriate, use outer indexing"); + } + + @Override + public Set>> entrySet() { + throw new UnsupportedOperationException("entrySet() not appropriate, use an iterator"); + } + + @Override + public Set keySet() { + throw new UnsupportedOperationException("keySet() not appropriate, use an iterator"); + } + + @Override + public void putAll(Map> entries) { + if (entries instanceof MapStore) { + Iterator>> i = ((MapStore) entries).iterator(); + Map.Entry> entry; + while (i.hasNext()) { + entry = i.next(); + this.put(entry.getKey(), entry.getValue()); + } + } else { + for (Map.Entry> e: entries.entrySet()) { + this.put(e.getKey(), e.getValue()); + } + } + } + + @Override + public Collection> values() { + throw new UnsupportedOperationException("values() not appropriate, use an iterator"); + } + + @Override + public Iterator>> iterator() { + final Iterator k = this.keyIterator(); + return new Iterator>>(){ + + @Override + public boolean hasNext() { + return k.hasNext(); + } + + @Override + public Map.Entry> next() { + byte[] key = k.next(); + if (key == null) return null; + return new AbstractMap.SimpleImmutableEntry>(key, AbstractMapStore.this.get(key)); + } + + @Override + public void remove() { + k.remove(); + } + + }; + } + + public static String map2String(Map map) { + StringBuilder sb = new StringBuilder(map.size() * 50); + sb.append("\n"); + for (Map.Entry entry: map.entrySet()) { + sb.append('<').append(entry.getKey()).append('>'); + sb.append(UTF8.String(entry.getValue())); + sb.append("\n"); + } + sb.append("\n"); + return sb.toString(); + } + +} diff --git a/source/net/yacy/cora/storage/MapStore.java b/source/net/yacy/cora/storage/MapStore.java new file mode 100644 index 000000000..5a051b40e --- /dev/null +++ b/source/net/yacy/cora/storage/MapStore.java @@ -0,0 +1,56 @@ +/** + * MapStore + * Copyright 2011 by Michael Peter Christen, mc@yacy.net, Frankfurt am Main, Germany + * First released 16.12.2011 at http://yacy.net + * + * $LastChangedDate: 2011-04-14 00:04:23 +0200 (Do, 14 Apr 2011) $ + * $LastChangedRevision: 7653 $ + * $LastChangedBy: orbiter $ + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program in the file lgpl21.txt + * If not, see . + */ + + +package net.yacy.cora.storage; + +import java.util.Map; + +import net.yacy.cora.order.ByteOrder; +import net.yacy.cora.order.CloneableIterator; + +/** + * this is a placeholder interface + * for the complex expressionMap> + * + */ +public interface MapStore extends Map>, Iterable>> { + + /** + * the map should have an ordering on the key elements + * @return a byte order on the key elements + */ + public ByteOrder getOrdering(); + + /** + * the keys of the map should be iterable + * @return an iterator on the map keys + */ + public CloneableIterator keyIterator(); + + /** + * most of the MapStore implementations are file-based, so we should consider a close method + */ + public void close(); +} diff --git a/source/net/yacy/dbtest.java b/source/net/yacy/dbtest.java index ed3fc981f..fe1e92367 100644 --- a/source/net/yacy/dbtest.java +++ b/source/net/yacy/dbtest.java @@ -12,13 +12,13 @@ import java.util.Random; import javax.imageio.ImageIO; import net.yacy.cora.document.UTF8; +import net.yacy.cora.order.CloneableIterator; import net.yacy.kelondro.index.Index; import net.yacy.kelondro.index.Row; import net.yacy.kelondro.index.RowSet; import net.yacy.kelondro.index.RowSpaceExceededException; import net.yacy.kelondro.logging.Log; import net.yacy.kelondro.order.Base64Order; -import net.yacy.kelondro.order.CloneableIterator; import net.yacy.kelondro.order.NaturalOrder; import net.yacy.kelondro.table.SQLTable; import net.yacy.kelondro.table.SplitTable; diff --git a/source/net/yacy/document/WordCache.java b/source/net/yacy/document/WordCache.java index ebbeac1c6..f12c0ea1f 100644 --- a/source/net/yacy/document/WordCache.java +++ b/source/net/yacy/document/WordCache.java @@ -36,7 +36,7 @@ import java.util.TreeSet; import java.util.concurrent.atomic.AtomicInteger; import java.util.zip.GZIPInputStream; -import net.yacy.cora.ranking.OrderedScoreMap; +import net.yacy.cora.sorting.OrderedScoreMap; import net.yacy.kelondro.logging.Log; import net.yacy.kelondro.util.MemoryControl; diff --git a/source/net/yacy/document/parser/html/ContentScraper.java b/source/net/yacy/document/parser/html/ContentScraper.java index caf7bdd18..0a772f27b 100644 --- a/source/net/yacy/document/parser/html/ContentScraper.java +++ b/source/net/yacy/document/parser/html/ContentScraper.java @@ -46,7 +46,7 @@ import java.util.regex.Pattern; import javax.swing.event.EventListenerList; import net.yacy.cora.document.MultiProtocolURI; -import net.yacy.cora.ranking.ClusteredScoreMap; +import net.yacy.cora.sorting.ClusteredScoreMap; import net.yacy.document.SentenceReader; import net.yacy.document.parser.htmlParser; import net.yacy.document.parser.html.Evaluation.Element; @@ -115,17 +115,17 @@ public class ContentScraper extends AbstractScraper implements Scraper { } // class variables: collectors for links - private Map anchors; + private final Map anchors; private final Map rss, css; private final Set script, frames, iframes; - private Map images; // urlhash/image relation + private final Map images; // urlhash/image relation private final Map metas; private String title; //private String headline; private List[] headlines; private final ClusteredScoreMap bold, italic; private final List li; - private CharBuffer content; + private final CharBuffer content; private final EventListenerList htmlFilterEventListeners; private float lon, lat; private MultiProtocolURI canonical; @@ -187,23 +187,7 @@ public class ContentScraper extends AbstractScraper implements Scraper { this.anchors.put(url, p0); } - /* - private void mergeAnchors(final MultiProtocolURI url, final String key, final String value) { - if (value == null) return; - if (value.length() == 0) return; - Properties p0 = this.anchors.get(url); - if (p0 == null) { - p0 = new Properties(); - p0.put(key, value); - this.anchors.put(url, p0); - return; - } - // merge properties - p0.put(key, value); - this.anchors.put(url, p0); - } - */ - + @Override public void scrapeText(final char[] newtext, final String insideTag) { // System.out.println("SCRAPE: " + UTF8.String(newtext)); int p, pl, q, s = 0; @@ -295,7 +279,10 @@ public class ContentScraper extends AbstractScraper implements Scraper { } catch (final MalformedURLException e) {} } // append string to content - if (b.length() != 0) this.content.append(b).append(32); + if (!b.isEmpty()) { + this.content.append(b); + this.content.appendSpace(); + } } private final static Pattern dpssp = Pattern.compile("://"); @@ -317,6 +304,7 @@ public class ContentScraper extends AbstractScraper implements Scraper { } } + @Override public void scrapeTag0(final String tagname, final Properties tagopts) { if (tagname.equalsIgnoreCase("img")) { final String src = tagopts.getProperty("src", EMPTY_STRING); @@ -407,6 +395,7 @@ public class ContentScraper extends AbstractScraper implements Scraper { fireScrapeTag0(tagname, tagopts); } + @Override public void scrapeTag1(final String tagname, final Properties tagopts, final char[] text) { // System.out.println("ScrapeTag1: tagname=" + tagname + ", opts=" + tagopts.toString() + ", text=" + UTF8.String(text)); if (tagname.equalsIgnoreCase("a") && text.length < 2048) { @@ -481,6 +470,7 @@ public class ContentScraper extends AbstractScraper implements Scraper { } + @Override public void scrapeComment(final char[] comment) { this.evaluationScores.match(Element.comment, comment); } @@ -837,11 +827,11 @@ public class ContentScraper extends AbstractScraper implements Scraper { public void close() { // free resources super.close(); - this.anchors = null; - this.images = null; + this.anchors.clear(); + this.images.clear(); this.title = null; this.headlines = null; - this.content = null; + this.content.clear(); this.root = null; } diff --git a/source/net/yacy/document/parser/html/ContentTransformer.java b/source/net/yacy/document/parser/html/ContentTransformer.java index 19a465d75..1858613e3 100644 --- a/source/net/yacy/document/parser/html/ContentTransformer.java +++ b/source/net/yacy/document/parser/html/ContentTransformer.java @@ -55,17 +55,18 @@ public class ContentTransformer extends AbstractTransformer implements Transform super(linkTags0, linkTags1); } + @Override public void init(final String initarg) { - if (bluelist == null) { + if (this.bluelist == null) { // here, the init arg is used to load a list of blue-listed words - bluelist = new ArrayList(); + this.bluelist = new ArrayList(); final File f = new File(initarg); if (f.canRead()) { try { final BufferedReader r = new BufferedReader(new FileReader(f)); String s; while ((s = r.readLine()) != null) { - if (s.length() > 0 && s.charAt(0) != '#') bluelist.add(s.toLowerCase()); + if (s.length() > 0 && s.charAt(0) != '#') this.bluelist.add(s.toLowerCase()); } r.close(); } catch (final IOException e) { @@ -75,8 +76,9 @@ public class ContentTransformer extends AbstractTransformer implements Transform } } + @Override public boolean isIdentityTransformer() { - return bluelist.isEmpty(); + return this.bluelist.isEmpty(); } private static char[] genBlueLetters(int length) { @@ -84,7 +86,7 @@ public class ContentTransformer extends AbstractTransformer implements Transform length = length / 2; if (length > 10) length = 7; while (length-- > 0) { - bb.append((int)'X'); + bb.append('X'); } bb.append(" "); final char[] result = bb.getChars(); @@ -97,16 +99,17 @@ public class ContentTransformer extends AbstractTransformer implements Transform } private boolean bluelistHit(final char[] text) { - if (text == null || bluelist == null) return false; + if (text == null || this.bluelist == null) return false; final String lc = new String(text).toLowerCase(); - for (int i = 0; i < bluelist.size(); i++) { - if (lc.indexOf(bluelist.get(i)) >= 0) return true; + for (int i = 0; i < this.bluelist.size(); i++) { + if (lc.indexOf(this.bluelist.get(i)) >= 0) return true; } return false; } + @Override public char[] transformText(final char[] text) { - if (bluelist != null) { + if (this.bluelist != null) { if (bluelistHit(text)) { // System.out.println("FILTERHIT: " + text); return genBlueLetters(text.length); diff --git a/source/net/yacy/document/parser/html/Evaluation.java b/source/net/yacy/document/parser/html/Evaluation.java index b2e2a00bd..3c675a4b0 100644 --- a/source/net/yacy/document/parser/html/Evaluation.java +++ b/source/net/yacy/document/parser/html/Evaluation.java @@ -36,7 +36,7 @@ import java.util.Set; import java.util.regex.Pattern; import java.util.regex.PatternSyntaxException; -import net.yacy.cora.ranking.ClusteredScoreMap; +import net.yacy.cora.sorting.ClusteredScoreMap; import net.yacy.kelondro.logging.Log; import net.yacy.kelondro.util.MemoryControl; diff --git a/source/net/yacy/document/parser/html/TransformerWriter.java b/source/net/yacy/document/parser/html/TransformerWriter.java index ccebeed9a..6670aa27d 100644 --- a/source/net/yacy/document/parser/html/TransformerWriter.java +++ b/source/net/yacy/document/parser/html/TransformerWriter.java @@ -82,7 +82,7 @@ public final class TransformerWriter extends Writer { final Transformer transformer, final boolean passbyIfBinarySuspect ) { - this(outStream, charSet, scraper, transformer, passbyIfBinarySuspect, 1024); + this(outStream, charSet, scraper, transformer, passbyIfBinarySuspect, 4096); } public TransformerWriter( @@ -115,9 +115,9 @@ public final class TransformerWriter extends Writer { public static char[] genTag0raw(final String tagname, final boolean opening, final char[] tagopts) { final CharBuffer bb = new CharBuffer(tagname.length() + tagopts.length + 3); - bb.append((int)'<'); + bb.append('<'); if (!opening) { - bb.append((int)'/'); + bb.append('/'); } bb.append(tagname); if (tagopts.length > 0) { @@ -125,7 +125,7 @@ public final class TransformerWriter extends Writer { bb.append(tagopts); // else bb.append((byte) 32).append(tagopts); } - bb.append((int)'>'); + bb.append('>'); final char[] result = bb.getChars(); try { bb.close(); @@ -137,15 +137,15 @@ public final class TransformerWriter extends Writer { public static char[] genTag1raw(final String tagname, final char[] tagopts, final char[] text) { final CharBuffer bb = new CharBuffer(2 * tagname.length() + tagopts.length + text.length + 5); - bb.append((int)'<').append(tagname); + bb.append('<').append(tagname); if (tagopts.length > 0) { // if (tagopts[0] == (byte) 32) bb.append(tagopts); // else bb.append((byte) 32).append(tagopts); } - bb.append((int)'>'); + bb.append('>'); bb.append(text); - bb.append((int)'<').append((int)'/').append(tagname).append((int)'>'); + bb.append('<').append('/').append(tagname).append('>'); final char[] result = bb.getChars(); try { bb.close(); @@ -158,12 +158,12 @@ public final class TransformerWriter extends Writer { public static char[] genTag0(final String tagname, final Properties tagopts, final char quotechar) { final char[] tagoptsx = (tagopts.isEmpty()) ? null : genOpts(tagopts, quotechar); final CharBuffer bb = new CharBuffer(tagname.length() + ((tagoptsx == null) ? 0 : (tagoptsx.length + 1)) + tagname.length() + 2); - bb.append((int)'<').append(tagname); + bb.append('<').append(tagname); if (tagoptsx != null) { - bb.append(32); + bb.appendSpace(); bb.append(tagoptsx); } - bb.append((int)'>'); + bb.append('>'); final char[] result = bb.getChars(); try { bb.close(); @@ -176,7 +176,7 @@ public final class TransformerWriter extends Writer { public static char[] genTag1(final String tagname, final Properties tagopts, final char[] text, final char quotechar) { final char[] gt0 = genTag0(tagname, tagopts, quotechar); final CharBuffer cb = new CharBuffer(gt0, gt0.length + text.length + tagname.length() + 3); - cb.append(text).append((int)'<').append((int)'/').append(tagname).append((int)'>'); + cb.append(text).append('<').append('/').append(tagname).append('>'); final char[] result = cb.getChars(); try { cb.close(); @@ -193,9 +193,9 @@ public final class TransformerWriter extends Writer { String key; while (e.hasMoreElements()) { key = (String) e.nextElement(); - bb.append(32).append(key).append((int)'=').append((int)quotechar); + bb.appendSpace().append(key).append('=').append(quotechar); bb.append(prop.getProperty(key)); - bb.append((int)quotechar); + bb.append(quotechar); } final char[] result; if (bb.length() > 0) @@ -530,12 +530,14 @@ public final class TransformerWriter extends Writer { write(b, 0, b.length); } + @Override public void write(final char b[], final int off, final int len) throws IOException { // System.out.println(UTF8.String(b, off, len)); if ((off | len | (b.length - (len + off)) | (off + len)) < 0) throw new IndexOutOfBoundsException(); for (int i = off ; i < (len - off) ; i++) this.write(b[i]); } + @Override public void flush() throws IOException { // we cannot flush the current string this.buffer to prevent that // the filter process is messed up @@ -544,6 +546,7 @@ public final class TransformerWriter extends Writer { // if you want to flush all, call close() at end of writing; } + @Override public void close() throws IOException { final char quotechar = (this.inSingleQuote) ? singlequote : doublequote; if (this.buffer != null) { diff --git a/source/net/yacy/document/parser/htmlParser.java b/source/net/yacy/document/parser/htmlParser.java index 0f9b839f0..117cd884e 100644 --- a/source/net/yacy/document/parser/htmlParser.java +++ b/source/net/yacy/document/parser/htmlParser.java @@ -83,6 +83,7 @@ public class htmlParser extends AbstractParser implements Parser { this.SUPPORTED_MIME_TYPES.add("text/csv"); } + @Override public Document[] parse( final MultiProtocolURI location, final String mimeType, @@ -196,7 +197,7 @@ public class htmlParser extends AbstractParser implements Parser { // parsing the content final ContentScraper scraper = new ContentScraper(location); - final TransformerWriter writer = new TransformerWriter(null,null,scraper,null,false, sourceStream.available()); + final TransformerWriter writer = new TransformerWriter(null,null,scraper,null,false, Math.max(4096, sourceStream.available())); try { FileUtils.copy(sourceStream, writer, c); } catch (final IOException e) { diff --git a/source/net/yacy/kelondro/blob/ArrayStack.java b/source/net/yacy/kelondro/blob/ArrayStack.java index 3504edbea..e72fec70f 100755 --- a/source/net/yacy/kelondro/blob/ArrayStack.java +++ b/source/net/yacy/kelondro/blob/ArrayStack.java @@ -50,10 +50,10 @@ import java.util.concurrent.TimeUnit; import net.yacy.cora.date.GenericFormatter; import net.yacy.cora.document.ASCII; import net.yacy.cora.document.UTF8; +import net.yacy.cora.order.ByteOrder; +import net.yacy.cora.order.CloneableIterator; import net.yacy.kelondro.index.RowSpaceExceededException; import net.yacy.kelondro.logging.Log; -import net.yacy.kelondro.order.ByteOrder; -import net.yacy.kelondro.order.CloneableIterator; import net.yacy.kelondro.order.MergeIterator; import net.yacy.kelondro.order.NaturalOrder; import net.yacy.kelondro.rwi.Reference; diff --git a/source/net/yacy/kelondro/blob/BEncodedHeap.java b/source/net/yacy/kelondro/blob/BEncodedHeap.java index d1e4072f0..31e4fa6db 100644 --- a/source/net/yacy/kelondro/blob/BEncodedHeap.java +++ b/source/net/yacy/kelondro/blob/BEncodedHeap.java @@ -38,10 +38,12 @@ import java.util.regex.Pattern; import net.yacy.cora.document.ASCII; import net.yacy.cora.document.UTF8; +import net.yacy.cora.order.ByteOrder; +import net.yacy.cora.order.CloneableIterator; +import net.yacy.cora.storage.MapStore; import net.yacy.kelondro.index.RowSpaceExceededException; import net.yacy.kelondro.logging.Log; import net.yacy.kelondro.order.Base64Order; -import net.yacy.kelondro.order.ByteOrder; import net.yacy.kelondro.order.Digest; import net.yacy.kelondro.order.NaturalOrder; import net.yacy.kelondro.util.BDecoder; @@ -53,9 +55,7 @@ import net.yacy.kelondro.util.FileUtils; * store a table of properties (instead of fixed-field entries) this is realized using blobs and BEncoded * property lists */ -public class BEncodedHeap implements Map>, - Iterable>> -{ +public class BEncodedHeap implements MapStore { private Heap table; private final LinkedHashSet columnames; @@ -89,6 +89,42 @@ public class BEncodedHeap implements Map>, this.columnames = new LinkedHashSet(); } + @Override + public ByteOrder getOrdering() { + return this.table.ordering; + } + + @Override + public CloneableIterator keyIterator() { + try { + return this.table.keys(true, false); + } catch (IOException e) { + Log.logSevere("BEncodedHeap", "returning empty iterator for failed key iteration: " + e.getMessage(), e); + return new CloneableIterator(){ + + @Override + public boolean hasNext() { + return false; + } + + @Override + public byte[] next() { + return null; + } + + @Override + public void remove() { + } + + @Override + public CloneableIterator clone(Object modifier) { + return this; + } + + }; + } + } + public byte[] encodedKey(final String key) { return Base64Order.enhancedCoder.encodeSubstring(Digest.encodeMD5Raw(key), this.table.keylength); } @@ -487,7 +523,10 @@ public class BEncodedHeap implements Map>, * are flushed */ public void close() { + int s = this.size(); + File f = this.table.heapFile; this.table.close(); + if (s == 0) f.delete(); } /** diff --git a/source/net/yacy/kelondro/blob/BEncodedHeapBag.java b/source/net/yacy/kelondro/blob/BEncodedHeapBag.java new file mode 100644 index 000000000..99f569912 --- /dev/null +++ b/source/net/yacy/kelondro/blob/BEncodedHeapBag.java @@ -0,0 +1,339 @@ +/** + * BEncodedHeapBag + * Copyright 2011 by Michael Peter Christen, mc@yacy.net, Frankfurt am Main, Germany + * First released 16.12.2011 at http://yacy.net + * + * $LastChangedDate: 2011-04-14 00:04:23 +0200 (Do, 14 Apr 2011) $ + * $LastChangedRevision: 7653 $ + * $LastChangedBy: orbiter $ + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program in the file lgpl21.txt + * If not, see . + */ + +package net.yacy.kelondro.blob; + +import java.io.File; +import java.io.IOException; +import java.text.ParseException; +import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +import net.yacy.cora.date.GenericFormatter; +import net.yacy.cora.document.UTF8; +import net.yacy.cora.order.ByteOrder; +import net.yacy.cora.order.CloneableIterator; +import net.yacy.cora.storage.AbstractMapStore; +import net.yacy.cora.storage.MapStore; +import net.yacy.kelondro.data.word.Word; +import net.yacy.kelondro.logging.Log; +import net.yacy.kelondro.order.Base64Order; +import net.yacy.kelondro.order.MergeIterator; +import net.yacy.kelondro.util.FileUtils; + +public class BEncodedHeapBag extends AbstractMapStore implements MapStore { + + private Map bag; // a map from a date string to a kelondroIndex object + private final File baseDir; + private final String prefix; + private final int keylength, buffermax; + private final ByteOrder entryOrder; + private String current; + private final long fileAgeLimit; + private final long fileSizeLimit; + + public BEncodedHeapBag( + final File path, + final String prefix, + final int keylength, + final ByteOrder ordering, + final int buffermax, + final long fileAgeLimit, + final long fileSizeLimit) { + this.baseDir = path; + this.prefix = prefix; + this.keylength = keylength; + this.buffermax = buffermax; + this.entryOrder = ordering; + this.fileAgeLimit = fileAgeLimit; + this.fileSizeLimit = fileSizeLimit; + init(); + } + + private void init() { + this.current = null; + + // initialized tables map + this.bag = new HashMap(); + if (!(this.baseDir.exists())) this.baseDir.mkdirs(); + String[] tablefile = this.baseDir.list(); + + // first pass: find tables + final HashMap t = new HashMap(); + long ram, time, maxtime = 0; + Date d; + File f; + for (final String element : tablefile) { + if ((element.startsWith(this.prefix)) && + (element.length() > this.prefix.length()) && + (element.charAt(this.prefix.length()) == '.') && + (element.length() == this.prefix.length() + 23)) { + f = new File(this.baseDir, element); + try { + d = GenericFormatter.SHORT_MILSEC_FORMATTER.parse(element.substring(this.prefix.length() + 1, this.prefix.length() + 18)); + } catch (final ParseException e) { + Log.logSevere("BEncodedHeapBag", "", e); + continue; + } + time = d.getTime(); + if (time > maxtime) { + this.current = element; + assert this.current != null; + maxtime = time; + } + + t.put(element, f.length()); + } + } + + // second pass: open tables + Iterator> i; + Map.Entry entry; + String maxf; + long maxram; + while (!t.isEmpty()) { + // find maximum table + maxram = 0; + maxf = null; + i = t.entrySet().iterator(); + while (i.hasNext()) { + entry = i.next(); + ram = entry.getValue().longValue(); + if (maxf == null || ram > maxram) { + maxf = entry.getKey(); + maxram = ram; + } + } + + // open next biggest table + t.remove(maxf); + f = new File(this.baseDir, maxf); + try { + Log.logInfo("BEncodedHeapBag", "opening partial heap " + f); + BEncodedHeap heap = new BEncodedHeap(f, this.keylength, this.entryOrder, this.buffermax); + this.bag.put(maxf, heap); + } catch (IOException e) { + Log.logSevere("BEncodedHeapBag", "error opening partial heap " + f); + } + } + } + + @Override + public synchronized void close() { + if (this.bag == null) return; + + final Iterator i = this.bag.values().iterator(); + while (i.hasNext()) { + i.next().close(); + } + this.bag = null; + } + + @Override + public void clear() { + close(); + final String[] l = this.baseDir.list(); + for (final String element : l) { + if (element.startsWith(this.prefix)) { + final File f = new File(this.baseDir, element); + if (!f.isDirectory()) FileUtils.deletedelete(f); + } + } + init(); + } + + private MapStore keeperOf(final byte[] key) { + if (key == null) return null; + if (this.bag == null) return null; + for (final MapStore oi: this.bag.values()) { + if (oi.containsKey(key)) return oi; + } + return null; + } + + private String newFilename() { + return this.prefix + "." + GenericFormatter.SHORT_MILSEC_FORMATTER.format() + ".heap"; + } + + private MapStore newHeap() { + this.current = newFilename(); + final File f = new File(this.baseDir, this.current); + BEncodedHeap heap; + try { + heap = new BEncodedHeap(f, this.keylength, this.entryOrder, this.buffermax); + } catch (IOException e) { + Log.logSevere("BEncodedHeapBag", "unable to open new heap file: " + e.getMessage(), e); + return null; + } + this.bag.put(this.current, heap); + return heap; + } + + private MapStore checkHeap(final BEncodedHeap heap) { + // check size and age of given table; in case it is too large or too old + // create a new table + assert heap != null; + long t = System.currentTimeMillis(); + if (((t / 1000) % 10) != 0) return heap; // we check only every 10 seconds because all these file and parser operations are very expensive + final String name = heap.getFile().getName(); + long d; + try { + d = GenericFormatter.SHORT_MILSEC_FORMATTER.parse(name.substring(this.prefix.length() + 1, this.prefix.length() + 18)).getTime(); + } catch (final ParseException e) { + Log.logSevere("BEncodedHeapBag", "", e); + d = 0; + } + if (d + this.fileAgeLimit < t || new File(this.baseDir, name).length() >= this.fileSizeLimit) { + return newHeap(); + } + return heap; + } + + @Override + public boolean containsKey(Object key) { + if (key == null || !(key instanceof byte[])) return false; + synchronized (this.bag) { + return keeperOf((byte[]) key) != null; + } + } + + @Override + public Map put(byte[] key, Map map) { + if (this.bag == null) return null; + MapStore keeper = null; + synchronized (this.bag) { + keeper = keeperOf(key); + } + if (keeper != null) { + return keeper.put(key, map); + } + synchronized (this.bag) { + keeper = keeperOf(key); // we must check that again because it could have changed in between + if (keeper != null) return keeper.put(key, map); + if (this.current == null) { + keeper = newHeap(); + return keeper.put(key, map); + } + keeper = checkHeap(this.bag.get(this.current)); + } + return keeper.put(key, map); + } + + @Override + public Map get(Object key) { + if (key == null || !(key instanceof byte[])) return null; + synchronized (this.bag) { + return keeperOf((byte[]) key).get(key); + } + } + + @Override + public boolean isEmpty() { + final Iterator i = this.bag.values().iterator(); + while (i.hasNext()) if (!i.next().isEmpty()) return false; + return true; + } + + @Override + public int size() { + final Iterator i = this.bag.values().iterator(); + int s = 0; + while (i.hasNext()) s += i.next().size(); + return s; + } + + @Override + public Map remove(Object key) { + if (key == null || !(key instanceof byte[])) return null; + final MapStore heap; + synchronized (this.bag) { + heap = keeperOf((byte[]) key); + } + if (heap == null) return null; + return heap.remove(key); + } + + @Override + public ByteOrder getOrdering() { + return this.entryOrder; + } + + @Override + public CloneableIterator keyIterator() { + final List> c = new ArrayList>(this.bag.size()); + final Iterator i = this.bag.values().iterator(); + CloneableIterator k; + while (i.hasNext()) { + k = i.next().keyIterator(); + if (k != null && k.hasNext()) c.add(k); + } + return MergeIterator.cascade(c, this.entryOrder, MergeIterator.simpleMerge, true); + } + + protected static Map testMap(int i) { + HashMap t = new HashMap(); + t.put("rdf:about", UTF8.getBytes("http://abc.de/testmap#" + i)); + t.put("dc:title", UTF8.getBytes("test nr " + i)); + return t; + } + + private static BEncodedHeapBag testHeapBag(File f) { + return new BEncodedHeapBag( + f, + "testbag", + 12, + Base64Order.enhancedCoder, + 10, + ArrayStack.oneMonth, 100 /*Integer.MAX_VALUE*/); + } + + public static void main(String[] args) { + File f = new File("/tmp"); + BEncodedHeapBag hb = testHeapBag(f); + for (int i = 0; i < 10000; i++) { + hb.put(Word.word2hash(Integer.toString(i)), testMap(i)); + } + System.out.println("test size after put = " + hb.size()); + hb.close(); + hb = testHeapBag(f); + Iterator>> mi = hb.iterator(); + int c = 1000; + Map.Entry> entry; + while (mi.hasNext() && c-- > 0) { + entry = mi.next(); + System.out.println(UTF8.String(entry.getKey()) + ": " + AbstractMapStore.map2String(entry.getValue())); + } + for (int i = 10000; i > 0; i--) { + hb.remove(Word.word2hash(Integer.toString(i - 1))); + } + System.out.println("test size after remove = " + hb.size()); + hb.close(); + Log.shutdown(); + } + +} diff --git a/source/net/yacy/kelondro/blob/BEncodedHeapShard.java b/source/net/yacy/kelondro/blob/BEncodedHeapShard.java new file mode 100644 index 000000000..df0961f0a --- /dev/null +++ b/source/net/yacy/kelondro/blob/BEncodedHeapShard.java @@ -0,0 +1,299 @@ +/** + * BEncodedHeapShard + * Copyright 2011 by Michael Peter Christen, mc@yacy.net, Frankfurt am Main, Germany + * First released 16.12.2011 at http://yacy.net + * + * $LastChangedDate: 2011-04-14 00:04:23 +0200 (Do, 14 Apr 2011) $ + * $LastChangedRevision: 7653 $ + * $LastChangedBy: orbiter $ + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program in the file lgpl21.txt + * If not, see . + */ + +package net.yacy.kelondro.blob; + +import java.io.File; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +import net.yacy.cora.document.ASCII; +import net.yacy.cora.document.UTF8; +import net.yacy.cora.order.ByteOrder; +import net.yacy.cora.order.CloneableIterator; +import net.yacy.cora.storage.AbstractMapStore; +import net.yacy.cora.storage.MapStore; +import net.yacy.kelondro.data.word.Word; +import net.yacy.kelondro.logging.Log; +import net.yacy.kelondro.order.Base64Order; +import net.yacy.kelondro.order.MergeIterator; +import net.yacy.kelondro.util.FileUtils; + +public class BEncodedHeapShard extends AbstractMapStore implements MapStore { + + public interface Method { + /** + * a sharding method produces a filename from a given key + * @param key + * @return + */ + public String filename(byte[] key); + + /** + * get the maximum key length for access keys + * @return + */ + public int getKeylength(); + + /** + * get the byte order on the keys + * @return + */ + public ByteOrder getOrdering(); + + /** + * check if the given file name is a part of the shard + * @param filename + * @return true if the file is part of the shar + */ + public boolean isShardPart(String filename); + + public String getShardName(String filename); + } + + public static class B64ShardMethod implements Method { + + private final int keylength; + private final ByteOrder ordering; + private final byte[] template; + private final int charpos; + private final String prefix; + + public B64ShardMethod( + final int keylength, + final ByteOrder ordering, + final String prefix) { + this.keylength = keylength; + this.ordering = ordering; + this.template = ASCII.getBytes(prefix + ".?"); + this.charpos = ASCII.getBytes(prefix).length + 1; + this.prefix = prefix; + } + + @Override + public String filename(byte[] key) { + byte[] s = new byte[this.template.length]; + System.arraycopy(this.template, 0, s, 0, s.length); + s[this.charpos] = key[0]; + return ASCII.String(s); + } + + @Override + public int getKeylength() { + return this.keylength; + } + + @Override + public ByteOrder getOrdering() { + return this.ordering; + } + + @Override + public boolean isShardPart(String filename) { + // TODO Auto-generated method stub + return filename.startsWith(this.prefix) && + filename.charAt(this.prefix.length()) == '.' && + filename.endsWith(".heap"); + } + + @Override + public String getShardName(String filename) { + return filename.substring(0, this.template.length); + } + } + + private ConcurrentHashMap shard; + private final File baseDir; + private final Method shardMethod; + + public BEncodedHeapShard(File baseDir, Method shardMethod) { + this.shard = new ConcurrentHashMap(); + this.baseDir = baseDir; + this.shardMethod = shardMethod; + init(); + } + + private void init() { + // initialized tables map + this.shard = new ConcurrentHashMap(); + if (!(this.baseDir.exists())) this.baseDir.mkdirs(); + String[] tablefile = this.baseDir.list(); + + // open all tables of this shard + for (final String element : tablefile) { + if (this.shardMethod.isShardPart(element)) { + Log.logInfo("BEncodedHeapShard", "opening partial shard " + element); + MapStore bag = openBag(element); + this.shard.put(this.shardMethod.getShardName(element), bag); + } + } + } + + @Override + public void close() { + if (this.shard == null) return; + + final Iterator i = this.shard.values().iterator(); + while (i.hasNext()) { + i.next().close(); + } + this.shard = null; + } + + @Override + public void clear() { + close(); + final String[] l = this.baseDir.list(); + for (final String element : l) { + if (this.shardMethod.isShardPart(element)) { + final File f = new File(this.baseDir, element); + if (!f.isDirectory()) FileUtils.deletedelete(f); + } + } + init(); + } + + private MapStore keeperOf(final byte[] key) { + String shardfile = this.shardMethod.filename(key); + MapStore bag = this.shard.get(shardfile); + if (bag != null) return bag; + bag = openBag(shardfile); + this.shard.put(shardfile, bag); + return bag; + } + + public MapStore openBag(String shardfile) { + MapStore bag = new BEncodedHeapBag( + this.baseDir, + shardfile, + this.shardMethod.getKeylength(), + this.shardMethod.getOrdering(), + 10, + ArrayStack.oneMonth * 12, + Integer.MAX_VALUE); + return bag; + } + + @Override + public boolean containsKey(Object key) { + if (key == null || !(key instanceof byte[])) return false; + String shardfile = this.shardMethod.filename((byte[]) key); + MapStore bag = this.shard.get(shardfile); + if (bag == null) return false; + return bag.containsKey(key); + } + + @Override + public Map put(byte[] key, Map map) { + if (this.shard == null) return null; + MapStore keeper = null; + synchronized (this.shard) { + keeper = keeperOf(key); + } + return keeper.put(key, map); + } + + @Override + public Map get(Object key) { + if (key == null || !(key instanceof byte[])) return null; + String shardfile = this.shardMethod.filename((byte[]) key); + MapStore bag = this.shard.get(shardfile); + if (bag == null) return null; + return bag.get(key); + } + + @Override + public boolean isEmpty() { + final Iterator i = this.shard.values().iterator(); + while (i.hasNext()) if (!i.next().isEmpty()) return false; + return true; + } + + @Override + public int size() { + final Iterator i = this.shard.values().iterator(); + int s = 0; + while (i.hasNext()) s += i.next().size(); + return s; + } + + @Override + public Map remove(Object key) { + if (key == null || !(key instanceof byte[])) return null; + final MapStore bag; + synchronized (this.shard) { + bag = keeperOf((byte[]) key); + } + if (bag == null) return null; + return bag.remove(key); + } + + @Override + public ByteOrder getOrdering() { + return this.shardMethod.getOrdering(); + } + + @Override + public CloneableIterator keyIterator() { + final List> c = new ArrayList>(this.shard.size()); + final Iterator i = this.shard.values().iterator(); + CloneableIterator k; + while (i.hasNext()) { + k = i.next().keyIterator(); + if (k != null && k.hasNext()) c.add(k); + } + return MergeIterator.cascade(c, this.shardMethod.getOrdering(), MergeIterator.simpleMerge, true); + } + + private static BEncodedHeapShard testHeapShard(File f) { + return new BEncodedHeapShard(f, new B64ShardMethod(12, Base64Order.enhancedCoder, "testshard")); + } + + public static void main(String[] args) { + File f = new File("/tmp"); + BEncodedHeapShard hb = testHeapShard(f); + for (int i = 0; i < 10000; i++) { + hb.put(Word.word2hash(Integer.toString(i)), BEncodedHeapBag.testMap(i)); + } + System.out.println("test size after put = " + hb.size()); + hb.close(); + hb = testHeapShard(f); + Iterator>> mi = hb.iterator(); + int c = 100; + Map.Entry> entry; + while (mi.hasNext() && c-- > 0) { + entry = mi.next(); + System.out.println(UTF8.String(entry.getKey()) + ": " + AbstractMapStore.map2String(entry.getValue())); + } + for (int i = 10000; i > 0; i--) { + hb.remove(Word.word2hash(Integer.toString(i - 1))); + } + System.out.println("test size after remove = " + hb.size()); + hb.close(); + Log.shutdown(); + } +} diff --git a/source/net/yacy/kelondro/blob/BLOB.java b/source/net/yacy/kelondro/blob/BLOB.java index 28e33a3b3..f068451ca 100644 --- a/source/net/yacy/kelondro/blob/BLOB.java +++ b/source/net/yacy/kelondro/blob/BLOB.java @@ -28,9 +28,9 @@ package net.yacy.kelondro.blob; import java.io.IOException; +import net.yacy.cora.order.ByteOrder; +import net.yacy.cora.order.CloneableIterator; import net.yacy.kelondro.index.RowSpaceExceededException; -import net.yacy.kelondro.order.ByteOrder; -import net.yacy.kelondro.order.CloneableIterator; public interface BLOB { diff --git a/source/net/yacy/kelondro/blob/Compressor.java b/source/net/yacy/kelondro/blob/Compressor.java index 6ccf5193c..96c5bfc49 100644 --- a/source/net/yacy/kelondro/blob/Compressor.java +++ b/source/net/yacy/kelondro/blob/Compressor.java @@ -37,10 +37,10 @@ import java.util.TreeMap; import java.util.zip.GZIPInputStream; import java.util.zip.GZIPOutputStream; +import net.yacy.cora.order.ByteOrder; +import net.yacy.cora.order.CloneableIterator; import net.yacy.kelondro.index.RowSpaceExceededException; import net.yacy.kelondro.logging.Log; -import net.yacy.kelondro.order.ByteOrder; -import net.yacy.kelondro.order.CloneableIterator; import net.yacy.kelondro.util.ByteArray; import net.yacy.kelondro.util.MemoryControl; diff --git a/source/net/yacy/kelondro/blob/Heap.java b/source/net/yacy/kelondro/blob/Heap.java index 7b3ac75a2..a1d6630d1 100755 --- a/source/net/yacy/kelondro/blob/Heap.java +++ b/source/net/yacy/kelondro/blob/Heap.java @@ -35,11 +35,11 @@ import java.util.SortedMap; import java.util.TreeMap; import net.yacy.cora.document.UTF8; +import net.yacy.cora.order.ByteOrder; +import net.yacy.cora.order.CloneableIterator; import net.yacy.kelondro.index.RowSpaceExceededException; import net.yacy.kelondro.io.AbstractWriter; import net.yacy.kelondro.logging.Log; -import net.yacy.kelondro.order.ByteOrder; -import net.yacy.kelondro.order.CloneableIterator; import net.yacy.kelondro.order.NaturalOrder; import net.yacy.kelondro.util.MemoryControl; @@ -125,12 +125,12 @@ public final class Heap extends HeapModifier implements BLOB { */ @Override public boolean containsKey(byte[] key) { - assert index != null; + assert this.index != null; key = normalizeKey(key); synchronized (this) { // check the buffer - assert buffer != null; - if (buffer != null) { + assert this.buffer != null; + if (this.buffer != null) { if (this.buffer.containsKey(key)) return true; } return super.containsKey(key); @@ -147,13 +147,13 @@ public final class Heap extends HeapModifier implements BLOB { private void add(byte[] key, final byte[] blob) throws IOException { assert blob.length > 0; if ((blob == null) || (blob.length == 0)) return; - final int pos = (int) file.length(); + final int pos = (int) this.file.length(); try { - index.put(key, pos); - file.seek(pos); - file.writeInt(this.keylength + blob.length); - file.write(key); - file.write(blob, 0, blob.length); + this.index.put(key, pos); + this.file.seek(pos); + this.file.writeInt(this.keylength + blob.length); + this.file.write(key); + this.file.write(blob, 0, blob.length); } catch (RowSpaceExceededException e) { throw new IOException(e.getMessage()); // should never occur; } @@ -166,8 +166,8 @@ public final class Heap extends HeapModifier implements BLOB { * @throws RowSpaceExceededException */ public void flushBuffer() throws IOException { - assert buffer != null; - if (buffer == null) return; + assert this.buffer != null; + if (this.buffer == null) return; // check size of buffer Iterator> i = this.buffer.entrySet().iterator(); @@ -196,18 +196,18 @@ public final class Heap extends HeapModifier implements BLOB { // append all contents of the buffer into one byte[] i = this.buffer.entrySet().iterator(); - final long pos = file.length(); + final long pos = this.file.length(); long posFile = pos; posBuffer = 0; byte[] ba = new byte[l + (4 + this.keylength) * this.buffer.size()]; byte[] b; - SortedMap nextBuffer = new TreeMap(ordering); + SortedMap nextBuffer = new TreeMap(this.ordering); flush: while (i.hasNext()) { entry = i.next(); key = normalizeKey(entry.getKey()); blob = entry.getValue(); try { - index.put(key, posFile); + this.index.put(key, posFile); } catch (RowSpaceExceededException e) { nextBuffer.put(entry.getKey(), blob); continue flush; @@ -245,8 +245,8 @@ public final class Heap extends HeapModifier implements BLOB { synchronized (this) { // check the buffer - assert buffer != null; - if (buffer != null) { + assert this.buffer != null; + if (this.buffer != null) { byte[] blob = this.buffer.get(key); if (blob != null) return blob; } @@ -267,8 +267,8 @@ public final class Heap extends HeapModifier implements BLOB { synchronized (this) { // check the buffer - assert buffer != null; - if (buffer != null) { + assert this.buffer != null; + if (this.buffer != null) { byte[] blob = this.buffer.get(key); if (blob != null) return blob.length; } @@ -284,8 +284,8 @@ public final class Heap extends HeapModifier implements BLOB { @Override public synchronized void clear() throws IOException { Log.logInfo("Heap", "clearing heap " + this.name()); - assert buffer != null; - if (buffer == null) buffer = new TreeMap(ordering); + assert this.buffer != null; + if (this.buffer == null) this.buffer = new TreeMap(this.ordering); this.buffer.clear(); this.buffersize = 0; super.clear(); @@ -297,7 +297,7 @@ public final class Heap extends HeapModifier implements BLOB { @Override public synchronized void close(final boolean writeIDX) { Log.logInfo("Heap", "closing heap " + this.name()); - if (file != null && buffer != null) { + if (this.file != null && this.buffer != null) { try { flushBuffer(); } catch (IOException e) { @@ -306,7 +306,7 @@ public final class Heap extends HeapModifier implements BLOB { } this.buffer = null; super.close(writeIDX); - assert file == null; + assert this.file == null; } @Override @@ -351,11 +351,11 @@ public final class Heap extends HeapModifier implements BLOB { assert this.buffer != null; // if there is not enough space in the buffer, flush all - if (this.buffersize + b.length > buffermax || MemoryControl.shortStatus()) { + if (this.buffersize + b.length > this.buffermax || MemoryControl.shortStatus()) { // this is too big. Flush everything super.shrinkWithGapsAtEnd(); flushBuffer(); - if (b.length > buffermax) { + if (b.length > this.buffermax) { this.add(key, b); } else { if (this.buffer != null) { @@ -387,6 +387,7 @@ public final class Heap extends HeapModifier implements BLOB { final int reclen = b.length + this.keylength; Map.Entry entry; Iterator> i = this.free.entrySet().iterator(); + int acount = 0, bcount = 0; while (i.hasNext()) { entry = i.next(); if (entry.getValue().intValue() == reclen) { @@ -397,14 +398,14 @@ public final class Heap extends HeapModifier implements BLOB { this.index.put(key, entry.getKey()); // write to file - file.seek(entry.getKey().longValue()); - final int reclenf = file.readInt(); + this.file.seek(entry.getKey().longValue()); + final int reclenf = this.file.readInt(); assert reclenf == reclen; - file.write(key); + this.file.write(key); if (this.keylength > key.length) { - for (int j = 0; j < this.keylength - key.length; j++) file.write(HeapWriter.ZERO); + for (int j = 0; j < this.keylength - key.length; j++) this.file.write(HeapWriter.ZERO); } - file.write(b); + this.file.write(b); // remove the entry from the free list i.remove(); @@ -414,10 +415,13 @@ public final class Heap extends HeapModifier implements BLOB { // finished! return true; } + acount++; // look for the biggest size - if (entry.getValue() > lsize) { + if (entry.getValue().intValue() > lsize) { lseek = entry.getKey(); lsize = entry.getValue(); + bcount++; + if (acount > 100 || bcount > 10) break; // in case that we have really a lot break here } } @@ -429,21 +433,21 @@ public final class Heap extends HeapModifier implements BLOB { // data structure in the file // write the new entry - file.seek(lseek); - file.writeInt(reclen); - file.write(key); + this.file.seek(lseek); + this.file.writeInt(reclen); + this.file.write(key); if (this.keylength > key.length) { - for (int j = 0; j < this.keylength - key.length; j++) file.write(HeapWriter.ZERO); + for (int j = 0; j < this.keylength - key.length; j++) this.file.write(HeapWriter.ZERO); } - file.write(b); + this.file.write(b); // add the index to the new entry - index.put(key, lseek); + this.index.put(key, lseek); // define the new empty entry final int newfreereclen = lsize - reclen - 4; assert newfreereclen > 0; - file.writeInt(newfreereclen); + this.file.writeInt(newfreereclen); // remove the old free entry this.free.remove(lseek); @@ -473,8 +477,8 @@ public final class Heap extends HeapModifier implements BLOB { super.deleteFingerprint(); // check the buffer - assert buffer != null; - if (buffer != null) { + assert this.buffer != null; + if (this.buffer != null) { byte[] blob = this.buffer.remove(key); if (blob != null) { this.buffersize -= blob.length; diff --git a/source/net/yacy/kelondro/blob/HeapModifier.java b/source/net/yacy/kelondro/blob/HeapModifier.java index f451e664e..40f3cdd3b 100644 --- a/source/net/yacy/kelondro/blob/HeapModifier.java +++ b/source/net/yacy/kelondro/blob/HeapModifier.java @@ -29,10 +29,10 @@ import java.io.IOException; import java.util.SortedMap; import net.yacy.cora.document.UTF8; +import net.yacy.cora.order.ByteOrder; import net.yacy.kelondro.index.RowSpaceExceededException; import net.yacy.kelondro.io.CachedFileWriter; import net.yacy.kelondro.logging.Log; -import net.yacy.kelondro.order.ByteOrder; import net.yacy.kelondro.util.FileUtils; import net.yacy.kelondro.util.MemoryControl; diff --git a/source/net/yacy/kelondro/blob/HeapReader.java b/source/net/yacy/kelondro/blob/HeapReader.java index ce1af19a1..c8e60cac9 100644 --- a/source/net/yacy/kelondro/blob/HeapReader.java +++ b/source/net/yacy/kelondro/blob/HeapReader.java @@ -37,13 +37,13 @@ import java.util.concurrent.ExecutionException; import net.yacy.cora.document.ASCII; import net.yacy.cora.document.UTF8; +import net.yacy.cora.order.ByteOrder; +import net.yacy.cora.order.CloneableIterator; import net.yacy.kelondro.index.HandleMap; import net.yacy.kelondro.index.RowSpaceExceededException; import net.yacy.kelondro.io.CachedFileWriter; import net.yacy.kelondro.io.Writer; import net.yacy.kelondro.logging.Log; -import net.yacy.kelondro.order.ByteOrder; -import net.yacy.kelondro.order.CloneableIterator; import net.yacy.kelondro.order.Digest; import net.yacy.kelondro.order.NaturalOrder; import net.yacy.kelondro.order.RotateIterator; diff --git a/source/net/yacy/kelondro/blob/HeapWriter.java b/source/net/yacy/kelondro/blob/HeapWriter.java index de1e0dbdd..185302d6b 100644 --- a/source/net/yacy/kelondro/blob/HeapWriter.java +++ b/source/net/yacy/kelondro/blob/HeapWriter.java @@ -31,10 +31,10 @@ import java.io.FileOutputStream; import java.io.IOException; import net.yacy.cora.document.UTF8; +import net.yacy.cora.order.ByteOrder; import net.yacy.kelondro.index.HandleMap; import net.yacy.kelondro.index.RowSpaceExceededException; import net.yacy.kelondro.logging.Log; -import net.yacy.kelondro.order.ByteOrder; import net.yacy.kelondro.util.FileUtils; diff --git a/source/net/yacy/kelondro/blob/MapDataMining.java b/source/net/yacy/kelondro/blob/MapDataMining.java index 9a8bd56df..1fc87c0ef 100644 --- a/source/net/yacy/kelondro/blob/MapDataMining.java +++ b/source/net/yacy/kelondro/blob/MapDataMining.java @@ -35,16 +35,15 @@ import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import net.yacy.cora.document.UTF8; -import net.yacy.cora.ranking.ClusteredScoreMap; -import net.yacy.cora.ranking.ConcurrentScoreMap; -import net.yacy.cora.ranking.ScoreMap; +import net.yacy.cora.order.ByteOrder; +import net.yacy.cora.order.CloneableIterator; +import net.yacy.cora.sorting.ClusteredScoreMap; +import net.yacy.cora.sorting.ConcurrentScoreMap; +import net.yacy.cora.sorting.ScoreMap; import net.yacy.kelondro.data.word.Word; import net.yacy.kelondro.index.RowSpaceExceededException; import net.yacy.kelondro.logging.Log; import net.yacy.kelondro.order.Base64Order; -import net.yacy.kelondro.order.ByteOrder; -import net.yacy.kelondro.order.CloneableIterator; -import net.yacy.kelondro.util.LookAheadIterator; public class MapDataMining extends MapHeap { @@ -105,7 +104,7 @@ public class MapDataMining extends MapHeap { } // fill cluster and accumulator with values - if ((sortfields != null) || (longaccfields != null) || (floataccfields != null)) try { + if (sortfields != null || longaccfields != null || floataccfields != null) try { final CloneableIterator it = super.keys(true, false); byte[] mapnameb; String cell; @@ -122,37 +121,49 @@ public class MapDataMining extends MapHeap { } if (map == null) break; - if (sortfields != null && cluster != null) for (int i = 0; i < sortfields.length; i++) { - cell = map.get(sortfields[i]); - if (cell != null) cluster[i].set(UTF8.String(mapnameb), ClusteredScoreMap.object2score(cell)); + if (sortfields != null && cluster != null) { + for (int i = 0; i < sortfields.length; i++) { + cell = map.get(sortfields[i]); + if (cell != null) cluster[i].set(UTF8.String(mapnameb), ClusteredScoreMap.object2score(cell)); + } } - if (longaccfields != null && longaccumulator != null) for (int i = 0; i < longaccfields.length; i++) { - cell = map.get(longaccfields[i]); - valuel = 0; - if (cell != null) try { - valuel = Long.parseLong(cell); - longaccumulator[i] = Long.valueOf(longaccumulator[i].longValue() + valuel); - } catch (final NumberFormatException e) {} + if (longaccfields != null && longaccumulator != null) { + for (int i = 0; i < longaccfields.length; i++) { + cell = map.get(longaccfields[i]); + valuel = 0; + if (cell != null) try { + valuel = Long.parseLong(cell); + longaccumulator[i] = Long.valueOf(longaccumulator[i].longValue() + valuel); + } catch (final NumberFormatException e) {} + } } - if (floataccfields != null && floataccumulator != null) for (int i = 0; i < floataccfields.length; i++) { - cell = map.get(floataccfields[i]); - valued = 0f; - if (cell != null) try { - valued = Float.parseFloat(cell); - floataccumulator[i] = new Float(floataccumulator[i].floatValue() + valued); - } catch (final NumberFormatException e) {} + if (floataccfields != null && floataccumulator != null) { + for (int i = 0; i < floataccfields.length; i++) { + cell = map.get(floataccfields[i]); + valued = 0f; + if (cell != null) try { + valued = Float.parseFloat(cell); + floataccumulator[i] = new Float(floataccumulator[i].floatValue() + valued); + } catch (final NumberFormatException e) {} + } } } } catch (final IOException e) {} // fill cluster - if (sortfields != null && cluster != null) for (int i = 0; i < sortfields.length; i++) this.sortClusterMap.put(sortfields[i], cluster[i]); + if (sortfields != null && cluster != null) { + for (int i = 0; i < sortfields.length; i++) this.sortClusterMap.put(sortfields[i], cluster[i]); + } // fill acc map - if (longaccfields != null && longaccumulator != null) for (int i = 0; i < longaccfields.length; i++) this.accLong.put(longaccfields[i], longaccumulator[i]); - if (floataccfields != null && floataccumulator != null) for (int i = 0; i < floataccfields.length; i++) this.accFloat.put(floataccfields[i], floataccumulator[i]); + if (longaccfields != null && longaccumulator != null) { + for (int i = 0; i < longaccfields.length; i++) this.accLong.put(longaccfields[i], longaccumulator[i]); + } + if (floataccfields != null && floataccumulator != null) { + for (int i = 0; i < floataccfields.length; i++) this.accFloat.put(floataccfields[i], floataccumulator[i]); + } } @Override @@ -213,7 +224,7 @@ public class MapDataMining extends MapHeap { float valued; Long longaccumulator; Float floataccumulator; - if (this.longaccfields != null) + if (this.longaccfields != null) { for (final String longaccfield : this.longaccfields) { value = map.get(longaccfield); if (value != null) { @@ -228,7 +239,8 @@ public class MapDataMining extends MapHeap { } catch (final NumberFormatException e) {} } } - if (this.floataccfields != null) + } + if (this.floataccfields != null) { for (final String floataccfield : this.floataccfields) { value = map.get(floataccfield); if (value != null) { @@ -243,6 +255,7 @@ public class MapDataMining extends MapHeap { } catch (final NumberFormatException e) {} } } + } } private void updateSortCluster(final String key, final Map map) { @@ -283,23 +296,6 @@ public class MapDataMining extends MapHeap { super.delete(key); } -/* would be better but does not work (recursion) - @Override - public synchronized void delete(final byte[] key) throws IOException { - if (key == null) return; - - // update elementCount - Map map = super.remove(key); - if (map != null && (sortfields != null || longaccfields != null || floataccfields != null)) { - // update accumulators (subtract) - if ((longaccfields != null) || (floataccfields != null)) updateAcc(map, false); - - // remove from sortCluster - if (sortfields != null) deleteSortCluster(UTF8.String(key)); - } - } -*/ - private void deleteSortCluster(final String key) { if (key == null) return; ScoreMap cluster; @@ -327,34 +323,34 @@ public class MapDataMining extends MapHeap { this.s = s; } + @Override public boolean hasNext() { return this.s.hasNext(); } + @Override public byte[] next() { final String r = this.s.next(); if (r == null) return null; return UTF8.getBytes(r); } + @Override public void remove() { this.s.remove(); } } - public synchronized mapIterator maps(final boolean up, final String field) { - return new mapIterator(keys(up, field)); + @Override + public synchronized Iterator>> entries(final String whereKey, final String isValue) throws IOException { + return super.entries(whereKey, isValue); } - - public synchronized mapIterator maps(final boolean up, final boolean rotating) throws IOException { - return new mapIterator(keys(up, rotating)); + + public synchronized Iterator>> entries(final boolean up, final String field) { + return new MapIterator(keys(up, field), null, null); } - - public synchronized mapIterator maps(final boolean up, final boolean rotating, final byte[] firstKey, final byte[] secondKey) throws IOException { - return new mapIterator(keys(up, rotating, firstKey, secondKey)); - } - + public synchronized long getLongAcc(final String field) { final Long accumulator = this.accLong.get(field); if (accumulator == null) return -1; @@ -389,50 +385,33 @@ public class MapDataMining extends MapHeap { super.close(); } - public class mapIterator extends LookAheadIterator> implements Iterator> { - // enumerates Map-Type elements - // the key is also included in every map that is returned; it's key is 'key' +/* + public byte[] lookupBy( + final String whereKey, + final String isValue + ) { - private final Iterator keyIterator; - - private mapIterator(final Iterator keyIterator) { - this.keyIterator = keyIterator; - } - - public Map next0() { - if (this.keyIterator == null) return null; - byte[] nextKey; - Map map; - while (this.keyIterator.hasNext()) { - nextKey = this.keyIterator.next(); - try { - map = get(nextKey, false); - } catch (final IOException e) { - Log.logWarning("MapDataMining", e.getMessage()); - continue; - } catch (final RowSpaceExceededException e) { - Log.logException(e); - continue; - } - if (map == null) continue; // circumvention of a modified exception - map.put("key", UTF8.String(nextKey)); - return map; - } - return null; - } - } // class mapIterator + } +*/ public static void main(final String[] args) { try { - final MapDataMining db = new MapDataMining(new File("/tmp/MapDataMinig.test.db"), Word.commonHashLength, Base64Order.enhancedCoder, 1024 * 512, 500, new String[] {"X"}, new String[] {"X"}, new String[] {}, null); - final Map m1 = new HashMap(); m1.put("X", Long.toString(System.currentTimeMillis())); + File f = new File("/tmp/MapDataMinig.test.db"); + f.delete(); + final MapDataMining db = new MapDataMining(f, Word.commonHashLength, Base64Order.enhancedCoder, 1024 * 512, 500, new String[] {"X"}, new String[] {"X"}, new String[] {}, null); + final Map m1 = new HashMap(); + long t = System.currentTimeMillis(); + m1.put("X", Long.toString(t)); db.put("abcdefghijk1".getBytes(), m1); - final Map m2 = new HashMap(); m2.put("X", Long.toString(System.currentTimeMillis() - 1000)); + final Map m2 = new HashMap(); + m2.put("X", Long.toString(t - 1000)); db.put("abcdefghijk2".getBytes(), m2); - final Map m3 = new HashMap(); m3.put("X", Long.toString(System.currentTimeMillis() + 2000)); + final Map m3 = new HashMap(); + m3.put("X", Long.toString(t + 2000)); db.put("abcdefghijk3".getBytes(), m3); + // iterate the keys, sorted by field X in ascending order (must be: abcdefghijk2 - abcdefghijk1 - abcdefghijk3) final Iterator i1 = db.keys(true, "X"); byte[] k; while (i1.hasNext()) { @@ -440,11 +419,12 @@ public class MapDataMining extends MapHeap { System.out.println(new String(k)); } - final Iterator> i2 = db.maps(false, "X"); - Map e; + // iterate the maps, sorted by field X in descending order (must be: abcdefghijk3 - abcdefghijk1 - abcdefghijk2) + final Iterator>> i2 = db.entries(false, "X"); + Map.Entry> e; while (i2.hasNext()) { e = i2.next(); - System.out.println(e); + System.out.println(UTF8.String(e.getKey()) + ":" + e.getValue()); } System.exit(0); diff --git a/source/net/yacy/kelondro/blob/MapHeap.java b/source/net/yacy/kelondro/blob/MapHeap.java index bee7400f2..42073f9c7 100644 --- a/source/net/yacy/kelondro/blob/MapHeap.java +++ b/source/net/yacy/kelondro/blob/MapHeap.java @@ -32,6 +32,7 @@ import java.io.ByteArrayInputStream; import java.io.File; import java.io.IOException; import java.io.InputStreamReader; +import java.util.AbstractMap; import java.util.Collection; import java.util.HashMap; import java.util.Iterator; @@ -42,17 +43,17 @@ import java.util.concurrent.ConcurrentHashMap; import net.yacy.cora.date.GenericFormatter; import net.yacy.cora.document.UTF8; +import net.yacy.cora.order.ByteOrder; +import net.yacy.cora.order.CloneableIterator; import net.yacy.cora.storage.ARC; import net.yacy.cora.storage.ConcurrentARC; import net.yacy.kelondro.index.RowSpaceExceededException; import net.yacy.kelondro.logging.Log; -import net.yacy.kelondro.order.ByteOrder; -import net.yacy.kelondro.order.CloneableIterator; import net.yacy.kelondro.order.NaturalOrder; import net.yacy.kelondro.order.RotateIterator; import net.yacy.kelondro.util.FileUtils; +import net.yacy.kelondro.util.LookAheadIterator; import net.yacy.kelondro.util.MemoryControl; -import net.yacy.kelondro.util.kelondroException; public class MapHeap implements Map> { @@ -85,6 +86,7 @@ public class MapHeap implements Map> { * clears the content of the database * @throws IOException */ + @Override public synchronized void clear() { try { this.blob.clear(); @@ -168,6 +170,7 @@ public class MapHeap implements Map> { } } + @Override public Map put(final byte[] key, final Map newMap) { Map v = null; try { @@ -200,6 +203,7 @@ public class MapHeap implements Map> { } } + @Override public Map remove(final Object key) { Map v = null; try { @@ -218,6 +222,7 @@ public class MapHeap implements Map> { * @throws IOException */ + @Override public boolean containsKey(final Object k) { if (!(k instanceof byte[])) return false; assert k != null; @@ -241,6 +246,7 @@ public class MapHeap implements Map> { return get(key, true); } + @Override public Map get(final Object key) { if (key == null) return null; try { @@ -375,6 +381,7 @@ public class MapHeap implements Map> { this.iterator = (rotating) ? new RotateIterator(i, secondKey, MapHeap.this.blob.size()) : i; } + @Override public byte[] next() { return removeFillchar(this.iterator.next()); } @@ -399,23 +406,29 @@ public class MapHeap implements Map> { } } + + public synchronized Iterator>> entries(final String whereKey, final String isValue) throws IOException { + return new MapIterator(this.blob.keys(true, null), whereKey, isValue); + } - public synchronized MapIterator entries(final boolean up, final boolean rotating) throws IOException { - return new MapIterator(keys(up, rotating)); + public synchronized Iterator>> entries(final boolean up, final boolean rotating) throws IOException { + return new MapIterator(keys(up, rotating), null, null); } - public synchronized MapIterator entries(final boolean up, final boolean rotating, final byte[] firstKey, final byte[] secondKey) throws IOException { - return new MapIterator(keys(up, rotating, firstKey, secondKey)); + public synchronized Iterator>> entries(final boolean up, final boolean rotating, final byte[] firstKey, final byte[] secondKey) throws IOException { + return new MapIterator(keys(up, rotating, firstKey, secondKey), null, null); } /** * ask for the number of entries * @return the number of entries in the table */ + @Override public synchronized int size() { return (this.blob == null) ? 0 : this.blob.size(); } + @Override public synchronized boolean isEmpty() { return (this.blob == null) ? true : this.blob.isEmpty(); } @@ -435,48 +448,52 @@ public class MapHeap implements Map> { public void finalize() { close(); } - - public class MapIterator implements Iterator> { + + public class MapIterator extends LookAheadIterator>> implements Iterator>> { // enumerates Map-Type elements // the key is also included in every map that is returned; it's key is 'key' - Iterator keyIterator; - boolean finish; + private final Iterator keyIterator; + private final String whereKey, isValue; - public MapIterator(final Iterator keyIterator) { + MapIterator(final Iterator keyIterator, final String whereKey, final String isValue) { this.keyIterator = keyIterator; - this.finish = false; - } - - public boolean hasNext() { - return (!(this.finish)) && (this.keyIterator.hasNext()); + this.whereKey = whereKey; + this.isValue = isValue; } - public Map next() { - byte[] nextKey = this.keyIterator.next(); - if (nextKey == null) { - this.finish = true; - return null; - } - nextKey = normalizeKey(nextKey); // the key must be normalized because the keyIterator may iterate over not-normalized keys - try { - final Map obj = get(nextKey, false); - if (obj == null) throw new kelondroException("no more elements available"); - return obj; - } catch (final IOException e) { - this.finish = true; - return null; - } catch (final RowSpaceExceededException e) { - this.finish = true; - return null; + @Override + public Map.Entry> next0() { + if (this.keyIterator == null) return null; + byte[] nextKey; + Map map; + while (this.keyIterator.hasNext()) { + nextKey = this.keyIterator.next(); + try { + map = get(nextKey, false); + } catch (final IOException e) { + Log.logWarning("MapDataMining", e.getMessage()); + continue; + } catch (final RowSpaceExceededException e) { + Log.logException(e); + continue; + } + if (map == null) continue; // circumvention of a modified exception + // check if the where case holds + if (this.whereKey != null && this.isValue != null) { + String v = map.get(this.whereKey); + if (v == null) continue; + if (!v.equals(this.isValue)) continue; + } + // produce entry + Map.Entry> entry = new AbstractMap.SimpleImmutableEntry>(nextKey, map); + return entry; } - } - - public void remove() { - throw new UnsupportedOperationException(); + return null; } } // class mapIterator + @Override public void putAll(final Map> map) { for (final Map.Entry> me: map.entrySet()) { try { @@ -489,6 +506,7 @@ public class MapHeap implements Map> { } } + @Override public Set keySet() { final TreeSet set = new TreeSet(this.blob.ordering()); try { @@ -498,16 +516,19 @@ public class MapHeap implements Map> { return set; } + @Override public Collection> values() { // this method shall not be used because it is not appropriate for this kind of data throw new UnsupportedOperationException(); } + @Override public Set>> entrySet() { // this method shall not be used because it is not appropriate for this kind of data throw new UnsupportedOperationException(); } + @Override public boolean containsValue(final Object value) { // this method shall not be used because it is not appropriate for this kind of data throw new UnsupportedOperationException(); diff --git a/source/net/yacy/kelondro/data/meta/DigestURI.java b/source/net/yacy/kelondro/data/meta/DigestURI.java index a4713d551..77f3d0fed 100644 --- a/source/net/yacy/kelondro/data/meta/DigestURI.java +++ b/source/net/yacy/kelondro/data/meta/DigestURI.java @@ -30,6 +30,8 @@ package net.yacy.kelondro.data.meta; import java.io.File; import java.io.Serializable; import java.net.MalformedURLException; +import java.util.HashSet; +import java.util.Set; import net.yacy.cora.document.ASCII; import net.yacy.cora.document.MultiProtocolURI; @@ -71,6 +73,37 @@ public class DigestURI extends MultiProtocolURI implements Serializable { } return (url == null) ? null : ASCII.String(url.hash(), 6, 6); } + + /** + * from a given list of hosts make a list of host hashes + * the list is separated by comma + * @param hostlist + * @return list of host hashes without separation + */ + public static String hosthashes(final String hostlist) { + String[] hs = hostlist.split(","); + StringBuilder sb = new StringBuilder(hostlist.length()); + for (String h: hs) { + if (h == null) continue; + h = h.trim(); + if (h.length() == 0) continue; + h = hosthash(h); + if (h == null || h.length() != 6) continue; + sb.append(h); + } + return sb.toString(); + } + + public static Set hosthashess(String hosthashes) { + if (hosthashes == null || hosthashes.length() == 0) return null; + HashSet h = new HashSet(); + assert hosthashes.length() % 6 == 0; + for (int i = 0; i < hosthashes.length(); i = i + 6) { + h.add(hosthashes.substring(i, i + 6)); + } + return h; + } + /** * DigestURI from File @@ -180,8 +213,10 @@ public class DigestURI extends MultiProtocolURI implements Serializable { int p = (this.host == null) ? -1 : this.host.lastIndexOf('.'); String dom = (p > 0) ? dom = this.host.substring(0, p) : ""; p = dom.lastIndexOf('.'); // locate subdomain - String subdom = ""; - if (p > 0) { + final String subdom; + if (p <= 0) { + subdom = ""; + } else { subdom = dom.substring(0, p); dom = dom.substring(p + 1); } diff --git a/source/net/yacy/kelondro/data/meta/URIMetadataRow.java b/source/net/yacy/kelondro/data/meta/URIMetadataRow.java index 7deb02a02..1022a7c51 100644 --- a/source/net/yacy/kelondro/data/meta/URIMetadataRow.java +++ b/source/net/yacy/kelondro/data/meta/URIMetadataRow.java @@ -189,12 +189,15 @@ public class URIMetadataRow implements URIMetadata { final float lat, final float lon) { final CharBuffer s = new CharBuffer(360); - s.append(url.toNormalform(false, true)).append(10); - s.append(dc_title).append(10); - s.append(dc_creator.length() > 80 ? dc_creator.substring(0, 80) : dc_creator).append(10); - s.append(dc_subject.length() > 120 ? dc_subject.substring(0, 120) : dc_subject).append(10); - s.append(dc_publisher).append(10); - if (lon == 0.0f && lat == 0.0f) s.append(10); else s.append(Float.toString(lat)).append(',').append(Float.toString(lon)).append(10); + s.append(url.toNormalform(false, true)).appendLF(); + s.append(dc_title).appendLF(); + if (dc_creator.length() > 80) s.append(dc_creator, 0, 80); else s.append(dc_creator); + s.appendLF(); + if (dc_subject.length() > 120) s.append(dc_subject, 0, 120); else s.append(dc_subject); + s.appendLF(); + if (dc_publisher.length() > 80) s.append(dc_publisher, 0, 80); else s.append(dc_publisher); + s.appendLF(); + if (lon == 0.0f && lat == 0.0f) s.appendLF(); else s.append(Float.toString(lat)).append(',').append(Float.toString(lon)).appendLF(); return UTF8.getBytes(s.toString()); } @@ -375,7 +378,39 @@ public class URIMetadataRow implements URIMetadata { return this.ranking; } - public Components metadata() { + public boolean matches(final Pattern matcher) { + return this.metadata().matches(matcher); + } + + public DigestURI url() { + return this.metadata().url(); + } + + public String dc_title() { + return this.metadata().dc_title(); + } + + public String dc_creator() { + return this.metadata().dc_creator(); + } + + public String dc_publisher() { + return this.metadata().dc_publisher(); + } + + public String dc_subject() { + return this.metadata().dc_subject(); + } + + public float lat() { + return this.metadata().lat(); + } + + public float lon() { + return this.metadata().lon(); + } + + private Components metadata() { // avoid double computation of metadata elements if (this.comp != null) return this.comp; // parse elements from comp field; @@ -428,7 +463,7 @@ public class URIMetadataRow implements URIMetadata { public byte[] language() { byte[] b = this.entry.getColBytes(col_lang, true); - if (b[0] == (byte)'[') { + if (b == null || b[0] == (byte)'[') { String tld = this.metadata().url.getTLD(); if (tld.length() < 2 || tld.length() > 2) return ASCII.getBytes("en"); return ASCII.getBytes(tld); @@ -542,7 +577,7 @@ public class URIMetadataRow implements URIMetadata { //return "{" + core + "}"; } - public class Components { + private class Components { private DigestURI url; private String urlRaw; private byte[] urlHash; diff --git a/source/net/yacy/kelondro/data/word/Word.java b/source/net/yacy/kelondro/data/word/Word.java index b90f8df89..b4986d0dd 100644 --- a/source/net/yacy/kelondro/data/word/Word.java +++ b/source/net/yacy/kelondro/data/word/Word.java @@ -116,6 +116,13 @@ public class Word { return word2hash(word.toString()); } + private final static byte lowByte = Base64Order.alpha_enhanced[0]; + private final static byte highByte = Base64Order.alpha_enhanced[Base64Order.alpha_enhanced.length - 1]; + + public static boolean isPrivate(byte[] hash) { + return hash[0] == highByte && hash[1] == highByte && hash[2] == highByte && hash[3] == highByte && hash[4] == highByte; + } + // create a word hash public static final byte[] word2hash(final String word) { final String wordlc = word.toLowerCase(Locale.ENGLISH); @@ -123,6 +130,12 @@ public class Word { if (h != null) return h; // calculate the hash h = Base64Order.enhancedCoder.encodeSubstring(Digest.encodeMD5Raw(wordlc), commonHashLength); + while (h[0] == highByte && h[1] == highByte && h[2] == highByte && h[3] == highByte && h[4] == highByte) { + // ensure that word hashes do not start with hash '_____' which is a key for an extra hash range for private usage on the local peer + // statistically we are inside this loop only every 2^^30 calls of word2hash (which means almost never) + System.arraycopy(h, 1, h, 0, commonHashLength - 1); + h[commonHashLength - 1] = lowByte; + } assert h[2] != '@'; if (MemoryControl.shortStatus()) { hashCache.clear(); @@ -133,6 +146,16 @@ public class Word { return h; } + public final static byte PRIVATE_TYPE_COPY = 'C'; // used for a private local copy of the index + public final static byte PRIVATE_TYPE_PHONETIC = 'K'; // used for ColognePhonetics + + public static final byte[] hash2private(final byte[] hash, byte privateType) { + byte[] p = new byte[commonHashLength]; + p[0] = highByte; p[1] = highByte; p[2] = highByte; ; p[3] = highByte; ; p[4] = highByte; p[5] = privateType; + System.arraycopy(hash, 0, p, 6, commonHashLength - 6); // 36 bits left for private hashes should be enough + return p; + } + public static final HandleSet words2hashesHandles(final Set words) { final HandleSet hashes = new HandleSet(WordReferenceRow.urlEntryRow.primaryKeyLength, WordReferenceRow.urlEntryRow.objectOrder, words.size()); for (final String word: words) diff --git a/source/net/yacy/kelondro/index/BinSearch.java b/source/net/yacy/kelondro/index/BinSearch.java index fcebedce8..9e99c7e67 100644 --- a/source/net/yacy/kelondro/index/BinSearch.java +++ b/source/net/yacy/kelondro/index/BinSearch.java @@ -32,7 +32,7 @@ import java.io.IOException; import java.util.Arrays; import java.util.List; -import net.yacy.kelondro.order.ByteOrder; +import net.yacy.cora.order.ByteOrder; import net.yacy.kelondro.order.NaturalOrder; diff --git a/source/net/yacy/kelondro/index/BufferedObjectIndex.java b/source/net/yacy/kelondro/index/BufferedObjectIndex.java index d11620452..cb293d556 100644 --- a/source/net/yacy/kelondro/index/BufferedObjectIndex.java +++ b/source/net/yacy/kelondro/index/BufferedObjectIndex.java @@ -32,9 +32,9 @@ import java.util.List; import java.util.Map; import java.util.TreeMap; +import net.yacy.cora.order.CloneableIterator; import net.yacy.kelondro.index.Row.Entry; import net.yacy.kelondro.logging.Log; -import net.yacy.kelondro.order.CloneableIterator; import net.yacy.kelondro.order.MergeIterator; /** diff --git a/source/net/yacy/kelondro/index/Cache.java b/source/net/yacy/kelondro/index/Cache.java index 120aca368..17e275efb 100644 --- a/source/net/yacy/kelondro/index/Cache.java +++ b/source/net/yacy/kelondro/index/Cache.java @@ -33,8 +33,8 @@ import java.util.List; import java.util.Map; import java.util.TreeMap; +import net.yacy.cora.order.CloneableIterator; import net.yacy.kelondro.index.Row.Entry; -import net.yacy.kelondro.order.CloneableIterator; import net.yacy.kelondro.util.MemoryControl; diff --git a/source/net/yacy/kelondro/index/HandleMap.java b/source/net/yacy/kelondro/index/HandleMap.java index 21d3d2f22..8d4dd0863 100644 --- a/source/net/yacy/kelondro/index/HandleMap.java +++ b/source/net/yacy/kelondro/index/HandleMap.java @@ -45,9 +45,9 @@ import java.util.concurrent.LinkedBlockingQueue; import java.util.zip.GZIPInputStream; import java.util.zip.GZIPOutputStream; +import net.yacy.cora.order.ByteOrder; +import net.yacy.cora.order.CloneableIterator; import net.yacy.kelondro.logging.Log; -import net.yacy.kelondro.order.ByteOrder; -import net.yacy.kelondro.order.CloneableIterator; public final class HandleMap implements Iterable { diff --git a/source/net/yacy/kelondro/index/HandleSet.java b/source/net/yacy/kelondro/index/HandleSet.java index ce11fbc6d..a1ecbd8a2 100644 --- a/source/net/yacy/kelondro/index/HandleSet.java +++ b/source/net/yacy/kelondro/index/HandleSet.java @@ -34,9 +34,9 @@ import java.io.InputStream; import java.io.OutputStream; import java.util.Iterator; +import net.yacy.cora.order.ByteOrder; +import net.yacy.cora.order.CloneableIterator; import net.yacy.kelondro.logging.Log; -import net.yacy.kelondro.order.ByteOrder; -import net.yacy.kelondro.order.CloneableIterator; import net.yacy.kelondro.util.SetTools; diff --git a/source/net/yacy/kelondro/index/Index.java b/source/net/yacy/kelondro/index/Index.java index da436c848..9e90366ce 100644 --- a/source/net/yacy/kelondro/index/Index.java +++ b/source/net/yacy/kelondro/index/Index.java @@ -30,7 +30,7 @@ import java.util.Iterator; import java.util.List; import java.util.Map; -import net.yacy.kelondro.order.CloneableIterator; +import net.yacy.cora.order.CloneableIterator; public interface Index extends Iterable { diff --git a/source/net/yacy/kelondro/index/RAMIndex.java b/source/net/yacy/kelondro/index/RAMIndex.java index 878176d91..30a9de1e0 100644 --- a/source/net/yacy/kelondro/index/RAMIndex.java +++ b/source/net/yacy/kelondro/index/RAMIndex.java @@ -32,8 +32,8 @@ import java.util.List; import java.util.Map; import java.util.TreeMap; +import net.yacy.cora.order.CloneableIterator; import net.yacy.kelondro.index.Row.Entry; -import net.yacy.kelondro.order.CloneableIterator; import net.yacy.kelondro.order.MergeIterator; import net.yacy.kelondro.order.StackIterator; diff --git a/source/net/yacy/kelondro/index/RAMIndexCluster.java b/source/net/yacy/kelondro/index/RAMIndexCluster.java index d8b118424..ea5d01eea 100644 --- a/source/net/yacy/kelondro/index/RAMIndexCluster.java +++ b/source/net/yacy/kelondro/index/RAMIndexCluster.java @@ -32,9 +32,9 @@ import java.util.List; import java.util.Map; import java.util.TreeMap; +import net.yacy.cora.order.CloneableIterator; import net.yacy.kelondro.index.Row.Entry; import net.yacy.kelondro.logging.Log; -import net.yacy.kelondro.order.CloneableIterator; import net.yacy.kelondro.order.MergeIterator; import net.yacy.kelondro.order.StackIterator; diff --git a/source/net/yacy/kelondro/index/Row.java b/source/net/yacy/kelondro/index/Row.java index b292fa6ef..55b559aa5 100644 --- a/source/net/yacy/kelondro/index/Row.java +++ b/source/net/yacy/kelondro/index/Row.java @@ -37,12 +37,12 @@ import java.util.concurrent.ConcurrentHashMap; import net.yacy.cora.document.ASCII; import net.yacy.cora.document.UTF8; -import net.yacy.cora.ranking.AbstractOrder; -import net.yacy.cora.ranking.Order; +import net.yacy.cora.order.AbstractOrder; +import net.yacy.cora.order.ByteOrder; +import net.yacy.cora.order.Order; import net.yacy.kelondro.logging.Log; import net.yacy.kelondro.order.Base64Order; import net.yacy.kelondro.order.Bitfield; -import net.yacy.kelondro.order.ByteOrder; import net.yacy.kelondro.order.NaturalOrder; import net.yacy.kelondro.util.ByteBuffer; import net.yacy.kelondro.util.kelondroException; diff --git a/source/net/yacy/kelondro/index/RowCollection.java b/source/net/yacy/kelondro/index/RowCollection.java index 0d8df7609..df9480281 100644 --- a/source/net/yacy/kelondro/index/RowCollection.java +++ b/source/net/yacy/kelondro/index/RowCollection.java @@ -34,12 +34,12 @@ import java.util.concurrent.Callable; import net.yacy.cora.document.ASCII; import net.yacy.cora.document.UTF8; +import net.yacy.cora.order.ByteOrder; import net.yacy.cora.sorting.Array; import net.yacy.cora.sorting.Sortable; import net.yacy.kelondro.index.Row.Entry; import net.yacy.kelondro.logging.Log; import net.yacy.kelondro.order.Base64Order; -import net.yacy.kelondro.order.ByteOrder; import net.yacy.kelondro.order.NaturalOrder; import net.yacy.kelondro.util.FileUtils; import net.yacy.kelondro.util.MemoryControl; diff --git a/source/net/yacy/kelondro/index/RowSet.java b/source/net/yacy/kelondro/index/RowSet.java index e69f8410a..2ba38a0d6 100644 --- a/source/net/yacy/kelondro/index/RowSet.java +++ b/source/net/yacy/kelondro/index/RowSet.java @@ -35,9 +35,9 @@ import java.util.TreeMap; import net.yacy.cora.document.ASCII; import net.yacy.cora.document.UTF8; +import net.yacy.cora.order.CloneableIterator; import net.yacy.kelondro.logging.Log; import net.yacy.kelondro.order.Base64Order; -import net.yacy.kelondro.order.CloneableIterator; import net.yacy.kelondro.order.NaturalOrder; import net.yacy.kelondro.util.MemoryControl; diff --git a/source/net/yacy/kelondro/io/CharBuffer.java b/source/net/yacy/kelondro/io/CharBuffer.java index 494d56006..70fe1b3f3 100644 --- a/source/net/yacy/kelondro/io/CharBuffer.java +++ b/source/net/yacy/kelondro/io/CharBuffer.java @@ -45,9 +45,9 @@ public final class CharBuffer extends Writer { public CharBuffer() { - buffer = new char[10]; - length = 0; - offset = 0; + this.buffer = new char[10]; + this.length = 0; + this.offset = 0; } public CharBuffer(final int initLength) { @@ -57,44 +57,44 @@ public final class CharBuffer extends Writer { } public CharBuffer(final char[] bb) { - buffer = bb; - length = bb.length; - offset = 0; + this.buffer = bb; + this.length = bb.length; + this.offset = 0; } public CharBuffer(final char[] bb, final int initLength) { this.buffer = new char[initLength]; - System.arraycopy(bb, 0, buffer, 0, bb.length); - length = bb.length; - offset = 0; + System.arraycopy(bb, 0, this.buffer, 0, bb.length); + this.length = bb.length; + this.offset = 0; } public CharBuffer(final char[] bb, final int of, final int le) { if (of * 2 > bb.length) { - buffer = new char[le]; - System.arraycopy(bb, of, buffer, 0, le); - length = le; - offset = 0; + this.buffer = new char[le]; + System.arraycopy(bb, of, this.buffer, 0, le); + this.length = le; + this.offset = 0; } else { - buffer = bb; - length = le; - offset = of; + this.buffer = bb; + this.length = le; + this.offset = of; } } public CharBuffer(final CharBuffer bb) { - buffer = bb.buffer; - length = bb.length; - offset = bb.offset; + this.buffer = bb.buffer; + this.length = bb.length; + this.offset = bb.offset; } public CharBuffer(final File f) throws IOException { // initially fill the buffer with the content of a file if (f.length() > Integer.MAX_VALUE) throw new IOException("file is too large for buffering"); - length = 0; - buffer = new char[(int) f.length()*2]; - offset = 0; + this.length = 0; + this.buffer = new char[(int) f.length()*2]; + this.offset = 0; FileReader fr = null; try { @@ -114,52 +114,66 @@ public final class CharBuffer extends Writer { public void clear() { this.buffer = new char[0]; - length = 0; - offset = 0; + this.length = 0; + this.offset = 0; } public int length() { - return length; + return this.length; } private void grow(int minSize) { - int newsize = buffer.length + 1024; + int newsize = this.buffer.length + 1024; if (newsize < minSize) newsize = minSize+1; char[] tmp = new char[newsize]; - System.arraycopy(buffer, offset, tmp, 0, length); - buffer = tmp; - offset = 0; + System.arraycopy(this.buffer, this.offset, tmp, 0, this.length); + this.buffer = tmp; + this.offset = 0; } + @Override public void write(final int b) { write((char)b); } public void write(final char b) { - if (offset + length + 1 > buffer.length) grow(offset + length + 1); - buffer[offset + length++] = b; + if (this.offset + this.length + 1 > this.buffer.length) grow(this.offset + this.length + 1); + this.buffer[this.offset + this.length++] = b; } + @Override public void write(final char[] bb) { write(bb, 0, bb.length); } + @Override public void write(final char[] bb, final int of, final int le) { - if (offset + length + le > buffer.length) grow(offset + length + le); - System.arraycopy(bb, of, buffer, offset + length, le); - length += le; + if (this.offset + this.length + le > this.buffer.length) grow(this.offset + this.length + le); + System.arraycopy(bb, of, this.buffer, this.offset + this.length, le); + this.length += le; + } + + private static final char SPACE = ' '; + private static final char CR = (char) 13; + private static final char LF = (char) 10; + + public CharBuffer appendSpace() { + write(SPACE); + return this; } -// do not use/implement the following method, a -// "overridden method is a bridge method" -// will occur -// public serverCharBuffer append(char b) { -// write(b); -// return this; -// } + public CharBuffer appendCR() { + write(CR); + return this; + } + + public CharBuffer appendLF() { + write(LF); + return this; + } public CharBuffer append(final int i) { - write((char) (i)); + write((char) i); return this; } @@ -173,6 +187,7 @@ public final class CharBuffer extends Writer { return this; } + @Override public CharBuffer append(final char c) { write(c); return this; @@ -180,39 +195,36 @@ public final class CharBuffer extends Writer { public CharBuffer append(final String s) { final char[] temp = new char[s.length()]; - s.getChars(0, temp.length, temp, 0); - return append(temp); + s.getChars(0, temp.length, temp, 0); + write(temp); + return this; } public CharBuffer append(final String s, final int off, final int len) { final char[] temp = new char[len]; - s.getChars(off, (off + len), temp, 0); - return append(temp); + s.getChars(off, (off + len), temp, 0); + write(temp); + return this; } public CharBuffer append(final CharBuffer bb) { - return append(bb.buffer, bb.offset, bb.length); + write(bb.buffer, bb.offset, bb.length); + return this; } - -// public serverCharBuffer append(Object o) { -// if (o instanceof String) return append((String) o); -// if (o instanceof char[]) return append((char[]) o); -// return null; -// } public char charAt(final int pos) { if (pos < 0) throw new IndexOutOfBoundsException(); - if (pos > length) throw new IndexOutOfBoundsException(); - return buffer[offset + pos]; + if (pos > this.length) throw new IndexOutOfBoundsException(); + return this.buffer[this.offset + pos]; } public void deleteCharAt(final int pos) { if (pos < 0) return; - if (pos >= length) return; - if (pos == length - 1) { - length--; + if (pos >= this.length) return; + if (pos == this.length - 1) { + this.length--; } else { - System.arraycopy(buffer, offset + pos + 1, buffer, offset + pos, length - pos - 1); + System.arraycopy(this.buffer, this.offset + pos + 1, this.buffer, this.offset + pos, this.length - pos - 1); } } @@ -225,20 +237,20 @@ public final class CharBuffer extends Writer { } public int indexOf(final char b, final int start) { - if (start >= length) return -1; - for (int i = start; i < length; i++) if (buffer[offset + i] == b) return i; + if (start >= this.length) return -1; + for (int i = start; i < this.length; i++) if (this.buffer[this.offset + i] == b) return i; return -1; } public int indexOf(final char[] bs, final int start) { - if (start + bs.length > length) return -1; - loop: for (int i = start; i <= length - bs.length; i++) { + if (start + bs.length > this.length) return -1; + loop: for (int i = start; i <= this.length - bs.length; i++) { // first test only first char - if (buffer[offset + i] != bs[0]) continue loop; + if (this.buffer[this.offset + i] != bs[0]) continue loop; // then test all remaining char for (int j = 1; j < bs.length; j++) { - if (buffer[offset + i + j] != bs[j]) continue loop; + if (this.buffer[this.offset + i + j] != bs[j]) continue loop; } // found hit @@ -278,14 +290,14 @@ public final class CharBuffer extends Writer { } public int lastIndexOf(final char b) { - for (int i = length - 1; i >= 0; i--) if (buffer[offset + i] == b) return i; + for (int i = this.length - 1; i >= 0; i--) if (this.buffer[this.offset + i] == b) return i; return -1; } public boolean startsWith(final char[] bs) { - if (length < bs.length) return false; + if (this.length < bs.length) return false; for (int i = 0; i < bs.length; i++) { - if (buffer[offset + i] != bs[i]) return false; + if (this.buffer[this.offset + i] != bs[i]) return false; } return true; } @@ -295,45 +307,45 @@ public final class CharBuffer extends Writer { } public char[] getChars(final int start) { - return getChars(start, length); + return getChars(start, this.length); } public char[] getChars(final int start, final int end) { // start is inclusive, end is exclusive - if (end > length) throw new IndexOutOfBoundsException("getBytes: end > length"); - if (start > length) throw new IndexOutOfBoundsException("getBytes: start > length"); + if (end > this.length) throw new IndexOutOfBoundsException("getBytes: end > length"); + if (start > this.length) throw new IndexOutOfBoundsException("getBytes: start > length"); final char[] tmp = new char[end - start]; - System.arraycopy(buffer, offset + start, tmp, 0, end - start); + System.arraycopy(this.buffer, this.offset + start, tmp, 0, end - start); return tmp; } public byte[] getBytes() { - return UTF8.getBytes(new String(buffer, offset, length)); + return UTF8.getBytes(new String(this.buffer, this.offset, this.length)); } public CharBuffer trim(final int start) { // the end value is outside (+1) of the wanted target array - if (start > length) throw new IndexOutOfBoundsException("trim: start > length"); - offset = offset + start; - length = length - start; + if (start > this.length) throw new IndexOutOfBoundsException("trim: start > length"); + this.offset = this.offset + start; + this.length = this.length - start; return this; } public CharBuffer trim(final int start, final int end) { // the end value is outside (+1) of the wanted target array - if (start > length) throw new IndexOutOfBoundsException("trim: start > length"); - if (end > length) throw new IndexOutOfBoundsException("trim: end > length"); + if (start > this.length) throw new IndexOutOfBoundsException("trim: start > length"); + if (end > this.length) throw new IndexOutOfBoundsException("trim: end > length"); if (start > end) throw new IndexOutOfBoundsException("trim: start > end"); - offset = offset + start; - length = end - start; + this.offset = this.offset + start; + this.length = end - start; return this; } public CharBuffer trim() { int l = 0; - while ((l < length) && (buffer[offset + l] <= ' ')) l++; - int r = length; - while ((r > 0) && (buffer[offset + r - 1] <= ' ')) r--; + while ((l < this.length) && (this.buffer[this.offset + l] <= ' ')) l++; + int r = this.length; + while ((r > 0) && (this.buffer[this.offset + r - 1] <= ' ')) r--; if (l > r) r = l; return trim(l, r); } @@ -342,12 +354,12 @@ public final class CharBuffer extends Writer { // returns true, if trim() would result in an empty serverByteBuffer if (includeNonLetterBytes) { char b; - for (int i = 0; i < length; i++) { - b = buffer[offset + i]; + for (int i = 0; i < this.length; i++) { + b = this.buffer[this.offset + i]; if (((b >= '0') && (b <= '9')) || ((b >= 'A') && (b <= 'Z')) || ((b >= 'a') && (b <= 'z'))) return false; } } else { - for (int i = 0; i < length; i++) if (buffer[offset + i] > 32) return false; + for (int i = 0; i < this.length; i++) if (this.buffer[this.offset + i] > 32) return false; } return true; } @@ -356,86 +368,87 @@ public final class CharBuffer extends Writer { // returns number of whitespace char at the beginning of text if (includeNonLetterBytes) { char b; - for (int i = 0; i < length; i++) { - b = buffer[offset + i]; + for (int i = 0; i < this.length; i++) { + b = this.buffer[this.offset + i]; if (((b >= '0') && (b <= '9')) || ((b >= 'A') && (b <= 'Z')) || ((b >= 'a') && (b <= 'z'))) return i; } } else { - for (int i = 0; i < length; i++) if (buffer[offset + i] > 32) return i; + for (int i = 0; i < this.length; i++) if (this.buffer[this.offset + i] > 32) return i; } - return length; + return this.length; } public int whitespaceEnd(final boolean includeNonLetterBytes) { // returns position of whitespace at the end of text if (includeNonLetterBytes) { char b; - for (int i = length - 1; i >= 0; i--) { - b = buffer[offset + i]; + for (int i = this.length - 1; i >= 0; i--) { + b = this.buffer[this.offset + i]; if (((b >= '0') && (b <= '9')) || ((b >= 'A') && (b <= 'Z')) || ((b >= 'a') && (b <= 'z'))) return i + 1; } } else { - for (int i = length - 1; i >= 0; i--) if (buffer[offset + i] > 32) return i + 1; + for (int i = this.length - 1; i >= 0; i--) if (this.buffer[this.offset + i] > 32) return i + 1; } return 0; } + @Override public String toString() { - return new String(buffer, offset, length); + return new String(this.buffer, this.offset, this.length); } public String toString(final int left, final int rightbound) { - return new String(buffer, offset + left, rightbound - left); + return new String(this.buffer, this.offset + left, rightbound - left); } public Properties propParser() { // extract a=b or a="b" - relations from the buffer - int pos = offset; + int pos = this.offset; int start; String key; final Properties p = new Properties(); // eat up spaces at beginning - while ((pos < length) && (buffer[pos] <= 32)) pos++; - while (pos < length) { + while ((pos < this.length) && (this.buffer[pos] <= 32)) pos++; + while (pos < this.length) { // pos is at start of next key start = pos; - while ((pos < length) && (buffer[pos] != equal)) pos++; - if (pos >= length) break; // this is the case if we found no equal - key = new String(buffer, start, pos - start).trim().toLowerCase(); + while ((pos < this.length) && (this.buffer[pos] != equal)) pos++; + if (pos >= this.length) break; // this is the case if we found no equal + key = new String(this.buffer, start, pos - start).trim().toLowerCase(); // we have a key pos++; // find start of value - while ((pos < length) && (buffer[pos] <= 32)) pos++; + while ((pos < this.length) && (this.buffer[pos] <= 32)) pos++; // doublequotes are obligatory. However, we want to be fuzzy if they // are ommittet - if (pos >= length) { + if (pos >= this.length) { // error case: input ended too early break; - } else if (buffer[pos] == doublequote) { + } else if (this.buffer[pos] == doublequote) { // search next doublequote pos++; start = pos; - while ((pos < length) && (buffer[pos] != doublequote)) pos++; - if (pos >= length) break; // this is the case if we found no parent doublequote - p.setProperty(key, new String(buffer, start, pos - start).trim()); + while ((pos < this.length) && (this.buffer[pos] != doublequote)) pos++; + if (pos >= this.length) break; // this is the case if we found no parent doublequote + p.setProperty(key, new String(this.buffer, start, pos - start).trim()); pos++; - } else if (buffer[pos] == singlequote) { + } else if (this.buffer[pos] == singlequote) { // search next singlequote pos++; start = pos; - while ((pos < length) && (buffer[pos] != singlequote)) pos++; - if (pos >= length) break; // this is the case if we found no parent singlequote - p.setProperty(key, new String(buffer, start, pos - start).trim()); + while ((pos < this.length) && (this.buffer[pos] != singlequote)) pos++; + if (pos >= this.length) break; // this is the case if we found no parent singlequote + p.setProperty(key, new String(this.buffer, start, pos - start).trim()); pos++; } else { // search next whitespace start = pos; - while ((pos < length) && (buffer[pos] > 32)) pos++; - p.setProperty(key, new String(buffer, start, pos - start).trim()); + while ((pos < this.length) && (this.buffer[pos] > 32)) pos++; + p.setProperty(key, new String(this.buffer, start, pos - start).trim()); } // pos should point now to a whitespace: eat up spaces - while ((pos < length) && (buffer[pos] <= 32)) pos++; + while ((pos < this.length) && (this.buffer[pos] <= 32)) pos++; // go on with next loop } return p; @@ -475,10 +488,12 @@ public final class CharBuffer extends Writer { return newbuf; } + @Override public void close() throws IOException { - buffer = null; // assist with garbage collection + this.buffer = null; // assist with garbage collection } + @Override public void flush() throws IOException { // TODO Auto-generated method stub } diff --git a/source/net/yacy/kelondro/order/Base64Order.java b/source/net/yacy/kelondro/order/Base64Order.java index 5b462a24f..2b2f689e7 100644 --- a/source/net/yacy/kelondro/order/Base64Order.java +++ b/source/net/yacy/kelondro/order/Base64Order.java @@ -30,16 +30,17 @@ package net.yacy.kelondro.order; import java.util.Comparator; import net.yacy.cora.document.UTF8; -import net.yacy.cora.ranking.AbstractOrder; -import net.yacy.cora.ranking.Order; +import net.yacy.cora.order.AbstractOrder; +import net.yacy.cora.order.ByteOrder; +import net.yacy.cora.order.Order; public class Base64Order extends AbstractOrder implements ByteOrder, Comparator, Cloneable { - protected static final byte[] alpha_standard = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".getBytes(); - protected static final byte[] alpha_enhanced = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_".getBytes(); - protected static final byte[] ahpla_standard = new byte[128]; - protected static final byte[] ahpla_enhanced = new byte[128]; + public static final byte[] alpha_standard = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".getBytes(); + public static final byte[] alpha_enhanced = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_".getBytes(); + private static final byte[] ahpla_standard = new byte[128]; + private static final byte[] ahpla_enhanced = new byte[128]; static { for (int i = 0; i < 128; i++) { @@ -92,16 +93,19 @@ public class Base64Order extends AbstractOrder implements ByteOrder, Com return z; } + @Override public Order clone() { final Base64Order o = new Base64Order(this.asc, this.rfc1113compliant); o.rotate(this.zero); return o; } + @Override public final boolean wellformed(final byte[] a) { return wellformed(a, 0, a.length); } + @Override public final boolean wellformed(final byte[] a, final int astart, final int alength) { assert (astart + alength <= a.length) : "astart = " + astart + ", alength = " + alength + ", a.length = " + a.length; int b; @@ -120,6 +124,7 @@ public class Base64Order extends AbstractOrder implements ByteOrder, Com return null; } + @Override public final String signature() { if ((!this.asc) && (!this.rfc1113compliant)) return "Bd"; if ((!this.asc) && ( this.rfc1113compliant)) return "bd"; @@ -347,6 +352,7 @@ public class Base64Order extends AbstractOrder implements ByteOrder, Com return b; } + @Override public final long cardinal(final byte[] key) { if (this.zero == null) return cardinalI(key, 0, key.length); final long zeroCardinal = cardinalI(this.zero, 0, this.zero.length); @@ -355,6 +361,7 @@ public class Base64Order extends AbstractOrder implements ByteOrder, Com return Long.MAX_VALUE - keyCardinal + zeroCardinal; } + @Override public final long cardinal(final byte[] key, final int off, final int len) { if (this.zero == null) return cardinalI(key, off, len); final long zeroCardinal = cardinalI(this.zero, 0, this.zero.length); @@ -375,6 +382,7 @@ public class Base64Order extends AbstractOrder implements ByteOrder, Com return (x > 0) ? 1 : (x < 0) ? -1 : 0; } + @Override public final boolean equal(final byte[] a, final byte[] b) { if ((a == null) && (b == null)) return true; if ((a == null) || (b == null)) return false; @@ -388,6 +396,7 @@ public class Base64Order extends AbstractOrder implements ByteOrder, Com return true; } + @Override public final boolean equal(final byte[] a, int astart, final byte[] b, int bstart, int length) { if ((a == null) && (b == null)) return true; if ((a == null) || (b == null)) return false; @@ -397,6 +406,7 @@ public class Base64Order extends AbstractOrder implements ByteOrder, Com return true; } + @Override public final int compare(final byte[] a, final byte[] b) { try { return (this.asc) ? @@ -423,6 +433,7 @@ public class Base64Order extends AbstractOrder implements ByteOrder, Com } } + @Override public final int compare(final byte[] a, final byte[] b, final int length) { try { return (this.asc) ? @@ -444,6 +455,7 @@ public class Base64Order extends AbstractOrder implements ByteOrder, Com } } + @Override public final int compare(final byte[] a, final int aoffset, final byte[] b, final int boffset, final int length) { try { return (this.asc) ? diff --git a/source/net/yacy/kelondro/order/ByteOrder.java b/source/net/yacy/kelondro/order/ByteOrder.java deleted file mode 100644 index 630aab691..000000000 --- a/source/net/yacy/kelondro/order/ByteOrder.java +++ /dev/null @@ -1,54 +0,0 @@ -// ByteOrder.java -// ----------------------------- -// (C) 2008 by Michael Peter Christen; mc@yacy.net, Frankfurt a. M., Germany -// first published 10.01.2008 on http://yacy.net -// -// This is a part of YaCy, a peer-to-peer based web search engine -// -// $LastChangedDate$ -// $LastChangedRevision$ -// $LastChangedBy$ -// -// LICENSE -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 2 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -package net.yacy.kelondro.order; - -import net.yacy.cora.ranking.Order; - - -public interface ByteOrder extends Order { - - public boolean wellformed(byte[] a); - - public boolean wellformed(byte[] a, int start, int len); - - public int compare(byte[] a, byte[] b); - - public int compare(byte[] a, byte[] b, int len); - - public int compare(byte[] a, int astart, byte[] b, int bstart, int len); - - public boolean equal(final byte[] a, final byte[] b); - - public boolean equal(final byte[] a, int astart, final byte[] b, int bstart, int length); - - public long cardinal(final byte[] a, int off, int len); - - public byte[] smallest(byte[] a, byte[] b); - - public byte[] largest(byte[] a, byte[] b); -} diff --git a/source/net/yacy/kelondro/order/CloneableIterator.java b/source/net/yacy/kelondro/order/CloneableIterator.java deleted file mode 100644 index e51a86ad2..000000000 --- a/source/net/yacy/kelondro/order/CloneableIterator.java +++ /dev/null @@ -1,37 +0,0 @@ -// CloneableIterator.java -// (C) 2007 by Michael Peter Christen; mc@yacy.net, Frankfurt a. M., Germany -// first published 08.03.2007 on http://www.anomic.de -// -// This is a part of YaCy, a peer-to-peer based web search engine -// -// $LastChangedDate$ -// $LastChangedRevision$ -// $LastChangedBy$ -// -// LICENSE -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 2 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -package net.yacy.kelondro.order; - -import java.util.Iterator; - -public interface CloneableIterator extends Iterator { - - // clone the iterator using a modifier - // the modifier can be i.e. a re-start position - public CloneableIterator clone(Object modifier); - -} diff --git a/source/net/yacy/kelondro/order/CloneableMapIterator.java b/source/net/yacy/kelondro/order/CloneableMapIterator.java deleted file mode 100644 index ce8cc0707..000000000 --- a/source/net/yacy/kelondro/order/CloneableMapIterator.java +++ /dev/null @@ -1,82 +0,0 @@ -// CloneableMapIterator.java -// (C) 2007 by Michael Peter Christen; mc@yacy.net, Frankfurt a. M., Germany -// first published 25.04.2007 on http://yacy.net -// -// This is a part of YaCy, a peer-to-peer based web search engine -// -// $LastChangedDate$ -// $LastChangedRevision$ -// $LastChangedBy$ -// -// LICENSE -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 2 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - -package net.yacy.kelondro.order; - -import java.util.Iterator; -import java.util.TreeMap; - - -public class CloneableMapIterator implements CloneableIterator { - - TreeMap map; - E next, last; - Object start; - Iterator iter; - - - public CloneableMapIterator(final TreeMap map, final E start) { - // map must contain eiter a byte[]/Object or a String/Object mapping. - // start must be either of type byte[] or String - // this iterator iterates then only the key elements of the map - this.map = map; - this.start = start; - this.iter = map.keySet().iterator(); - if (this.start == null) { - if (iter.hasNext()) this.next = iter.next(); else this.next = null; - } else while (iter.hasNext()) { - this.next = iter.next(); - if (map.comparator().compare(next, start) > 1) break; - } - this.last = null; - } - - @SuppressWarnings("unchecked") - public CloneableMapIterator clone(final Object modifier) { - return new CloneableMapIterator(map, (E) modifier); - } - - public boolean hasNext() { - return this.next != null; - } - - public E next() { - // returns key-elements, not entry-elements - this.last = this.next; - if (this.iter.hasNext()) { - this.next = this.iter.next(); - } else { - this.next = null; - } - return this.last; - } - - public void remove() { - this.map.remove(this.last); - } - -} diff --git a/source/net/yacy/kelondro/order/Digest.java b/source/net/yacy/kelondro/order/Digest.java index 93fd4b816..0d26ee5e8 100644 --- a/source/net/yacy/kelondro/order/Digest.java +++ b/source/net/yacy/kelondro/order/Digest.java @@ -41,28 +41,31 @@ import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; +import java.util.concurrent.LinkedBlockingDeque; import java.util.concurrent.LinkedBlockingQueue; import net.yacy.cora.document.UTF8; +import net.yacy.cora.storage.ARC; +import net.yacy.cora.storage.ConcurrentARC; import net.yacy.kelondro.logging.Log; +import net.yacy.kelondro.util.MemoryControl; public class Digest { - private final static int digestThreads = Runtime.getRuntime().availableProcessors() * 4; - public static BlockingQueue digestPool = new ArrayBlockingQueue(digestThreads); - static { - for (int i = 0; i < digestThreads; i++) - try { - final MessageDigest digest = MessageDigest.getInstance("MD5"); - digest.reset(); - digestPool.add(digest); - } catch (final NoSuchAlgorithmException e) { - Log.logException(e); - } - } + public static BlockingQueue digestPool = new LinkedBlockingDeque(); + private static final int md5CacheSize = Math.max(200000, Math.min(10000000, (int) (MemoryControl.available() / 20000L))); + private static ARC md5Cache = null; + static { + try { + md5Cache = new ConcurrentARC(md5CacheSize, Math.max(32, 4 * Runtime.getRuntime().availableProcessors())); + } catch (final OutOfMemoryError e) { + md5Cache = new ConcurrentARC(1000, Math.max(8, 2 * Runtime.getRuntime().availableProcessors())); + } + } + public static String encodeHex(final long in, final int length) { String s = Long.toHexString(in); while (s.length() < length) s = "0" + s; @@ -113,45 +116,36 @@ public class Digest { } public static byte[] encodeMD5Raw(final String key) { - MessageDigest digest = null; - boolean fromPool = true; - if (digestPool.size() == 0) { + + byte[] h = md5Cache.get(key); + if (h != null) return h; + + MessageDigest digest = digestPool.poll(); + if (digest == null) { // if there are no digest objects left, create some on the fly // this is not the most effective way but if we wouldn't do that the encoder would block try { digest = MessageDigest.getInstance("MD5"); digest.reset(); - fromPool = false; } catch (final NoSuchAlgorithmException e) { } } - if (digest == null) try { - digest = digestPool.take(); - } catch (final InterruptedException e) { - Log.logWarning("Digest", "using generic instead of pooled digest"); - try { - digest = MessageDigest.getInstance("MD5"); - } catch (final NoSuchAlgorithmException e1) { - Log.logException(e1); - } - digest.reset(); - fromPool = false; - } byte[] keyBytes; keyBytes = UTF8.getBytes(key); digest.update(keyBytes); final byte[] result = digest.digest(); digest.reset(); - if (fromPool) { - returntopool: while (true) { - try { - digestPool.put(digest); - break returntopool; - } catch (final InterruptedException e) { - // we MUST return that digest to the pool - continue returntopool; - } - } + try { + digestPool.put(digest); + //System.out.println("Digest Pool size = " + digestPool.size()); + } catch ( InterruptedException e ) { + } + + // update the cache + if (MemoryControl.shortStatus()) { + md5Cache.clear(); + } else { + md5Cache.insertIfAbsent(key, result); // prevent expensive MD5 computation and encoding } return result; } @@ -250,6 +244,7 @@ public class Digest { } } + @Override public MessageDigest call() { try { filechunk c; diff --git a/source/net/yacy/kelondro/order/MergeIterator.java b/source/net/yacy/kelondro/order/MergeIterator.java index 95aa695cf..2500f0875 100644 --- a/source/net/yacy/kelondro/order/MergeIterator.java +++ b/source/net/yacy/kelondro/order/MergeIterator.java @@ -29,7 +29,8 @@ import java.util.Comparator; import java.util.ConcurrentModificationException; import java.util.Iterator; -import net.yacy.cora.ranking.Order; +import net.yacy.cora.order.CloneableIterator; +import net.yacy.cora.order.Order; import net.yacy.kelondro.logging.Log; diff --git a/source/net/yacy/kelondro/order/NaturalOrder.java b/source/net/yacy/kelondro/order/NaturalOrder.java index 7247eb629..d01a5f25d 100644 --- a/source/net/yacy/kelondro/order/NaturalOrder.java +++ b/source/net/yacy/kelondro/order/NaturalOrder.java @@ -29,8 +29,9 @@ package net.yacy.kelondro.order; import java.util.Comparator; import java.util.Iterator; -import net.yacy.cora.ranking.AbstractOrder; -import net.yacy.cora.ranking.Order; +import net.yacy.cora.order.AbstractOrder; +import net.yacy.cora.order.ByteOrder; +import net.yacy.cora.order.Order; import net.yacy.kelondro.index.HandleSet; public final class NaturalOrder extends AbstractOrder implements ByteOrder, Comparator, Cloneable { diff --git a/source/net/yacy/kelondro/order/RotateIterator.java b/source/net/yacy/kelondro/order/RotateIterator.java index c16365e9f..6d9365e08 100644 --- a/source/net/yacy/kelondro/order/RotateIterator.java +++ b/source/net/yacy/kelondro/order/RotateIterator.java @@ -26,6 +26,8 @@ package net.yacy.kelondro.order; +import net.yacy.cora.order.CloneableIterator; + public class RotateIterator implements CloneableIterator { diff --git a/source/net/yacy/kelondro/order/StackIterator.java b/source/net/yacy/kelondro/order/StackIterator.java index 260cfa652..d9cf0a902 100644 --- a/source/net/yacy/kelondro/order/StackIterator.java +++ b/source/net/yacy/kelondro/order/StackIterator.java @@ -24,6 +24,8 @@ package net.yacy.kelondro.order; import java.util.ConcurrentModificationException; +import net.yacy.cora.order.CloneableIterator; + public class StackIterator implements CloneableIterator { diff --git a/source/net/yacy/kelondro/order/StringOrder.java b/source/net/yacy/kelondro/order/StringOrder.java index a92561de4..9b83ada58 100644 --- a/source/net/yacy/kelondro/order/StringOrder.java +++ b/source/net/yacy/kelondro/order/StringOrder.java @@ -30,7 +30,8 @@ package net.yacy.kelondro.order; import java.util.Comparator; import net.yacy.cora.document.UTF8; -import net.yacy.cora.ranking.Order; +import net.yacy.cora.order.ByteOrder; +import net.yacy.cora.order.Order; public class StringOrder implements Comparator { diff --git a/source/net/yacy/kelondro/rwi/AbstractBufferedIndex.java b/source/net/yacy/kelondro/rwi/AbstractBufferedIndex.java index 8acec27c7..926d6d2ab 100644 --- a/source/net/yacy/kelondro/rwi/AbstractBufferedIndex.java +++ b/source/net/yacy/kelondro/rwi/AbstractBufferedIndex.java @@ -31,7 +31,7 @@ import java.io.IOException; import java.util.Iterator; import java.util.TreeSet; -import net.yacy.cora.ranking.Order; +import net.yacy.cora.order.Order; public abstract class AbstractBufferedIndex extends AbstractIndex implements BufferedIndex { @@ -40,7 +40,7 @@ public abstract class AbstractBufferedIndex ext super(factory); } - public synchronized TreeSet> referenceContainer(byte[] startHash, final boolean rot, int count, final boolean ram) throws IOException { + public synchronized TreeSet> referenceContainer(byte[] startHash, final boolean rot, final boolean excludePrivate, int count, final boolean ram) throws IOException { // creates a set of indexContainers // this does not use the cache final Order> containerOrder = new ReferenceContainerOrder(this.factory, termKeyOrdering().clone()); @@ -48,7 +48,7 @@ public abstract class AbstractBufferedIndex ext final ReferenceContainer emptyContainer = ReferenceContainer.emptyContainer(this.factory, startHash); containerOrder.rotate(emptyContainer); final TreeSet> containers = new TreeSet>(containerOrder); - final Iterator> i = referenceContainerIterator(startHash, rot, ram); + final Iterator> i = referenceContainerIterator(startHash, rot, excludePrivate, ram); if (ram) count = Math.min(size(), count); ReferenceContainer container; // this loop does not terminate using the i.hasNex() predicate when rot == true diff --git a/source/net/yacy/kelondro/rwi/AbstractIndex.java b/source/net/yacy/kelondro/rwi/AbstractIndex.java index 9c78d2c5a..8418eab51 100644 --- a/source/net/yacy/kelondro/rwi/AbstractIndex.java +++ b/source/net/yacy/kelondro/rwi/AbstractIndex.java @@ -32,7 +32,7 @@ import java.util.Iterator; import java.util.TreeMap; import java.util.TreeSet; -import net.yacy.cora.ranking.Order; +import net.yacy.cora.order.Order; import net.yacy.kelondro.index.HandleSet; import net.yacy.kelondro.index.Row; import net.yacy.kelondro.index.RowSpaceExceededException; @@ -54,6 +54,7 @@ public abstract class AbstractIndex implements * @throws IOException * @throws RowSpaceExceededException */ + @Override public void merge(final Index otherIndex) throws IOException, RowSpaceExceededException { byte[] term; for (final ReferenceContainer otherContainer: otherIndex) { @@ -71,6 +72,7 @@ public abstract class AbstractIndex implements } } + @Override public void removeDelayed(final HandleSet termHashes, final byte[] urlHashBytes) throws IOException { // remove the same url hashes for multiple words // this is mainly used when correcting a index after a search @@ -80,6 +82,7 @@ public abstract class AbstractIndex implements } } + @Override public int remove(final HandleSet termHashes, final byte[] urlHashBytes) throws IOException { // remove the same url hashes for multiple words // this is mainly used when correcting a index after a search @@ -91,14 +94,14 @@ public abstract class AbstractIndex implements return c; } - public synchronized TreeSet> referenceContainer(final byte[] startHash, final boolean rot, int count) throws IOException { + public synchronized TreeSet> referenceContainer(final byte[] startHash, final boolean rot, final boolean excludePrivate, int count) throws IOException { // creates a set of indexContainers // this does not use the cache final Order> containerOrder = new ReferenceContainerOrder(this.factory, termKeyOrdering().clone()); final ReferenceContainer emptyContainer = ReferenceContainer.emptyContainer(this.factory, startHash); containerOrder.rotate(emptyContainer); final TreeSet> containers = new TreeSet>(containerOrder); - final Iterator> i = referenceContainerIterator(startHash, rot); + final Iterator> i = referenceContainerIterator(startHash, rot, excludePrivate); //if (ram) count = Math.min(size(), count); ReferenceContainer container; // this loop does not terminate using the i.hasNex() predicate when rot == true @@ -126,6 +129,7 @@ public abstract class AbstractIndex implements * @param urlselection * @return map of wordhash:indexContainer */ + @Override public TreeMap> searchConjunction(final HandleSet wordHashes, final HandleSet urlselection) { // first check if there is any entry that has no match; this uses only operations in ram /* @@ -212,6 +216,7 @@ public abstract class AbstractIndex implements return new TermSearch(this, queryHashes, excludeHashes, urlselection, termFactory, maxDistance); } + @Override public Row referenceRow() { return this.factory.getRow(); } diff --git a/source/net/yacy/kelondro/rwi/BufferedIndex.java b/source/net/yacy/kelondro/rwi/BufferedIndex.java index b4e056547..9509cfe75 100644 --- a/source/net/yacy/kelondro/rwi/BufferedIndex.java +++ b/source/net/yacy/kelondro/rwi/BufferedIndex.java @@ -30,7 +30,7 @@ package net.yacy.kelondro.rwi; import java.io.IOException; import java.util.TreeSet; -import net.yacy.kelondro.order.CloneableIterator; +import net.yacy.cora.order.CloneableIterator; /* @@ -108,6 +108,7 @@ public interface BufferedIndex extends Index> referenceContainerIterator( byte[] startHash, boolean rot, + boolean excludePrivate, boolean buffer ) throws IOException; @@ -127,6 +128,7 @@ public interface BufferedIndex extends Index> referenceContainer( byte[] startHash, boolean rot, + boolean excludePrivate, int count, boolean buffer ) throws IOException; diff --git a/source/net/yacy/kelondro/rwi/Index.java b/source/net/yacy/kelondro/rwi/Index.java index 14a377858..edc4e7d64 100644 --- a/source/net/yacy/kelondro/rwi/Index.java +++ b/source/net/yacy/kelondro/rwi/Index.java @@ -32,12 +32,12 @@ import java.io.IOException; import java.util.TreeMap; import java.util.TreeSet; -import net.yacy.cora.ranking.Rating; +import net.yacy.cora.order.ByteOrder; +import net.yacy.cora.order.CloneableIterator; +import net.yacy.cora.sorting.Rating; import net.yacy.kelondro.index.HandleSet; import net.yacy.kelondro.index.Row; import net.yacy.kelondro.index.RowSpaceExceededException; -import net.yacy.kelondro.order.ByteOrder; -import net.yacy.kelondro.order.CloneableIterator; public interface Index extends Iterable> { @@ -146,7 +146,8 @@ public interface Index extends Iterable> referenceCountIterator( byte[] startHash, - boolean rot + boolean rot, + boolean excludePrivate ) throws IOException; /** @@ -159,13 +160,15 @@ public interface Index extends Iterable> referenceContainerIterator( byte[] startHash, - boolean rot + boolean rot, + boolean excludePrivate ) throws IOException; public TreeSet> referenceContainer( byte[] startHash, boolean rot, + boolean excludePrivate, int count ) throws IOException; diff --git a/source/net/yacy/kelondro/rwi/IndexCell.java b/source/net/yacy/kelondro/rwi/IndexCell.java index 5218d3702..c5a0c87e2 100644 --- a/source/net/yacy/kelondro/rwi/IndexCell.java +++ b/source/net/yacy/kelondro/rwi/IndexCell.java @@ -32,15 +32,15 @@ import java.util.Iterator; import java.util.Map; import java.util.TreeMap; -import net.yacy.cora.ranking.Order; -import net.yacy.cora.ranking.Rating; +import net.yacy.cora.order.ByteOrder; +import net.yacy.cora.order.CloneableIterator; +import net.yacy.cora.order.Order; +import net.yacy.cora.sorting.Rating; import net.yacy.cora.storage.ComparableARC; import net.yacy.kelondro.data.meta.URIMetadataRow; import net.yacy.kelondro.index.HandleSet; import net.yacy.kelondro.index.RowSpaceExceededException; import net.yacy.kelondro.logging.Log; -import net.yacy.kelondro.order.ByteOrder; -import net.yacy.kelondro.order.CloneableIterator; import net.yacy.kelondro.order.MergeIterator; import net.yacy.kelondro.util.EventTracker; import net.yacy.kelondro.util.MemoryControl; @@ -107,6 +107,7 @@ public final class IndexCell extends AbstractBu } private class CleanupThread extends Thread { + @Override public void run() { while (IndexCell.this.cleanupShallRun) { try { @@ -211,6 +212,7 @@ public final class IndexCell extends AbstractBu * every index entry is made for a term which has a fixed size * @return the size of the term */ + @Override public int termKeyLength() { return this.ram.termKeyLength(); } @@ -220,6 +222,7 @@ public final class IndexCell extends AbstractBu * @throws IOException * @throws RowSpaceExceededException */ + @Override public void add(final ReferenceContainer newEntries) throws IOException, RowSpaceExceededException { try { this.ram.add(newEntries); @@ -234,6 +237,7 @@ public final class IndexCell extends AbstractBu } + @Override public void add(final byte[] termHash, final ReferenceType entry) throws IOException, RowSpaceExceededException { try { this.ram.add(termHash, entry); @@ -250,6 +254,7 @@ public final class IndexCell extends AbstractBu /** * checks if there is any container for this termHash, either in RAM or any BLOB */ + @Override public boolean has(final byte[] termHash) { if (this.ram.has(termHash)) return true; return this.array.has(termHash); @@ -259,6 +264,7 @@ public final class IndexCell extends AbstractBu * count number of references for a given term * this method may cause strong IO load if called too frequently. */ + @Override public int count(final byte[] termHash) { final Integer cachedCount = this.countCache.get(termHash); if (cachedCount != null) return cachedCount.intValue(); @@ -295,6 +301,7 @@ public final class IndexCell extends AbstractBu * @throws IOException * @return a container with merged ReferenceContainer from RAM and the file array or null if there is no data to be returned */ + @Override public ReferenceContainer get(final byte[] termHash, final HandleSet urlselection) throws IOException { final ReferenceContainer c0 = this.ram.get(termHash, null); ReferenceContainer c1 = null; @@ -335,6 +342,7 @@ public final class IndexCell extends AbstractBu * the deleted containers are merged and returned as result of the method * @throws IOException */ + @Override public ReferenceContainer delete(final byte[] termHash) throws IOException { removeDelayed(); ReferenceContainer c1 = null; @@ -362,6 +370,7 @@ public final class IndexCell extends AbstractBu } } + @Override public void removeDelayed(final byte[] termHash, final HandleSet urlHashes) { HandleSet r; synchronized (this.removeDelayedURLs) { @@ -381,6 +390,7 @@ public final class IndexCell extends AbstractBu } } + @Override public void removeDelayed(final byte[] termHash, final byte[] urlHashBytes) { HandleSet r; synchronized (this.removeDelayedURLs) { @@ -400,6 +410,7 @@ public final class IndexCell extends AbstractBu } } + @Override public void removeDelayed() throws IOException { final HandleSet words = new HandleSet(URIMetadataRow.rowdef.primaryKeyLength, URIMetadataRow.rowdef.objectOrder, 0); // a set of url hashes where a worker thread tried to work on, but failed. synchronized (this.removeDelayedURLs) { @@ -422,6 +433,7 @@ public final class IndexCell extends AbstractBu * new BLOBs. This returns the sum of all url references that have been removed * @throws IOException */ + @Override public int remove(final byte[] termHash, final HandleSet urlHashes) throws IOException { this.countCache.remove(termHash); final int removed = this.ram.remove(termHash, urlHashes); @@ -437,6 +449,7 @@ public final class IndexCell extends AbstractBu return removed + (reduced / this.array.rowdef().objectsize); } + @Override public boolean remove(final byte[] termHash, final byte[] urlHashBytes) throws IOException { this.countCache.remove(termHash); final boolean removed = this.ram.remove(termHash, urlHashBytes); @@ -469,6 +482,7 @@ public final class IndexCell extends AbstractBu } } + @Override public ReferenceContainer reduce(final ReferenceContainer container) { container.sort(); container.removeEntries(this.urlHashes); @@ -477,48 +491,46 @@ public final class IndexCell extends AbstractBu } + @Override public Iterator> iterator() { - return referenceContainerIterator(null, false); + return referenceContainerIterator(null, false, false); } - public CloneableIterator> referenceCountIterator(final byte[] starttermHash, final boolean rot) { - return this.array.referenceCountIterator(starttermHash, false); + @Override + public CloneableIterator> referenceCountIterator(final byte[] starttermHash, final boolean rot, final boolean excludePrivate) { + return this.array.referenceCountIterator(starttermHash, false, excludePrivate); } - public CloneableIterator> referenceContainerIterator(final byte[] starttermHash, final boolean rot) { - final Order> containerOrder = new ReferenceContainerOrder(this.factory, this.ram.rowdef().getOrdering().clone()); - containerOrder.rotate(new ReferenceContainer(this.factory, starttermHash)); - return new MergeIterator>( - this.ram.referenceContainerIterator(starttermHash, rot), - new MergeIterator>( - this.ram.referenceContainerIterator(starttermHash, false), - this.array.referenceContainerIterator(starttermHash, false), - containerOrder, - ReferenceContainer.containerMergeMethod, - true), - containerOrder, - ReferenceContainer.containerMergeMethod, - true); + @Override + public CloneableIterator> referenceContainerIterator(final byte[] startTermHash, final boolean rot, final boolean excludePrivate) { + return referenceContainerIterator(startTermHash, rot, excludePrivate); } - public CloneableIterator> referenceContainerIterator(final byte[] startTermHash, final boolean rot, final boolean ram) { + @Override + public CloneableIterator> referenceContainerIterator(final byte[] startTermHash, final boolean rot, final boolean excludePrivate, final boolean ram) { final Order> containerOrder = new ReferenceContainerOrder(this.factory, this.ram.rowdef().getOrdering().clone()); containerOrder.rotate(new ReferenceContainer(this.factory, startTermHash)); if (ram) { - return this.ram.referenceContainerIterator(startTermHash, rot); + return this.ram.referenceContainerIterator(startTermHash, rot, excludePrivate); } return new MergeIterator>( - this.ram.referenceContainerIterator(startTermHash, false), - this.array.referenceContainerIterator(startTermHash, false), + this.ram.referenceContainerIterator(startTermHash, rot, excludePrivate), + new MergeIterator>( + this.ram.referenceContainerIterator(startTermHash, false, excludePrivate), + this.array.referenceContainerIterator(startTermHash, false, excludePrivate), containerOrder, ReferenceContainer.containerMergeMethod, - true); + true), + containerOrder, + ReferenceContainer.containerMergeMethod, + true); } /** * clear the RAM and BLOB part, deletes everything in the cell * @throws IOException */ + @Override public synchronized void clear() throws IOException { this.countCache.clear(); this.removeDelayedURLs.clear(); @@ -531,6 +543,7 @@ public final class IndexCell extends AbstractBu * BLOB file the next time a cell is opened. A name for the dump is automatically generated * and is composed of the current date and the cell salt */ + @Override public synchronized void close() { this.countCache.clear(); try {removeDelayed();} catch (final IOException e) {} @@ -543,6 +556,7 @@ public final class IndexCell extends AbstractBu this.array.close(); } + @Override public int size() { throw new UnsupportedOperationException("an accumulated size of index entries would not reflect the real number of words, which cannot be computed easily"); } @@ -563,10 +577,12 @@ public final class IndexCell extends AbstractBu return m; } + @Override public int minMem() { return 10 * 1024 * 1024; } + @Override public ByteOrder termKeyOrdering() { return this.array.ordering(); } @@ -581,26 +597,32 @@ public final class IndexCell extends AbstractBu this.array.mountBLOBFile(blobFile); } + @Override public long getBufferMaxAge() { return System.currentTimeMillis(); } + @Override public int getBufferMaxReferences() { return this.ram.maxReferences(); } + @Override public long getBufferMinAge() { return System.currentTimeMillis(); } + @Override public int getBufferSize() { return this.ram.size(); } + @Override public long getBufferSizeBytes() { return 10000 * this.ram.size(); // guessed; we don't know that exactly because there is no statistics here (expensive, not necessary) } + @Override public void setBufferMaxWordCount(final int maxWords) { this.maxRamEntries = maxWords; } diff --git a/source/net/yacy/kelondro/rwi/IndexReader.java b/source/net/yacy/kelondro/rwi/IndexReader.java index e1db98ecc..c1051e6fc 100644 --- a/source/net/yacy/kelondro/rwi/IndexReader.java +++ b/source/net/yacy/kelondro/rwi/IndexReader.java @@ -26,8 +26,8 @@ package net.yacy.kelondro.rwi; +import net.yacy.cora.order.CloneableIterator; import net.yacy.kelondro.index.HandleSet; -import net.yacy.kelondro.order.CloneableIterator; public interface IndexReader { @@ -35,7 +35,7 @@ public interface IndexReader { public int size(); public boolean has(byte[] wordHash); // should only be used if in case that true is returned the getContainer is NOT called public ReferenceContainer get(byte[] wordHash, HandleSet urlselection); - public CloneableIterator> referenceContainerIterator(byte[] startWordHash, boolean rot); + public CloneableIterator> referenceContainerIterator(byte[] startWordHash, boolean rot, boolean excludePrivate); public void close(); } diff --git a/source/net/yacy/kelondro/rwi/ReferenceContainer.java b/source/net/yacy/kelondro/rwi/ReferenceContainer.java index 1af1fd270..f799abb8f 100644 --- a/source/net/yacy/kelondro/rwi/ReferenceContainer.java +++ b/source/net/yacy/kelondro/rwi/ReferenceContainer.java @@ -36,13 +36,13 @@ import java.util.List; import java.util.TreeMap; import net.yacy.cora.document.ASCII; +import net.yacy.cora.order.ByteOrder; import net.yacy.kelondro.index.HandleSet; import net.yacy.kelondro.index.Row; import net.yacy.kelondro.index.RowSet; import net.yacy.kelondro.index.RowSpaceExceededException; import net.yacy.kelondro.logging.Log; import net.yacy.kelondro.order.Base64Order; -import net.yacy.kelondro.order.ByteOrder; /** diff --git a/source/net/yacy/kelondro/rwi/ReferenceContainerArray.java b/source/net/yacy/kelondro/rwi/ReferenceContainerArray.java index c492ffee1..ce3f77a6e 100644 --- a/source/net/yacy/kelondro/rwi/ReferenceContainerArray.java +++ b/source/net/yacy/kelondro/rwi/ReferenceContainerArray.java @@ -29,16 +29,17 @@ import java.io.IOException; import java.util.Date; import java.util.Iterator; -import net.yacy.cora.ranking.Rating; +import net.yacy.cora.order.ByteOrder; +import net.yacy.cora.order.CloneableIterator; +import net.yacy.cora.sorting.Rating; import net.yacy.kelondro.blob.ArrayStack; import net.yacy.kelondro.blob.BLOB; +import net.yacy.kelondro.data.word.Word; import net.yacy.kelondro.index.HandleMap; import net.yacy.kelondro.index.Row; import net.yacy.kelondro.index.RowSet; import net.yacy.kelondro.index.RowSpaceExceededException; import net.yacy.kelondro.logging.Log; -import net.yacy.kelondro.order.ByteOrder; -import net.yacy.kelondro.order.CloneableIterator; public final class ReferenceContainerArray { @@ -110,9 +111,9 @@ public final class ReferenceContainerArray { * objects in the cache. * @throws IOException */ - public CloneableIterator> referenceContainerIterator(final byte[] startWordHash, final boolean rot) { + public CloneableIterator> referenceContainerIterator(final byte[] startWordHash, final boolean rot, final boolean excludePrivate) { try { - return new ReferenceContainerIterator(startWordHash, rot); + return new ReferenceContainerIterator(startWordHash, rot, excludePrivate); } catch (final IOException e) { Log.logException(e); return null; @@ -126,33 +127,39 @@ public final class ReferenceContainerArray { // so this class simulates wCache.tailMap(startWordHash).values().iterator() // plus the mentioned features - private final boolean rot; + private final boolean rot, excludePrivate; protected CloneableIterator iterator; - public ReferenceContainerIterator(final byte[] startWordHash, final boolean rot) throws IOException { + public ReferenceContainerIterator(final byte[] startWordHash, final boolean rot, final boolean excludePrivate) throws IOException { this.rot = rot; + this.excludePrivate = excludePrivate; this.iterator = ReferenceContainerArray.this.array.keys(true, startWordHash); // The collection's iterator will return the values in the order that their corresponding keys appear in the tree. } + @Override public ReferenceContainerIterator clone(final Object secondWordHash) { try { - return new ReferenceContainerIterator((byte[]) secondWordHash, this.rot); + return new ReferenceContainerIterator((byte[]) secondWordHash, this.rot, this.excludePrivate); } catch (final IOException e) { Log.logException(e); return null; } } + @Override public boolean hasNext() { if (this.iterator == null) return false; if (this.rot) return true; return this.iterator.hasNext(); } + @Override public ReferenceContainer next() { - if (this.iterator.hasNext()) try { - return get(this.iterator.next()); + while (this.iterator.hasNext()) try { + byte[] b = this.iterator.next(); + if (this.excludePrivate && Word.isPrivate(b)) continue; + return get(b); } catch (final Throwable e) { Log.logException(e); return null; @@ -163,17 +170,24 @@ public final class ReferenceContainerArray { } try { this.iterator = ReferenceContainerArray.this.array.keys(true, null); - return get(this.iterator.next()); + while (this.iterator.hasNext()) { + byte[] b = this.iterator.next(); + if (this.excludePrivate && Word.isPrivate(b)) continue; + return get(b); + } + return null; } catch (final Throwable e) { Log.logException(e); return null; } } + @Override public void remove() { this.iterator.remove(); } + @Override public Iterator> iterator() { return this; } @@ -185,9 +199,9 @@ public final class ReferenceContainerArray { * the startWordHash may be null to iterate all from the beginning * @throws IOException */ - public CloneableIterator> referenceCountIterator(final byte[] startWordHash, final boolean rot) { + public CloneableIterator> referenceCountIterator(final byte[] startWordHash, final boolean rot, final boolean excludePrivate) { try { - return new ReferenceCountIterator(startWordHash, rot); + return new ReferenceCountIterator(startWordHash, rot, excludePrivate); } catch (final IOException e) { Log.logException(e); return null; @@ -196,34 +210,39 @@ public final class ReferenceContainerArray { public class ReferenceCountIterator implements CloneableIterator>, Iterable> { - private final boolean rot; + private final boolean rot, excludePrivate; protected CloneableIterator iterator; - public ReferenceCountIterator(final byte[] startWordHash, final boolean rot) throws IOException { + public ReferenceCountIterator(final byte[] startWordHash, final boolean rot, final boolean excludePrivate) throws IOException { this.rot = rot; + this.excludePrivate = excludePrivate; this.iterator = ReferenceContainerArray.this.array.keys(true, startWordHash); // The collection's iterator will return the values in the order that their corresponding keys appear in the tree. } + @Override public ReferenceCountIterator clone(final Object secondWordHash) { try { - return new ReferenceCountIterator((byte[]) secondWordHash, this.rot); + return new ReferenceCountIterator((byte[]) secondWordHash, this.rot, this.excludePrivate); } catch (final IOException e) { Log.logException(e); return null; } } + @Override public boolean hasNext() { if (this.iterator == null) return false; if (this.rot) return true; return this.iterator.hasNext(); } + @Override public Rating next() { byte[] reference; - if (this.iterator.hasNext()) try { + while (this.iterator.hasNext()) try { reference = this.iterator.next(); + if (this.excludePrivate && Word.isPrivate(reference)) continue; return new Rating(reference, count(reference)); } catch (final Throwable e) { Log.logException(e); @@ -233,20 +252,24 @@ public final class ReferenceContainerArray { if (!this.rot) { return null; } - try { + while (this.iterator.hasNext()) try { this.iterator = ReferenceContainerArray.this.array.keys(true, null); reference = this.iterator.next(); + if (this.excludePrivate && Word.isPrivate(reference)) continue; return new Rating(reference, count(reference)); } catch (final Throwable e) { Log.logException(e); return null; } + return null; } + @Override public void remove() { this.iterator.remove(); } + @Override public Iterator> iterator() { return this; } @@ -355,6 +378,7 @@ public final class ReferenceContainerArray { this.wordHash = wordHash; } + @Override public byte[] rewrite(final byte[] b) throws RowSpaceExceededException { if (b == null) return null; final ReferenceContainer c = this.rewriter.reduce(new ReferenceContainer(ReferenceContainerArray.this.factory, this.wordHash, RowSet.importRowSet(b, ReferenceContainerArray.this.factory.getRow()))); diff --git a/source/net/yacy/kelondro/rwi/ReferenceContainerCache.java b/source/net/yacy/kelondro/rwi/ReferenceContainerCache.java index 64f020916..5c2583520 100644 --- a/source/net/yacy/kelondro/rwi/ReferenceContainerCache.java +++ b/source/net/yacy/kelondro/rwi/ReferenceContainerCache.java @@ -36,14 +36,15 @@ import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; -import net.yacy.cora.ranking.Rating; +import net.yacy.cora.order.ByteOrder; +import net.yacy.cora.order.CloneableIterator; +import net.yacy.cora.sorting.Rating; import net.yacy.kelondro.blob.HeapWriter; +import net.yacy.kelondro.data.word.Word; import net.yacy.kelondro.index.HandleSet; import net.yacy.kelondro.index.Row; import net.yacy.kelondro.index.RowSpaceExceededException; import net.yacy.kelondro.logging.Log; -import net.yacy.kelondro.order.ByteOrder; -import net.yacy.kelondro.order.CloneableIterator; import net.yacy.kelondro.util.ByteArray; import net.yacy.kelondro.util.FileUtils; @@ -89,14 +90,17 @@ public final class ReferenceContainerCache exte * every index entry is made for a term which has a fixed size * @return the size of the term */ + @Override public int termKeyLength() { return this.termSize; } + @Override public void clear() { if (this.cache != null) this.cache.clear(); } + @Override public void close() { this.cache = null; } @@ -191,6 +195,7 @@ public final class ReferenceContainerCache exte return list; } + @Override public int size() { return (this.cache == null) ? 0 : this.cache.size(); } @@ -209,8 +214,9 @@ public final class ReferenceContainerCache exte return max; } + @Override public Iterator> iterator() { - return referenceContainerIterator(null, false); + return referenceContainerIterator(null, false, false); } /** @@ -218,8 +224,9 @@ public final class ReferenceContainerCache exte * in the cache, so that manipulations of the iterated objects do not change * objects in the cache. */ - public synchronized CloneableIterator> referenceContainerIterator(final byte[] startWordHash, final boolean rot) { - return new ReferenceContainerIterator(startWordHash, rot); + @Override + public synchronized CloneableIterator> referenceContainerIterator(final byte[] startWordHash, final boolean rot, final boolean excludePrivate) { + return new ReferenceContainerIterator(startWordHash, rot, excludePrivate); } /** @@ -233,40 +240,47 @@ public final class ReferenceContainerCache exte // so this class simulates wCache.tailMap(startWordHash).values().iterator() // plus the mentioned features - private final boolean rot; + private final boolean rot, excludePrivate; private final List> cachecopy; private int p; private byte[] latestTermHash; - public ReferenceContainerIterator(byte[] startWordHash, final boolean rot) { + public ReferenceContainerIterator(byte[] startWordHash, final boolean rot, final boolean excludePrivate) { this.rot = rot; + this.excludePrivate = excludePrivate; if (startWordHash != null && startWordHash.length == 0) startWordHash = null; this.cachecopy = sortedClone(); assert this.cachecopy != null; assert ReferenceContainerCache.this.termOrder != null; this.p = 0; if (startWordHash != null) { + byte[] b; while ( this.p < this.cachecopy.size() && - ReferenceContainerCache.this.termOrder.compare(this.cachecopy.get(this.p).getTermHash(), startWordHash) < 0 + ReferenceContainerCache.this.termOrder.compare(b = this.cachecopy.get(this.p).getTermHash(), startWordHash) < 0 && + !(excludePrivate && Word.isPrivate(b)) ) this.p++; } this.latestTermHash = null; // The collection's iterator will return the values in the order that their corresponding keys appear in the tree. } + @Override public ReferenceContainerIterator clone(final Object secondWordHash) { - return new ReferenceContainerIterator((byte[]) secondWordHash, this.rot); + return new ReferenceContainerIterator((byte[]) secondWordHash, this.rot, this.excludePrivate); } + @Override public boolean hasNext() { if (this.rot) return this.cachecopy.size() > 0; return this.p < this.cachecopy.size(); } + @Override public ReferenceContainer next() { - if (this.p < this.cachecopy.size()) { + while (this.p < this.cachecopy.size()) { final ReferenceContainer c = this.cachecopy.get(this.p++); this.latestTermHash = c.getTermHash(); + if (this.excludePrivate && Word.isPrivate(this.latestTermHash)) continue; try { return c.topLevelClone(); } catch (final RowSpaceExceededException e) { @@ -280,21 +294,27 @@ public final class ReferenceContainerCache exte } if (this.cachecopy.isEmpty()) return null; this.p = 0; - final ReferenceContainer c = this.cachecopy.get(this.p++); - this.latestTermHash = c.getTermHash(); - try { - return c.topLevelClone(); - } catch (final RowSpaceExceededException e) { - Log.logException(e); - return null; + while (this.p < this.cachecopy.size()) { + final ReferenceContainer c = this.cachecopy.get(this.p++); + this.latestTermHash = c.getTermHash(); + if (this.excludePrivate && Word.isPrivate(this.latestTermHash)) continue; + try { + return c.topLevelClone(); + } catch (final RowSpaceExceededException e) { + Log.logException(e); + return null; + } } + return null; } + @Override public void remove() { System.arraycopy(this.cachecopy, this.p, this.cachecopy, this.p - 1, this.cachecopy.size() - this.p); ReferenceContainerCache.this.cache.remove(new ByteArray(this.latestTermHash)); } + @Override public Iterator> iterator() { return this; } @@ -302,8 +322,8 @@ public final class ReferenceContainerCache exte } @Override - public CloneableIterator> referenceCountIterator(final byte[] startHash, final boolean rot) { - return new ReferenceCountIterator(startHash, rot); + public CloneableIterator> referenceCountIterator(final byte[] startHash, final boolean rot, boolean excludePrivate) { + return new ReferenceCountIterator(startHash, rot, excludePrivate); } /** @@ -312,40 +332,47 @@ public final class ReferenceContainerCache exte */ public class ReferenceCountIterator implements CloneableIterator>, Iterable> { - private final boolean rot; + private final boolean rot, excludePrivate; private final List> cachecounts; private int p; private byte[] latestTermHash; - public ReferenceCountIterator(byte[] startWordHash, final boolean rot) { + public ReferenceCountIterator(byte[] startWordHash, final boolean rot, boolean excludePrivate) { this.rot = rot; + this.excludePrivate = excludePrivate; if (startWordHash != null && startWordHash.length == 0) startWordHash = null; this.cachecounts = ratingList(); assert this.cachecounts != null; assert ReferenceContainerCache.this.termOrder != null; this.p = 0; if (startWordHash != null) { + byte[] b; while ( this.p < this.cachecounts.size() && - ReferenceContainerCache.this.termOrder.compare(this.cachecounts.get(this.p).getObject().asBytes(), startWordHash) < 0 + ReferenceContainerCache.this.termOrder.compare(b = this.cachecounts.get(this.p).getObject().asBytes(), startWordHash) < 0 && + !(excludePrivate && Word.isPrivate(b)) ) this.p++; } this.latestTermHash = null; // The collection's iterator will return the values in the order that their corresponding keys appear in the tree. } + @Override public ReferenceCountIterator clone(final Object secondWordHash) { - return new ReferenceCountIterator((byte[]) secondWordHash, this.rot); + return new ReferenceCountIterator((byte[]) secondWordHash, this.rot, this.excludePrivate); } + @Override public boolean hasNext() { if (this.rot) return this.cachecounts.size() > 0; return this.p < this.cachecounts.size(); } + @Override public Rating next() { - if (this.p < this.cachecounts.size()) { + while (this.p < this.cachecounts.size()) { final Rating c = this.cachecounts.get(this.p++); this.latestTermHash = c.getObject().asBytes(); + if (this.excludePrivate && Word.isPrivate(this.latestTermHash)) continue; return new Rating(c.getObject().asBytes(), c.getScore()); } // rotation iteration @@ -354,16 +381,22 @@ public final class ReferenceContainerCache exte } if (this.cachecounts.isEmpty()) return null; this.p = 0; - final Rating c = this.cachecounts.get(this.p++); - this.latestTermHash = c.getObject().asBytes(); - return new Rating(c.getObject().asBytes(), c.getScore()); + while (this.p < this.cachecounts.size()) { + final Rating c = this.cachecounts.get(this.p++); + this.latestTermHash = c.getObject().asBytes(); + if (this.excludePrivate && Word.isPrivate(this.latestTermHash)) continue; + return new Rating(c.getObject().asBytes(), c.getScore()); + } + return null; } + @Override public void remove() { System.arraycopy(this.cachecounts, this.p, this.cachecounts, this.p - 1, this.cachecounts.size() - this.p); ReferenceContainerCache.this.cache.remove(new ByteArray(this.latestTermHash)); } + @Override public Iterator> iterator() { return this; } @@ -376,6 +409,7 @@ public final class ReferenceContainerCache exte * @param key * @return true, if the key is used in the heap; false otherwise */ + @Override public boolean has(final byte[] key) { return this.cache.containsKey(new ByteArray(key)); } @@ -386,7 +420,9 @@ public final class ReferenceContainerCache exte * @return the indexContainer if one exist, null otherwise * @throws */ + @Override public ReferenceContainer get(final byte[] key, final HandleSet urlselection) { + if (this.cache == null) return null; final ReferenceContainer c = this.cache.get(new ByteArray(key)); if (urlselection == null) return c; if (c == null) return null; @@ -413,6 +449,7 @@ public final class ReferenceContainerCache exte * @param key * @return */ + @Override public int count(final byte[] key) { final ReferenceContainer c = this.cache.get(new ByteArray(key)); if (c == null) return 0; @@ -424,6 +461,7 @@ public final class ReferenceContainerCache exte * @param wordHash * @return the indexContainer if the cache contained the container, null otherwise */ + @Override public ReferenceContainer delete(final byte[] termHash) { // returns the index that had been deleted assert this.cache != null; @@ -431,9 +469,11 @@ public final class ReferenceContainerCache exte return this.cache.remove(new ByteArray(termHash)); } + @Override public void removeDelayed(final byte[] termHash, final byte[] urlHashBytes) { remove(termHash, urlHashBytes); } + @Override public boolean remove(final byte[] termHash, final byte[] urlHashBytes) { assert this.cache != null; if (this.cache == null) return false; @@ -453,10 +493,12 @@ public final class ReferenceContainerCache exte return false; } + @Override public void removeDelayed(final byte[] termHash, final HandleSet urlHashes) { remove(termHash, urlHashes); } + @Override public int remove(final byte[] termHash, final HandleSet urlHashes) { assert this.cache != null; if (this.cache == null) return 0; @@ -478,8 +520,10 @@ public final class ReferenceContainerCache exte return 0; } + @Override public void removeDelayed() {} + @Override public void add(final ReferenceContainer container) throws RowSpaceExceededException { // this puts the entries into the cache if (this.cache == null || container == null || container.isEmpty()) return; @@ -503,6 +547,7 @@ public final class ReferenceContainerCache exte } } + @Override public void add(final byte[] termHash, final ReferenceType newEntry) throws RowSpaceExceededException { assert this.cache != null; if (this.cache == null) return; @@ -535,10 +580,12 @@ public final class ReferenceContainerCache exte } } + @Override public int minMem() { return 0; } + @Override public ByteOrder termKeyOrdering() { return this.termOrder; } @@ -548,6 +595,7 @@ public final class ReferenceContainerCache exte public ContainerOrder(final ByteOrder order) { this.o = order; } + @Override public int compare(final ReferenceContainer arg0, final ReferenceContainer arg1) { if (arg0 == arg1) return 0; if (arg0 == null) return -1; diff --git a/source/net/yacy/kelondro/rwi/ReferenceContainerOrder.java b/source/net/yacy/kelondro/rwi/ReferenceContainerOrder.java index 22be80d09..a629ad0f1 100644 --- a/source/net/yacy/kelondro/rwi/ReferenceContainerOrder.java +++ b/source/net/yacy/kelondro/rwi/ReferenceContainerOrder.java @@ -26,8 +26,8 @@ package net.yacy.kelondro.rwi; -import net.yacy.cora.ranking.AbstractOrder; -import net.yacy.cora.ranking.Order; +import net.yacy.cora.order.AbstractOrder; +import net.yacy.cora.order.Order; public class ReferenceContainerOrder extends AbstractOrder> implements Order>, Cloneable { diff --git a/source/net/yacy/kelondro/rwi/ReferenceIterator.java b/source/net/yacy/kelondro/rwi/ReferenceIterator.java index cfe58f130..764e2d362 100644 --- a/source/net/yacy/kelondro/rwi/ReferenceIterator.java +++ b/source/net/yacy/kelondro/rwi/ReferenceIterator.java @@ -30,11 +30,11 @@ import java.io.File; import java.io.IOException; import java.util.Map; +import net.yacy.cora.order.CloneableIterator; import net.yacy.kelondro.blob.HeapReader; import net.yacy.kelondro.index.RowSet; import net.yacy.kelondro.index.RowSpaceExceededException; import net.yacy.kelondro.logging.Log; -import net.yacy.kelondro.order.CloneableIterator; import net.yacy.kelondro.util.LookAheadIterator; /** diff --git a/source/net/yacy/kelondro/table/SQLTable.java b/source/net/yacy/kelondro/table/SQLTable.java index a6044392c..9ee56e70e 100644 --- a/source/net/yacy/kelondro/table/SQLTable.java +++ b/source/net/yacy/kelondro/table/SQLTable.java @@ -42,13 +42,13 @@ import java.util.TreeMap; import net.yacy.cora.document.ASCII; import net.yacy.cora.document.UTF8; +import net.yacy.cora.order.ByteOrder; +import net.yacy.cora.order.CloneableIterator; import net.yacy.kelondro.index.Index; import net.yacy.kelondro.index.Row; import net.yacy.kelondro.index.Row.Entry; import net.yacy.kelondro.index.RowCollection; import net.yacy.kelondro.logging.Log; -import net.yacy.kelondro.order.ByteOrder; -import net.yacy.kelondro.order.CloneableIterator; import net.yacy.kelondro.order.NaturalOrder; diff --git a/source/net/yacy/kelondro/table/SplitTable.java b/source/net/yacy/kelondro/table/SplitTable.java index 9e20fb80e..465ed92e4 100644 --- a/source/net/yacy/kelondro/table/SplitTable.java +++ b/source/net/yacy/kelondro/table/SplitTable.java @@ -40,7 +40,8 @@ import java.util.Random; import java.util.TreeMap; import net.yacy.cora.date.GenericFormatter; -import net.yacy.cora.ranking.Order; +import net.yacy.cora.order.CloneableIterator; +import net.yacy.cora.order.Order; import net.yacy.kelondro.blob.ArrayStack; import net.yacy.kelondro.index.Cache; import net.yacy.kelondro.index.HandleSet; @@ -50,7 +51,6 @@ import net.yacy.kelondro.index.Row.Entry; import net.yacy.kelondro.index.RowCollection; import net.yacy.kelondro.index.RowSpaceExceededException; import net.yacy.kelondro.logging.Log; -import net.yacy.kelondro.order.CloneableIterator; import net.yacy.kelondro.order.MergeIterator; import net.yacy.kelondro.order.StackIterator; import net.yacy.kelondro.util.FileUtils; diff --git a/source/net/yacy/kelondro/table/Table.java b/source/net/yacy/kelondro/table/Table.java index b7a4f565d..4bbe283fc 100644 --- a/source/net/yacy/kelondro/table/Table.java +++ b/source/net/yacy/kelondro/table/Table.java @@ -39,6 +39,7 @@ import java.util.Map; import java.util.TreeMap; import java.util.TreeSet; +import net.yacy.cora.order.CloneableIterator; import net.yacy.kelondro.index.Column; import net.yacy.kelondro.index.HandleMap; import net.yacy.kelondro.index.Index; @@ -50,7 +51,6 @@ import net.yacy.kelondro.index.RowSpaceExceededException; import net.yacy.kelondro.io.BufferedRecords; import net.yacy.kelondro.io.Records; import net.yacy.kelondro.logging.Log; -import net.yacy.kelondro.order.CloneableIterator; import net.yacy.kelondro.order.NaturalOrder; import net.yacy.kelondro.util.FileUtils; import net.yacy.kelondro.util.MemoryControl; diff --git a/source/net/yacy/kelondro/util/ByteArray.java b/source/net/yacy/kelondro/util/ByteArray.java index 795bb8182..eb4810818 100644 --- a/source/net/yacy/kelondro/util/ByteArray.java +++ b/source/net/yacy/kelondro/util/ByteArray.java @@ -27,7 +27,7 @@ package net.yacy.kelondro.util; import java.util.HashMap; import net.yacy.cora.document.UTF8; -import net.yacy.kelondro.order.ByteOrder; +import net.yacy.cora.order.ByteOrder; /** diff --git a/source/net/yacy/peers/Protocol.java b/source/net/yacy/peers/Protocol.java index 0d937d451..2d45b118b 100644 --- a/source/net/yacy/peers/Protocol.java +++ b/source/net/yacy/peers/Protocol.java @@ -693,14 +693,10 @@ public final class Protocol if ( urlEntry.hash().length != 12 ) { continue; // bad url hash } - final URIMetadataRow.Components metadata = urlEntry.metadata(); - if ( metadata == null ) { - continue; - } - if ( blacklist.isListed(Blacklist.BLACKLIST_SEARCH, metadata.url()) ) { + if ( blacklist.isListed(Blacklist.BLACKLIST_SEARCH, urlEntry.url()) ) { if ( Network.log.isInfo() ) { Network.log.logInfo("remote search: filtered blacklisted url " - + metadata.url() + + urlEntry.url() + " from peer " + target.getName()); } @@ -708,11 +704,11 @@ public final class Protocol } final String urlRejectReason = - Switchboard.getSwitchboard().crawlStacker.urlInAcceptedDomain(metadata.url()); + Switchboard.getSwitchboard().crawlStacker.urlInAcceptedDomain(urlEntry.url()); if ( urlRejectReason != null ) { if ( Network.log.isInfo() ) { Network.log.logInfo("remote search: rejected url '" - + metadata.url() + + urlEntry.url() + "' (" + urlRejectReason + ") from peer " @@ -740,7 +736,7 @@ public final class Protocol + " does not belong to word-attached-hash " + ASCII.String(entry.urlhash()) + "; url = " - + metadata.url() + + urlEntry.url() + " from peer " + target.getName()); continue; // spammed @@ -1530,7 +1526,7 @@ public final class Protocol null // constraint); ); for ( final URIMetadataRow link : result.links ) { - System.out.println(link.metadata().url().toNormalform(true, false)); + System.out.println(link.url().toNormalform(true, false)); System.out.println(link.snippet()); } } catch ( final IOException e ) { diff --git a/source/net/yacy/peers/Seed.java b/source/net/yacy/peers/Seed.java index 87c3c684f..a8c31a62e 100644 --- a/source/net/yacy/peers/Seed.java +++ b/source/net/yacy/peers/Seed.java @@ -63,8 +63,8 @@ import net.yacy.cora.date.GenericFormatter; import net.yacy.cora.document.ASCII; import net.yacy.cora.document.UTF8; import net.yacy.cora.protocol.Domains; -import net.yacy.cora.ranking.ClusteredScoreMap; -import net.yacy.cora.ranking.ScoreMap; +import net.yacy.cora.sorting.ClusteredScoreMap; +import net.yacy.cora.sorting.ScoreMap; import net.yacy.kelondro.data.word.Word; import net.yacy.kelondro.index.HandleSet; import net.yacy.kelondro.order.Base64Order; diff --git a/source/net/yacy/peers/SeedDB.java b/source/net/yacy/peers/SeedDB.java index 21e5ee02e..baaa8f35e 100644 --- a/source/net/yacy/peers/SeedDB.java +++ b/source/net/yacy/peers/SeedDB.java @@ -274,22 +274,27 @@ public final class SeedDB implements AlternativeDomainNames { this.myBotIDs.add(name + ".yacy"); } + @Override public String myAlternativeAddress() { return mySeed().getName() + ".yacy"; } + @Override public String myIP() { return mySeed().getIP(); } + @Override public int myPort() { return mySeed().getPort(); } + @Override public String myName() { return this.mySeed.getName(); } + @Override public String myID() { return this.mySeed.hash; } @@ -697,7 +702,7 @@ public final class SeedDB implements AlternativeDomainNames { final HandleSet badPeerHashes = new HandleSet(12, Base64Order.enhancedCoder, 0); if (lookupConnected) { - // enumerate the cache and simultanous insert values + // enumerate the cache and simultaneously insert values final Iterator e = seedsConnected(true, false, null, (float) 0.0); while (e.hasNext()) { seed = e.next(); @@ -1004,7 +1009,7 @@ public final class SeedDB implements AlternativeDomainNames { private class seedEnum implements Iterator { - private MapDataMining.mapIterator it; + private Iterator>> it; private Seed nextSeed; private final MapDataMining database; private float minVersion; @@ -1013,7 +1018,7 @@ public final class SeedDB implements AlternativeDomainNames { this.database = database; this.minVersion = minVersion; try { - this.it = (firstKey == null) ? database.maps(up, rot) : database.maps(up, rot, firstKey, secondKey); + this.it = (firstKey == null) ? database.entries(up, rot) : database.entries(up, rot, firstKey, secondKey); float version; while (true) { this.nextSeed = internalNext(); @@ -1039,7 +1044,7 @@ public final class SeedDB implements AlternativeDomainNames { private seedEnum(final boolean up, final String field, final MapDataMining database) { this.database = database; try { - this.it = database.maps(up, field); + this.it = database.entries(up, field); this.nextSeed = internalNext(); } catch (final kelondroException e) { Log.logException(e); @@ -1058,7 +1063,7 @@ public final class SeedDB implements AlternativeDomainNames { private Seed internalNext() { if (this.it == null || !(this.it.hasNext())) return null; try { - Map dna0; + Map.Entry> dna0; ConcurrentHashMap dna; while (this.it.hasNext()) { try { @@ -1069,15 +1074,14 @@ public final class SeedDB implements AlternativeDomainNames { } assert dna0 != null; if (dna0 == null) continue; - if (dna0 instanceof ConcurrentHashMap) { - dna = (ConcurrentHashMap) dna0; + if (dna0.getValue() instanceof ConcurrentHashMap) { + dna = (ConcurrentHashMap) dna0.getValue(); } else { dna = new ConcurrentHashMap(); - dna.putAll(dna0); + dna.putAll(dna0.getValue()); } - final String hash = dna.remove("key"); - //assert hash != null; - if (hash == null) continue; // bad seed + if (dna0.getKey() == null) continue; // bad seed + final String hash = UTF8.String(dna0.getKey()); return new Seed(hash, dna); } return null; diff --git a/source/net/yacy/peers/dht/Dispatcher.java b/source/net/yacy/peers/dht/Dispatcher.java index 0098eb785..2d8f3258a 100755 --- a/source/net/yacy/peers/dht/Dispatcher.java +++ b/source/net/yacy/peers/dht/Dispatcher.java @@ -34,6 +34,7 @@ import java.util.concurrent.ConcurrentHashMap; import net.yacy.cora.document.ASCII; import net.yacy.kelondro.data.meta.URIMetadataRow; +import net.yacy.kelondro.data.word.Word; import net.yacy.kelondro.data.word.WordReference; import net.yacy.kelondro.index.HandleSet; import net.yacy.kelondro.index.RowSpaceExceededException; @@ -168,7 +169,7 @@ public class Dispatcher { final ArrayList> containers = new ArrayList>(maxContainerCount); - final Iterator> indexContainerIterator = this.segment.termIndex().referenceContainerIterator(hash, true, ram); + final Iterator> indexContainerIterator = this.segment.termIndex().referenceContainerIterator(hash, true, true, ram); // very important that rotation is true here ReferenceContainer container; int refcount = 0; @@ -185,6 +186,7 @@ public class Dispatcher { ) { if (container.isEmpty()) continue; + if (Word.isPrivate(container.getTermHash())) continue; // exclude private containers refcount += container.size(); containers.add(container); } diff --git a/source/net/yacy/peers/dht/PeerSelection.java b/source/net/yacy/peers/dht/PeerSelection.java index 4b1542a72..1ea0d9e96 100755 --- a/source/net/yacy/peers/dht/PeerSelection.java +++ b/source/net/yacy/peers/dht/PeerSelection.java @@ -35,8 +35,8 @@ import java.util.SortedMap; import net.yacy.cora.date.AbstractFormatter; import net.yacy.cora.document.ASCII; -import net.yacy.cora.ranking.ConcurrentScoreMap; -import net.yacy.cora.ranking.ScoreMap; +import net.yacy.cora.sorting.ConcurrentScoreMap; +import net.yacy.cora.sorting.ScoreMap; import net.yacy.kelondro.data.word.Word; import net.yacy.kelondro.index.HandleSet; import net.yacy.kelondro.index.RowSpaceExceededException; @@ -231,7 +231,7 @@ public class PeerSelection { private final SeedDB seedDB; private final HandleSet doublecheck; private int remaining; - private boolean alsoMyOwn; + private final boolean alsoMyOwn; private acceptRemoteIndexSeedEnum(SeedDB seedDB, final byte[] starthash, int max, boolean alsoMyOwn) { this.seedDB = seedDB; @@ -242,19 +242,20 @@ public class PeerSelection { this.alsoMyOwn = alsoMyOwn; } + @Override public boolean hasNext() { - return nextSeed != null; + return this.nextSeed != null; } private Seed nextInternal() { if (this.remaining <= 0) return null; Seed s; try { - while (se.hasNext()) { - s = se.next(); + while (this.se.hasNext()) { + s = this.se.next(); if (s == null) return null; byte[] hashb = ASCII.getBytes(s.hash); - if (doublecheck.has(hashb)) return null; + if (this.doublecheck.has(hashb)) return null; try { this.doublecheck.put(hashb); } catch (RowSpaceExceededException e) { @@ -262,7 +263,7 @@ public class PeerSelection { break; } if (s.getFlagAcceptRemoteIndex() || - (alsoMyOwn && s.hash.equals(seedDB.mySeed().hash)) // Accept own peer regardless of FlagAcceptRemoteIndex + (this.alsoMyOwn && s.hash.equals(this.seedDB.mySeed().hash)) // Accept own peer regardless of FlagAcceptRemoteIndex ) { this.remaining--; return s; @@ -271,18 +272,20 @@ public class PeerSelection { } catch (final kelondroException e) { System.out.println("DEBUG acceptRemoteIndexSeedEnum:" + e.getMessage()); Network.log.logSevere("database inconsistency (" + e.getMessage() + "), re-set of db."); - seedDB.resetActiveTable(); + this.seedDB.resetActiveTable(); return null; } return null; } + @Override public Seed next() { - final Seed next = nextSeed; - nextSeed = nextInternal(); + final Seed next = this.nextSeed; + this.nextSeed = nextInternal(); return next; } + @Override public void remove() { throw new UnsupportedOperationException(); } @@ -309,8 +312,8 @@ public class PeerSelection { private Iterator e; private int steps; - private float minVersion; - private SeedDB seedDB; + private final float minVersion; + private final SeedDB seedDB; private boolean alsoMyOwn; private int pass, insertOwnInPass; private Seed nextSeed; @@ -330,41 +333,44 @@ public class PeerSelection { this.nextSeed = nextInternal(); } + @Override public boolean hasNext() { - return (nextSeed != null) || alsoMyOwn; + return (this.nextSeed != null) || this.alsoMyOwn; } public Seed nextInternal() { - if (steps == 0) return null; - steps--; + if (this.steps == 0) return null; + this.steps--; - if (!e.hasNext() && pass == 1) { - e = seedDB.seedsConnected(true, false, null, minVersion); - pass = 2; + if (!this.e.hasNext() && this.pass == 1) { + this.e = this.seedDB.seedsConnected(true, false, null, this.minVersion); + this.pass = 2; } - if (e.hasNext()) { - return e.next(); + if (this.e.hasNext()) { + return this.e.next(); } - steps = 0; + this.steps = 0; return null; } + @Override public Seed next() { - if (alsoMyOwn && - ((pass > insertOwnInPass) || - (pass == insertOwnInPass && nextSeed == null) || // Own hash is last in line - (pass == insertOwnInPass && nextSeed != null && (Base64Order.enhancedCoder.compare(ASCII.getBytes(seedDB.mySeed().hash), ASCII.getBytes(nextSeed.hash)) < 0))) + if (this.alsoMyOwn && + ((this.pass > this.insertOwnInPass) || + (this.pass == this.insertOwnInPass && this.nextSeed == null) || // Own hash is last in line + (this.pass == this.insertOwnInPass && this.nextSeed != null && (Base64Order.enhancedCoder.compare(ASCII.getBytes(this.seedDB.mySeed().hash), ASCII.getBytes(this.nextSeed.hash)) < 0))) ) { // take my own seed hash instead the enumeration result - alsoMyOwn = false; - return seedDB.mySeed(); + this.alsoMyOwn = false; + return this.seedDB.mySeed(); } else { - final Seed next = nextSeed; - nextSeed = nextInternal(); + final Seed next = this.nextSeed; + this.nextSeed = nextInternal(); return next; } } + @Override public void remove() { throw new UnsupportedOperationException(); } @@ -381,49 +387,53 @@ public class PeerSelection { private static class providesRemoteCrawlURLsEnum implements Iterator { - private Iterator se; + private final Iterator se; private Seed nextSeed; - private SeedDB seedDB; + private final SeedDB seedDB; private providesRemoteCrawlURLsEnum(final SeedDB seedDB) { this.seedDB = seedDB; - se = getDHTSeeds(seedDB, null, yacyVersion.YACY_POVIDES_REMOTECRAWL_LISTS); - nextSeed = nextInternal(); + this.se = getDHTSeeds(seedDB, null, yacyVersion.YACY_POVIDES_REMOTECRAWL_LISTS); + this.nextSeed = nextInternal(); } + @Override public boolean hasNext() { - return nextSeed != null; + return this.nextSeed != null; } private Seed nextInternal() { Seed s; try { - while (se.hasNext()) { - s = se.next(); + while (this.se.hasNext()) { + s = this.se.next(); if (s == null) return null; if (s.getLong(Seed.RCOUNT, 0) > 0) return s; } } catch (final kelondroException e) { System.out.println("DEBUG providesRemoteCrawlURLsEnum:" + e.getMessage()); Network.log.logSevere("database inconsistency (" + e.getMessage() + "), re-set of db."); - seedDB.resetActiveTable(); + this.seedDB.resetActiveTable(); return null; } return null; } + @Override public Seed next() { - final Seed next = nextSeed; - nextSeed = nextInternal(); + final Seed next = this.nextSeed; + this.nextSeed = nextInternal(); return next; } + @Override public void remove() { throw new UnsupportedOperationException(); } } + /** * get either the youngest or oldest peers from the seed db. Count as many as requested * @param seedDB @@ -431,7 +441,7 @@ public class PeerSelection { * @param count number of wanted peers * @return a hash map of peer hashes to seed object */ - public static Map seedsByAge(final SeedDB seedDB, final boolean up, int count) { + public static Map seedsByAgeX(final SeedDB seedDB, final boolean up, int count) { if (count > seedDB.sizeConnected()) count = seedDB.sizeConnected(); @@ -467,4 +477,38 @@ public class PeerSelection { return null; } } -} + + + + /** + * get either the youngest or oldest peers from the seed db. Count as many as requested + * @param seedDB + * @param up if up = true then get the most recent peers, if up = false then get oldest + * @param count number of wanted peers + * @return a hash map of peer hashes to seed object + */ + public static Map seedsByAge(final SeedDB seedDB, final boolean up, int count) { + if (count > seedDB.sizeConnected()) count = seedDB.sizeConnected(); + Seed ys; + //long age; + final Iterator s = seedDB.seedsSortedConnected(!up, Seed.LASTSEEN); + try { + final Map result = new HashMap(); + while (s.hasNext() && count-- > 0) { + ys = s.next(); + if (ys != null && ys.hash != null) { + //age = (System.currentTimeMillis() - ys.getLastSeenUTC()) / 1000 / 60; + //System.out.println("selected seedsByAge up=" + up + ", age/min = " + age); + result.put(ys.hash, ys); + } + } + return result; + } catch (final kelondroException e) { + Network.log.logSevere("Internal Error at yacySeedDB.seedsByAge: " + e.getMessage(), e); + return null; + } + } + + + +} \ No newline at end of file diff --git a/source/net/yacy/search/Switchboard.java b/source/net/yacy/search/Switchboard.java index fa21f75f7..8235d3ca3 100644 --- a/source/net/yacy/search/Switchboard.java +++ b/source/net/yacy/search/Switchboard.java @@ -108,7 +108,6 @@ import net.yacy.gui.Tray; import net.yacy.kelondro.blob.Tables; import net.yacy.kelondro.data.meta.DigestURI; import net.yacy.kelondro.data.meta.URIMetadataRow; -import net.yacy.kelondro.data.meta.URIMetadataRow.Components; import net.yacy.kelondro.data.word.Word; import net.yacy.kelondro.index.HandleSet; import net.yacy.kelondro.index.RowSpaceExceededException; @@ -1214,9 +1213,7 @@ public final class Switchboard extends serverSwitch { if (urlhash.length == 0) return null; final URIMetadataRow le = this.indexSegments.urlMetadata(process).load(urlhash); if (le != null) { - final Components metadata = le.metadata(); - if (metadata == null) return null; - return metadata.url(); + return le.url(); } return this.crawlQueues.getURL(urlhash); } @@ -2290,11 +2287,11 @@ public final class Switchboard extends serverSwitch { final long t = System.currentTimeMillis(); final Map response = Protocol.crawlReceipt(Switchboard.this.peers.mySeed(), this.initiatorPeer, "crawl", "fill", "indexed", this.reference, ""); if (response == null) { - Switchboard.this.log.logInfo("Sending crawl receipt for '" + this.reference.metadata().url().toNormalform(false, true) + "' to " + this.initiatorPeer.getName() + " FAILED, send time = " + (System.currentTimeMillis() - t)); + Switchboard.this.log.logInfo("Sending crawl receipt for '" + this.reference.url().toNormalform(false, true) + "' to " + this.initiatorPeer.getName() + " FAILED, send time = " + (System.currentTimeMillis() - t)); return; } final String delay = response.get("delay"); - Switchboard.this.log.logInfo("Sending crawl receipt for '" + this.reference.metadata().url().toNormalform(false, true) + "' to " + this.initiatorPeer.getName() + " success, delay = " + delay + ", send time = " + (System.currentTimeMillis() - t)); + Switchboard.this.log.logInfo("Sending crawl receipt for '" + this.reference.url().toNormalform(false, true) + "' to " + this.initiatorPeer.getName() + " success, delay = " + delay + ", send time = " + (System.currentTimeMillis() - t)); } } diff --git a/source/net/yacy/search/index/DocumentIndex.java b/source/net/yacy/search/index/DocumentIndex.java index 9b4241a00..e74c07d82 100644 --- a/source/net/yacy/search/index/DocumentIndex.java +++ b/source/net/yacy/search/index/DocumentIndex.java @@ -41,7 +41,6 @@ import net.yacy.document.LibraryProvider; import net.yacy.document.TextParser; import net.yacy.kelondro.data.meta.DigestURI; import net.yacy.kelondro.data.meta.URIMetadataRow; -import net.yacy.kelondro.data.meta.URIMetadataRow.Components; import net.yacy.kelondro.logging.Log; import net.yacy.search.query.QueryParams; import net.yacy.search.query.RWIProcess; @@ -230,13 +229,8 @@ public class DocumentIndex extends Segment // search is running; retrieve results URIMetadataRow row; final ArrayList files = new ArrayList(); - Components metadata; while ( (row = rankedCache.takeURL(false, 1000)) != null ) { - metadata = row.metadata(); - if ( metadata == null ) { - continue; - } - files.add(metadata.url()); + files.add(row.url()); count--; if ( count == 0 ) { break; diff --git a/source/net/yacy/search/index/MetadataRepository.java b/source/net/yacy/search/index/MetadataRepository.java index 6aedb4197..ebc18dfd1 100644 --- a/source/net/yacy/search/index/MetadataRepository.java +++ b/source/net/yacy/search/index/MetadataRepository.java @@ -41,11 +41,12 @@ import java.util.TreeSet; import net.yacy.cora.document.ASCII; import net.yacy.cora.document.MultiProtocolURI; import net.yacy.cora.document.UTF8; +import net.yacy.cora.order.CloneableIterator; import net.yacy.cora.protocol.http.HTTPClient; -import net.yacy.cora.ranking.ConcurrentScoreMap; -import net.yacy.cora.ranking.ScoreMap; -import net.yacy.cora.ranking.WeakPriorityBlockingQueue; import net.yacy.cora.services.federated.solr.SolrConnector; +import net.yacy.cora.sorting.ConcurrentScoreMap; +import net.yacy.cora.sorting.ScoreMap; +import net.yacy.cora.sorting.WeakPriorityBlockingQueue; import net.yacy.document.parser.html.CharacterCoding; import net.yacy.kelondro.data.meta.DigestURI; import net.yacy.kelondro.data.meta.URIMetadataRow; @@ -56,7 +57,6 @@ import net.yacy.kelondro.index.Index; import net.yacy.kelondro.index.Row; import net.yacy.kelondro.index.RowSpaceExceededException; import net.yacy.kelondro.logging.Log; -import net.yacy.kelondro.order.CloneableIterator; import net.yacy.kelondro.table.SplitTable; import net.yacy.kelondro.util.MemoryControl; import net.yacy.repository.Blacklist; @@ -222,6 +222,7 @@ public final class MetadataRepository implements Iterable { } } + @Override public Iterator iterator() { return keys(true, null); } @@ -254,6 +255,7 @@ public final class MetadataRepository implements Iterable { this.error = false; } + @Override public kiter clone(final Object secondHash) { try { return new kiter(this.up, (String) secondHash); @@ -262,12 +264,14 @@ public final class MetadataRepository implements Iterable { } } + @Override public final boolean hasNext() { if (this.error) return false; if (this.iter == null) return false; return this.iter.hasNext(); } + @Override public final URIMetadataRow next() { Row.Entry e = null; if (this.iter == null) { return null; } @@ -276,6 +280,7 @@ public final class MetadataRepository implements Iterable { return new URIMetadataRow(e, null, 0); } + @Override public final void remove() { this.iter.remove(); } @@ -372,6 +377,7 @@ public final class MetadataRepository implements Iterable { this.crawlStacker = crawlStacker; } + @Override public void run() { try { Log.logInfo("URLDBCLEANER", "UrldbCleaner-Thread startet"); @@ -394,30 +400,24 @@ public final class MetadataRepository implements Iterable { } else if (entry.hash() == null) { if (Log.isFine("URLDBCLEANER")) Log.logFine("URLDBCLEANER", ++this.blacklistedUrls + " blacklisted (" + ((double) this.blacklistedUrls / this.totalSearchedUrls) * 100 + "%): " + "hash == null"); } else { - final URIMetadataRow.Components metadata = entry.metadata(); this.totalSearchedUrls++; - if (metadata == null) { - if (Log.isFine("URLDBCLEANER")) Log.logFine("URLDBCLEANER", "corrupted entry for hash = " + ASCII.String(entry.hash())); - remove(entry.hash()); - continue; - } - if (metadata.url() == null) { + if (entry.url() == null) { if (Log.isFine("URLDBCLEANER")) Log.logFine("URLDBCLEANER", ++this.blacklistedUrls + " blacklisted (" + ((double) this.blacklistedUrls / this.totalSearchedUrls) * 100 + "%): " + ASCII.String(entry.hash()) + "URL == null"); remove(entry.hash()); continue; } - if (this.blacklist.isListed(Blacklist.BLACKLIST_CRAWLER, metadata.url()) || - this.blacklist.isListed(Blacklist.BLACKLIST_DHT, metadata.url()) || - (this.crawlStacker.urlInAcceptedDomain(metadata.url()) != null)) { - this.lastBlacklistedUrl = metadata.url().toNormalform(true, true); + if (this.blacklist.isListed(Blacklist.BLACKLIST_CRAWLER, entry.url()) || + this.blacklist.isListed(Blacklist.BLACKLIST_DHT, entry.url()) || + (this.crawlStacker.urlInAcceptedDomain(entry.url()) != null)) { + this.lastBlacklistedUrl = entry.url().toNormalform(true, true); this.lastBlacklistedHash = ASCII.String(entry.hash()); - if (Log.isFine("URLDBCLEANER")) Log.logFine("URLDBCLEANER", ++this.blacklistedUrls + " blacklisted (" + ((double) this.blacklistedUrls / this.totalSearchedUrls) * 100 + "%): " + ASCII.String(entry.hash()) + " " + metadata.url().toNormalform(false, true)); + if (Log.isFine("URLDBCLEANER")) Log.logFine("URLDBCLEANER", ++this.blacklistedUrls + " blacklisted (" + ((double) this.blacklistedUrls / this.totalSearchedUrls) * 100 + "%): " + ASCII.String(entry.hash()) + " " + entry.url().toNormalform(false, true)); remove(entry.hash()); if (this.blacklistedUrls % 100 == 0) { Log.logInfo("URLDBCLEANER", "Deleted " + this.blacklistedUrls + " URLs until now. Last deleted URL-Hash: " + this.lastBlacklistedUrl); } } - this.lastUrl = metadata.url().toNormalform(true, true); + this.lastUrl = entry.url().toNormalform(true, true); this.lastHash = ASCII.String(entry.hash()); } } @@ -502,6 +502,7 @@ public final class MetadataRepository implements Iterable { if ((dom) && (format == 2)) dom = false; } + @Override public void run() { try { final File parentf = this.f.getParentFile(); @@ -531,26 +532,24 @@ public final class MetadataRepository implements Iterable { } else { final Iterator i = entries(); // iterates indexURLEntry objects URIMetadataRow entry; - URIMetadataRow.Components metadata; String url; while (i.hasNext()) { entry = i.next(); if (this.set != null && !this.set.has(entry.hash())) continue; - metadata = entry.metadata(); - url = metadata.url().toNormalform(true, false); + url = entry.url().toNormalform(true, false); if (!url.matches(this.filter)) continue; if (this.format == 0) { pw.println(url); } if (this.format == 1) { - pw.println("" + CharacterCoding.unicode2xml(metadata.dc_title(), true) + "
    "); + pw.println("" + CharacterCoding.unicode2xml(entry.dc_title(), true) + "
    "); } if (this.format == 2) { pw.println(""); - pw.println("" + CharacterCoding.unicode2xml(metadata.dc_title(), true) + ""); + pw.println("" + CharacterCoding.unicode2xml(entry.dc_title(), true) + ""); pw.println("" + MultiProtocolURI.escape(url) + ""); - if (metadata.dc_creator().length() > 0) pw.println("" + CharacterCoding.unicode2xml(metadata.dc_creator(), true) + ""); - if (metadata.dc_subject().length() > 0) pw.println("" + CharacterCoding.unicode2xml(metadata.dc_subject(), true) + ""); + if (entry.dc_creator().length() > 0) pw.println("" + CharacterCoding.unicode2xml(entry.dc_creator(), true) + ""); + if (entry.dc_subject().length() > 0) pw.println("" + CharacterCoding.unicode2xml(entry.dc_subject(), true) + ""); pw.println("" + entry.moddate().toString() + ""); pw.println("" + entry.size() + ""); pw.println("" + ASCII.String(entry.hash()) + ""); @@ -635,8 +634,8 @@ public final class MetadataRepository implements Iterable { for (final URLHashCounter hs: domainSamples.values()) { if (hs == null) continue; urlref = this.load(hs.urlhashb); - if (urlref == null || urlref.metadata() == null || urlref.metadata().url() == null || urlref.metadata().url().getHost() == null) continue; - set.add(urlref.metadata().url().getHost()); + if (urlref == null || urlref.url() == null || urlref.url().getHost() == null) continue; + set.add(urlref.url().getHost()); count--; if (count == 0) break; } @@ -671,12 +670,10 @@ public final class MetadataRepository implements Iterable { for (final Map.Entry e: domainSamples.entrySet()) { hosthashScore.inc(ASCII.String(e.getValue().urlhashb, 6, 6), e.getValue().count); } - URIMetadataRow.Components comps; DigestURI url; for (final Map.Entry e: domainSamples.entrySet()) { urlref = this.load(e.getValue().urlhashb); - comps = urlref.metadata(); - url = comps.url(); + url = urlref.url(); hostMap.put(e.getKey(), new HostStat(url.getHost(), url.getPort(), e.getKey(), hosthashScore.get(e.getKey()))); } return hostMap; @@ -693,16 +690,14 @@ public final class MetadataRepository implements Iterable { count += 10; // make some more to prevent that we have to do this again after deletions too soon. if (count < 0 || domainScore.sizeSmaller(count)) count = domainScore.size(); this.statsDump = new ArrayList(); - URIMetadataRow.Components comps; DigestURI url; while (j.hasNext()) { urlhash = j.next(); if (urlhash == null) continue; urlref = this.load(ASCII.getBytes(urlhash)); - if (urlref == null || urlref.metadata() == null || urlref.metadata().url() == null || urlref.metadata().url().getHost() == null) continue; + if (urlref == null || urlref.url() == null || urlref.url().getHost() == null) continue; if (this.statsDump == null) return new ArrayList().iterator(); // some other operation has destroyed the object - comps = urlref.metadata(); - url = comps.url(); + url = urlref.url(); this.statsDump.add(new HostStat(url.getHost(), url.getPort(), urlhash.substring(6), domainScore.get(urlhash))); count--; if (count == 0) break; diff --git a/source/net/yacy/search/index/Segment.java b/source/net/yacy/search/index/Segment.java index 3bf2f6eee..3378fb8ed 100644 --- a/source/net/yacy/search/index/Segment.java +++ b/source/net/yacy/search/index/Segment.java @@ -37,6 +37,7 @@ import java.util.TreeSet; import net.yacy.cora.document.ASCII; import net.yacy.cora.document.MultiProtocolURI; import net.yacy.cora.document.UTF8; +import net.yacy.cora.order.ByteOrder; import net.yacy.cora.services.federated.solr.SolrConnector; import net.yacy.cora.services.federated.yacy.CacheStrategy; import net.yacy.document.Condenser; @@ -55,7 +56,6 @@ import net.yacy.kelondro.index.HandleSet; import net.yacy.kelondro.index.RowSpaceExceededException; import net.yacy.kelondro.logging.Log; import net.yacy.kelondro.order.Base64Order; -import net.yacy.kelondro.order.ByteOrder; import net.yacy.kelondro.rwi.IndexCell; import net.yacy.kelondro.rwi.ReferenceContainer; import net.yacy.kelondro.rwi.ReferenceFactory; @@ -253,6 +253,7 @@ public class Segment { } wordCount++; if (searchEvent != null && !searchEvent.getQuery().excludeHashes.has(wordhash) && searchEvent.getQuery().queryHashes.has(wordhash)) { + // if the page was added in the context of a heuristic this shall ensure that findings will fire directly into the search result ReferenceContainer container; try { container = ReferenceContainer.emptyContainer(Segment.wordReferenceFactory, wordhash, 1); @@ -421,12 +422,11 @@ public class Segment { // determine the url string final URIMetadataRow entry = urlMetadata().load(urlhash); if (entry == null) return 0; - final URIMetadataRow.Components metadata = entry.metadata(); - if (metadata == null || metadata.url() == null) return 0; + if (entry.url() == null) return 0; try { // parse the resource - final Document document = Document.mergeDocuments(metadata.url(), null, loader.loadDocuments(loader.request(metadata.url(), true, false), cacheStrategy, 10000, Integer.MAX_VALUE)); + final Document document = Document.mergeDocuments(entry.url(), null, loader.loadDocuments(loader.request(entry.url(), true, false), cacheStrategy, 10000, Integer.MAX_VALUE)); if (document == null) { // delete just the url entry urlMetadata().remove(urlhash); @@ -472,6 +472,7 @@ public class Segment { this.rwiCountAtStart = termIndex().sizesMax(); } + @Override public void run() { Log.logInfo("INDEXCLEANER", "IndexCleaner-Thread started"); ReferenceContainer container = null; @@ -479,7 +480,7 @@ public class Segment { DigestURI url = null; final HandleSet urlHashs = new HandleSet(URIMetadataRow.rowdef.primaryKeyLength, URIMetadataRow.rowdef.objectOrder, 0); try { - Iterator> indexContainerIterator = Segment.this.termIndex.referenceContainer(this.startHash, false, 100, false).iterator(); + Iterator> indexContainerIterator = Segment.this.termIndex.referenceContainer(this.startHash, false, false, 100, false).iterator(); while (indexContainerIterator.hasNext() && this.run) { waiter(); container = indexContainerIterator.next(); @@ -494,7 +495,7 @@ public class Segment { if (ue == null) { urlHashs.put(entry.urlhash()); } else { - url = ue.metadata().url(); + url = ue.url(); if (url == null || Switchboard.urlBlacklist.isListed(Blacklist.BLACKLIST_CRAWLER, url)) { urlHashs.put(entry.urlhash()); } @@ -512,7 +513,7 @@ public class Segment { if (!containerIterator.hasNext()) { // We may not be finished yet, try to get the next chunk of wordHashes - final TreeSet> containers = Segment.this.termIndex.referenceContainer(container.getTermHash(), false, 100, false); + final TreeSet> containers = Segment.this.termIndex.referenceContainer(container.getTermHash(), false, false, 100, false); indexContainerIterator = containers.iterator(); // Make sure we don't get the same wordhash twice, but don't skip a word if ((indexContainerIterator.hasNext()) && (!container.getTermHash().equals(indexContainerIterator.next().getTermHash()))) { diff --git a/source/net/yacy/search/query/QueryParams.java b/source/net/yacy/search/query/QueryParams.java index ed9203a9a..ec344512d 100644 --- a/source/net/yacy/search/query/QueryParams.java +++ b/source/net/yacy/search/query/QueryParams.java @@ -31,6 +31,7 @@ import java.net.URLEncoder; import java.util.HashMap; import java.util.Iterator; import java.util.Map; +import java.util.Set; import java.util.SortedSet; import java.util.TreeSet; import java.util.regex.Matcher; @@ -124,6 +125,7 @@ public final class QueryParams { private final Segment indexSegment; public final String host; // this is the client host that starts the query, not a site operator public final String sitehash; // this is a domain hash, 6 bytes long or null + public final Set siteexcludes; // set of domain hashes that are excluded if not included by sitehash public final String authorhash; public final String tenant; public final Modifier modifier; @@ -144,13 +146,13 @@ public final class QueryParams { final Segment indexSegment, final RankingProfile ranking, final String userAgent) { - - if ((queryString.length() == 12) && (Base64Order.enhancedCoder.wellformed(UTF8.getBytes(queryString)))) { + byte[] queryHash; + if ((queryString.length() == 12) && (Base64Order.enhancedCoder.wellformed(queryHash = UTF8.getBytes(queryString)))) { this.queryString = null; this.queryHashes = new HandleSet(WordReferenceRow.urlEntryRow.primaryKeyLength, WordReferenceRow.urlEntryRow.objectOrder, 0); this.excludeHashes = new HandleSet(WordReferenceRow.urlEntryRow.primaryKeyLength, WordReferenceRow.urlEntryRow.objectOrder, 0); try { - this.queryHashes.put(UTF8.getBytes(queryString)); + this.queryHashes.put(queryHash); } catch (final RowSpaceExceededException e) { Log.logException(e); } @@ -182,6 +184,7 @@ public final class QueryParams { this.snippetCacheStrategy = null; this.host = null; this.sitehash = null; + this.siteexcludes = null; this.authorhash = null; this.remotepeer = null; this.time = Long.valueOf(System.currentTimeMillis()); @@ -208,6 +211,7 @@ public final class QueryParams { final Searchdom domType, final int domMaxTargets, final Bitfield constraint, final boolean allofconstraint, final String site, + final Set siteexcludes, final String authorhash, final int domainzone, final String host, @@ -250,6 +254,7 @@ public final class QueryParams { this.constraint = constraint; this.allofconstraint = allofconstraint; this.sitehash = site; assert site == null || site.length() == 6; + this.siteexcludes = siteexcludes != null && siteexcludes.size() == 0 ? null: siteexcludes; this.authorhash = authorhash; assert authorhash == null || !authorhash.isEmpty(); this.snippetCacheStrategy = snippetCacheStrategy; this.host = host; @@ -491,6 +496,8 @@ public final class QueryParams { context.append(asterisk); context.append(this.sitehash); context.append(asterisk); + context.append(this.siteexcludes); + context.append(asterisk); context.append(this.authorhash); context.append(asterisk); context.append(this.targetlang); diff --git a/source/net/yacy/search/query/RWIProcess.java b/source/net/yacy/search/query/RWIProcess.java index e221959b9..3482fc8a3 100644 --- a/source/net/yacy/search/query/RWIProcess.java +++ b/source/net/yacy/search/query/RWIProcess.java @@ -41,11 +41,11 @@ import java.util.regex.Pattern; import net.yacy.cora.document.ASCII; import net.yacy.cora.document.MultiProtocolURI; import net.yacy.cora.protocol.Scanner; -import net.yacy.cora.ranking.ClusteredScoreMap; -import net.yacy.cora.ranking.ConcurrentScoreMap; -import net.yacy.cora.ranking.ScoreMap; -import net.yacy.cora.ranking.WeakPriorityBlockingQueue; -import net.yacy.cora.ranking.WeakPriorityBlockingQueue.ReverseElement; +import net.yacy.cora.sorting.ClusteredScoreMap; +import net.yacy.cora.sorting.ConcurrentScoreMap; +import net.yacy.cora.sorting.ScoreMap; +import net.yacy.cora.sorting.WeakPriorityBlockingQueue; +import net.yacy.cora.sorting.WeakPriorityBlockingQueue.ReverseElement; import net.yacy.document.Condenser; import net.yacy.kelondro.data.meta.DigestURI; import net.yacy.kelondro.data.meta.URIMetadataRow; @@ -311,6 +311,9 @@ public final class RWIProcess extends Thread // check site constraints final String hosthash = iEntry.hosthash(); if ( this.query.sitehash == null ) { + if (this.query.siteexcludes != null && this.query.siteexcludes.contains(hosthash)) { + continue pollloop; + } // no site constraint there; maybe collect host navigation information if ( nav_hosts && this.query.urlMask_isCatchall ) { this.hostNavigator.inc(hosthash); @@ -560,18 +563,9 @@ public final class RWIProcess extends Thread continue; } - // prepare values for constraint check - final URIMetadataRow.Components metadata = page.metadata(); - - // check errors - if ( metadata == null ) { - this.sortout++; - continue; // rare case where the url is corrupted - } - if ( !this.query.urlMask_isCatchall ) { // check url mask - if ( !metadata.matches(this.query.urlMask) ) { + if ( !page.matches(this.query.urlMask) ) { this.sortout++; continue; } @@ -585,14 +579,14 @@ public final class RWIProcess extends Thread } // check for more errors - if ( metadata.url() == null ) { + if ( page.url() == null ) { this.sortout++; continue; // rare case where the url is corrupted } - final String pageurl = metadata.url().toNormalform(true, true); - final String pageauthor = metadata.dc_creator(); - final String pagetitle = metadata.dc_title().toLowerCase(); + final String pageurl = page.url().toNormalform(true, true); + final String pageauthor = page.dc_creator(); + final String pagetitle = page.dc_title().toLowerCase(); // check exclusion if ( (QueryParams.anymatch(pagetitle, this.query.excludeHashes)) @@ -617,7 +611,7 @@ public final class RWIProcess extends Thread // check location constraint if ( (this.query.constraint != null) && (this.query.constraint.get(Condenser.flag_cat_haslocation)) - && (metadata.lat() == 0.0f || metadata.lon() == 0.0f) ) { + && (page.lat() == 0.0f || page.lon() == 0.0f) ) { this.sortout++; continue; } @@ -651,7 +645,7 @@ public final class RWIProcess extends Thread } // namespace navigation - String pagepath = metadata.url().getPath(); + String pagepath = page.url().getPath(); if ( (p = pagepath.indexOf(':')) >= 0 ) { pagepath = pagepath.substring(0, p); p = pagepath.lastIndexOf('/'); @@ -662,17 +656,17 @@ public final class RWIProcess extends Thread } // protocol navigation - final String protocol = metadata.url().getProtocol(); + final String protocol = page.url().getProtocol(); this.protocolNavigator.inc(protocol); // file type navigation - final String fileext = metadata.url().getFileExtension(); + final String fileext = page.url().getFileExtension(); if ( fileext.length() > 0 ) { this.filetypeNavigator.inc(fileext); } // check Scanner - if ( !Scanner.acceptURL(metadata.url()) ) { + if ( !Scanner.acceptURL(page.url()) ) { this.sortout++; continue; } @@ -782,7 +776,7 @@ public final class RWIProcess extends Thread } urlhash = this.hostResolver.get(hosthash); row = urlhash == null ? null : this.query.getSegment().urlMetadata().load(urlhash); - hostname = row == null ? null : row.metadata().url().getHost(); + hostname = row == null ? null : row.url().getHost(); if ( hostname != null ) { result.set(hostname, this.hostNavigator.get(hosthash)); } diff --git a/source/net/yacy/search/query/SearchEvent.java b/source/net/yacy/search/query/SearchEvent.java index b94d5fe3d..b19a59e78 100644 --- a/source/net/yacy/search/query/SearchEvent.java +++ b/source/net/yacy/search/query/SearchEvent.java @@ -38,7 +38,7 @@ import java.util.concurrent.TimeUnit; import net.yacy.cora.document.ASCII; import net.yacy.cora.document.UTF8; -import net.yacy.cora.ranking.ScoreMap; +import net.yacy.cora.sorting.ScoreMap; import net.yacy.document.LargeNumberCache; import net.yacy.kelondro.data.word.WordReference; import net.yacy.kelondro.data.word.WordReferenceFactory; diff --git a/source/net/yacy/search/query/SnippetProcess.java b/source/net/yacy/search/query/SnippetProcess.java index b2eb85473..e22f6c55f 100644 --- a/source/net/yacy/search/query/SnippetProcess.java +++ b/source/net/yacy/search/query/SnippetProcess.java @@ -34,12 +34,12 @@ import java.util.regex.Pattern; import net.yacy.cora.document.ASCII; import net.yacy.cora.document.MultiProtocolURI; import net.yacy.cora.protocol.ResponseHeader; -import net.yacy.cora.ranking.ScoreMap; -import net.yacy.cora.ranking.WeakPriorityBlockingQueue; -import net.yacy.cora.ranking.WeakPriorityBlockingQueue.Element; -import net.yacy.cora.ranking.WeakPriorityBlockingQueue.ReverseElement; import net.yacy.cora.services.federated.solr.SolrConnector; import net.yacy.cora.services.federated.yacy.CacheStrategy; +import net.yacy.cora.sorting.ScoreMap; +import net.yacy.cora.sorting.WeakPriorityBlockingQueue; +import net.yacy.cora.sorting.WeakPriorityBlockingQueue.Element; +import net.yacy.cora.sorting.WeakPriorityBlockingQueue.ReverseElement; import net.yacy.document.Condenser; import net.yacy.kelondro.data.meta.URIMetadataRow; import net.yacy.kelondro.data.word.Word; @@ -365,7 +365,6 @@ public class SnippetProcess { private final long timeout; // the date until this thread should try to work private long lastLifeSign; // when the last time the run()-loop was executed - private final int id; private final CacheStrategy cacheStrategy; private final int neededResults; private final Pattern snippetPattern; @@ -373,7 +372,6 @@ public class SnippetProcess { private final SolrConnector solr; public Worker(final int id, final long maxlifetime, final CacheStrategy cacheStrategy, final Pattern snippetPattern, final int neededResults) { - this.id = id; this.cacheStrategy = cacheStrategy; this.lastLifeSign = System.currentTimeMillis(); this.snippetPattern = snippetPattern; @@ -481,15 +479,14 @@ public class SnippetProcess { // find the url entry long startTime = System.currentTimeMillis(); - final URIMetadataRow.Components metadata = page.metadata(); - if (metadata == null) return null; + if (page == null) return null; final long dbRetrievalTime = System.currentTimeMillis() - startTime; if (cacheStrategy == null) { final TextSnippet snippet = new TextSnippet( null, solrText, - metadata, + page, this.snippetFetchWordHashes, null, ((this.query.constraint != null) && (this.query.constraint.get(Condenser.flag_cat_indexof))), @@ -506,7 +503,7 @@ public class SnippetProcess { final TextSnippet snippet = new TextSnippet( this.loader, solrText, - metadata, + page, this.snippetFetchWordHashes, cacheStrategy, ((this.query.constraint != null) && (this.query.constraint.get(Condenser.flag_cat_indexof))), @@ -514,7 +511,7 @@ public class SnippetProcess { Integer.MAX_VALUE, !this.query.isLocal()); final long snippetComputationTime = System.currentTimeMillis() - startTime; - Log.logInfo("SEARCH", "text snippet load time for " + metadata.url() + ": " + snippetComputationTime + ", " + (!snippet.getErrorCode().fail() ? "snippet found" : ("no snippet found (" + snippet.getError() + ")"))); + Log.logInfo("SEARCH", "text snippet load time for " + page.url() + ": " + snippetComputationTime + ", " + (!snippet.getErrorCode().fail() ? "snippet found" : ("no snippet found (" + snippet.getError() + ")"))); if (!snippet.getErrorCode().fail()) { // we loaded the file and found the snippet @@ -526,16 +523,16 @@ public class SnippetProcess { } else { // problems with snippet fetch final String reason = "no text snippet; errorCode = " + snippet.getErrorCode(); - if (this.deleteIfSnippetFail) this.workTables.failURLsRegisterMissingWord(this.query.getSegment().termIndex(), metadata.url(), this.query.queryHashes, reason); - Log.logInfo("SEARCH", "sorted out url " + metadata.url().toNormalform(true, false) + " during search: " + reason); + if (this.deleteIfSnippetFail) this.workTables.failURLsRegisterMissingWord(this.query.getSegment().termIndex(), page.url(), this.query.queryHashes, reason); + Log.logInfo("SEARCH", "sorted out url " + page.url().toNormalform(true, false) + " during search: " + reason); return null; } } else { // attach media information startTime = System.currentTimeMillis(); - final List mediaSnippets = MediaSnippet.retrieveMediaSnippets(metadata.url(), this.snippetFetchWordHashes, this.query.contentdom, cacheStrategy, 6000, !this.query.isLocal()); + final List mediaSnippets = MediaSnippet.retrieveMediaSnippets(page.url(), this.snippetFetchWordHashes, this.query.contentdom, cacheStrategy, 6000, !this.query.isLocal()); final long snippetComputationTime = System.currentTimeMillis() - startTime; - Log.logInfo("SEARCH", "media snippet load time for " + metadata.url() + ": " + snippetComputationTime); + Log.logInfo("SEARCH", "media snippet load time for " + page.url() + ": " + snippetComputationTime); if (mediaSnippets != null && !mediaSnippets.isEmpty()) { // found media snippets, return entry @@ -545,8 +542,8 @@ public class SnippetProcess { } else { // problems with snippet fetch final String reason = "no media snippet"; - if (this.deleteIfSnippetFail) this.workTables.failURLsRegisterMissingWord(this.query.getSegment().termIndex(), metadata.url(), this.query.queryHashes, reason); - Log.logInfo("SEARCH", "sorted out url " + metadata.url().toNormalform(true, false) + " during search: " + reason); + if (this.deleteIfSnippetFail) this.workTables.failURLsRegisterMissingWord(this.query.getSegment().termIndex(), page.url(), this.query.queryHashes, reason); + Log.logInfo("SEARCH", "sorted out url " + page.url().toNormalform(true, false) + " during search: " + reason); return null; } } diff --git a/source/net/yacy/search/ranking/BlockRank.java b/source/net/yacy/search/ranking/BlockRank.java index 8fce37eb5..24b146e22 100644 --- a/source/net/yacy/search/ranking/BlockRank.java +++ b/source/net/yacy/search/ranking/BlockRank.java @@ -33,8 +33,8 @@ import java.util.List; import java.util.Map; import net.yacy.cora.document.ASCII; -import net.yacy.cora.ranking.OrderedScoreMap; -import net.yacy.cora.ranking.ScoreMap; +import net.yacy.cora.sorting.OrderedScoreMap; +import net.yacy.cora.sorting.ScoreMap; import net.yacy.kelondro.index.BinSearch; import net.yacy.kelondro.index.RowSpaceExceededException; import net.yacy.kelondro.logging.Log; diff --git a/source/net/yacy/search/ranking/ReferenceOrder.java b/source/net/yacy/search/ranking/ReferenceOrder.java index ceea48447..0fade437b 100644 --- a/source/net/yacy/search/ranking/ReferenceOrder.java +++ b/source/net/yacy/search/ranking/ReferenceOrder.java @@ -33,7 +33,7 @@ import java.util.concurrent.BlockingQueue; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.Semaphore; -import net.yacy.cora.ranking.ConcurrentScoreMap; +import net.yacy.cora.sorting.ConcurrentScoreMap; import net.yacy.document.Condenser; import net.yacy.document.LargeNumberCache; import net.yacy.kelondro.data.meta.DigestURI; diff --git a/source/net/yacy/search/snippet/ResultEntry.java b/source/net/yacy/search/snippet/ResultEntry.java index 0afcac18d..456dec424 100644 --- a/source/net/yacy/search/snippet/ResultEntry.java +++ b/source/net/yacy/search/snippet/ResultEntry.java @@ -51,7 +51,6 @@ public class ResultEntry implements Comparable, Comparator, Comparator mediaSnippets, final long dbRetrievalTime, final long snippetComputationTime) { this.urlentry = urlentry; - this.urlcomps = urlentry.metadata(); this.alternative_urlstring = null; this.alternative_urlname = null; this.textSnippet = textSnippet; this.mediaSnippets = mediaSnippets; this.dbRetrievalTime = dbRetrievalTime; this.snippetComputationTime = snippetComputationTime; - final String host = urlcomps.url().getHost(); + final String host = urlentry.url().getHost(); if (host != null && host.endsWith(".yacyh")) { // translate host into current IP int p = host.indexOf('.'); final String hash = Seed.hexHash2b64Hash(host.substring(p + 1, host.length() - 6)); final Seed seed = peers.getConnected(hash); - final String filename = urlcomps.url().getFile(); + final String filename = urlentry.url().getFile(); String address = null; if ((seed == null) || ((address = seed.getPublicAddress()) == null)) { // seed is not known from here @@ -90,7 +88,7 @@ public class ResultEntry implements Comparable, Comparator, Comparator 0) alternative_urlname = alternative_urlname.substring(0, p); + this.alternative_urlstring = "http://" + address + "/" + host.substring(0, p) + filename; + this.alternative_urlname = "http://share." + seed.getName() + ".yacy" + filename; + if ((p = this.alternative_urlname.indexOf('?')) > 0) this.alternative_urlname = this.alternative_urlname.substring(0, p); } } @Override public int hashCode() { - return ByteArray.hashCode(urlentry.hash()); + return ByteArray.hashCode(this.urlentry.hash()); } @Override public boolean equals(final Object obj) { @@ -113,37 +111,37 @@ public class ResultEntry implements Comparable, Comparator, Comparator, Comparator, Comparator, Comparator, Comparator, Comparator, Comparator, Comparator> registeredHandlers = new HashMap>(); + private final Map> registeredHandlers = new HashMap>(); private final Object REGISTRATION_PROCESS = new Object(); @@ -107,12 +115,12 @@ public class DiscoveryListener implements Runnable { * @throws IOException if some errors occurs during SSDP search response messages listener thread startup */ public void registerResultsHandler( DiscoveryResultsHandler resultsHandler, String searchTarget ) throws IOException { - synchronized( REGISTRATION_PROCESS ) { - if ( !inService ) startDevicesListenerThread(); - Set handlers = registeredHandlers.get( searchTarget ); + synchronized( this.REGISTRATION_PROCESS ) { + if ( !this.inService ) startDevicesListenerThread(); + Set handlers = this.registeredHandlers.get( searchTarget ); if ( handlers == null ) { handlers = new HashSet(); - registeredHandlers.put( searchTarget, handlers ); + this.registeredHandlers.put( searchTarget, handlers ); } handlers.add( resultsHandler ); } @@ -124,15 +132,15 @@ public class DiscoveryListener implements Runnable { * @param searchTarget the search target */ public void unRegisterResultsHandler( DiscoveryResultsHandler resultsHandler, String searchTarget ) { - synchronized( REGISTRATION_PROCESS ) { - Set handlers = registeredHandlers.get( searchTarget ); + synchronized( this.REGISTRATION_PROCESS ) { + Set handlers = this.registeredHandlers.get( searchTarget ); if ( handlers != null ) { handlers.remove( resultsHandler ); if (handlers.isEmpty()) { - registeredHandlers.remove( searchTarget ); + this.registeredHandlers.remove( searchTarget ); } } - if (registeredHandlers.isEmpty()) { + if (this.registeredHandlers.isEmpty()) { stopDevicesListenerThread(); } } @@ -140,13 +148,13 @@ public class DiscoveryListener implements Runnable { private void startDevicesListenerThread() throws IOException { synchronized( singleton ) { - if ( !inService ) { + if ( !this.inService ) { this.startMultiCastSocket(); Thread deamon = new Thread( this, "DiscoveryListener daemon" ); - deamon.setDaemon( daemon ); + deamon.setDaemon( this.daemon ); deamon.start(); - while ( !inService ) { + while ( !this.inService ) { // wait for the thread to be started let's wait a few ms try { Thread.sleep( 2 ); @@ -160,7 +168,7 @@ public class DiscoveryListener implements Runnable { private void stopDevicesListenerThread() { synchronized( singleton ) { - inService = false; + this.inService = false; } } @@ -171,38 +179,39 @@ public class DiscoveryListener implements Runnable { bindPort = Integer.parseInt( port ); } - skt = new java.net.MulticastSocket( null ); - skt.bind( new InetSocketAddress( InetAddress.getByName( "0.0.0.0" ), bindPort ) ); - skt.setTimeToLive( Discovery.DEFAULT_TTL ); - skt.setSoTimeout( DEFAULT_TIMEOUT ); - skt.joinGroup( InetAddress.getByName( Discovery.SSDP_IP ) ); + this.skt = new java.net.MulticastSocket( null ); + this.skt.bind( new InetSocketAddress( InetAddress.getByName( "0.0.0.0" ), bindPort ) ); + this.skt.setTimeToLive( Discovery.DEFAULT_TTL ); + this.skt.setSoTimeout( DEFAULT_TIMEOUT ); + this.skt.joinGroup( InetAddress.getByName( Discovery.SSDP_IP ) ); byte[] buf = new byte[2048]; - input = new DatagramPacket( buf, buf.length ); + this.input = new DatagramPacket( buf, buf.length ); } - public void run() { + @Override +public void run() { if ( !Thread.currentThread().getName().equals( "DiscoveryListener daemon" ) ) { throw new RuntimeException( "No right to call this method" ); } - inService = true; - while ( inService ) { + this.inService = true; + while ( this.inService ) { try { listenBroadCast(); } catch ( SocketTimeoutException ex ) { // ignoring } catch ( IOException ioEx ) { - log.error( "IO Exception during UPNP DiscoveryListener messages listening thread", ioEx ); + log.error( "IO Exception during UPNP DiscoveryListener messages listening thread" ); } catch( Exception ex ) { - log.error( "Fatal Error during UPNP DiscoveryListener messages listening thread, thread will exit", ex ); - inService = false; + log.error( "Fatal Error during UPNP DiscoveryListener messages listening thread, thread will exit" ); + this.inService = false; } } try { - skt.leaveGroup( InetAddress.getByName( Discovery.SSDP_IP ) ); - skt.close(); + this.skt.leaveGroup( InetAddress.getByName( Discovery.SSDP_IP ) ); + this.skt.close(); } catch ( Exception ex ) { // ignoring } @@ -210,9 +219,9 @@ public class DiscoveryListener implements Runnable { private void listenBroadCast() throws IOException { - skt.receive( input ); - InetAddress from = input.getAddress(); - String received = new String( input.getData(), input.getOffset(), input.getLength() ); + this.skt.receive( this.input ); + InetAddress from = this.input.getAddress(); + String received = new String( this.input.getData(), this.input.getOffset(), this.input.getLength() ); HttpResponse msg = null; try { msg = new HttpResponse( received ); @@ -265,11 +274,10 @@ public class DiscoveryListener implements Runnable { String udn = usn; int index = udn.indexOf( "::" ); if ( index != -1 ) udn = udn.substring( 0, index ); - synchronized( REGISTRATION_PROCESS ) { - Set handlers = registeredHandlers.get( st ); + synchronized( this.REGISTRATION_PROCESS ) { + Set handlers = this.registeredHandlers.get( st ); if ( handlers != null ) { - for ( Iterator i = handlers.iterator(); i.hasNext(); ) { - DiscoveryResultsHandler handler = i.next(); + for ( DiscoveryResultsHandler handler : handlers ) { handler.discoveredDevice( usn, udn, st, maxAge, loc, server ); } } diff --git a/source/net/yacy/yacy.java b/source/net/yacy/yacy.java index 4d6e2521f..b6af8112e 100644 --- a/source/net/yacy/yacy.java +++ b/source/net/yacy/yacy.java @@ -47,12 +47,13 @@ import java.util.zip.ZipOutputStream; import net.yacy.cora.date.GenericFormatter; import net.yacy.cora.document.ASCII; +import net.yacy.cora.document.UTF8; import net.yacy.cora.protocol.ClientIdentification; import net.yacy.cora.protocol.RequestHeader; import net.yacy.cora.protocol.http.HTTPClient; -import net.yacy.cora.ranking.OrderedScoreMap; -import net.yacy.cora.ranking.ScoreMap; import net.yacy.cora.sorting.Array; +import net.yacy.cora.sorting.OrderedScoreMap; +import net.yacy.cora.sorting.ScoreMap; import net.yacy.gui.Tray; import net.yacy.gui.YaCyApp; import net.yacy.gui.framework.Browser; @@ -881,15 +882,15 @@ public final class yacy { final File dbFile = new File(yacyDBPath,dbFileName); final MapDataMining db = new MapDataMining(dbFile, Word.commonHashLength, Base64Order.enhancedCoder, 1024 * 512, 500, SeedDB.sortFields, SeedDB.longaccFields, SeedDB.doubleaccFields, null); - MapDataMining.mapIterator it; - it = db.maps(true, false); + Iterator>> it; + it = db.entries(true, false); while (it.hasNext()) { - final Map dna = it.next(); - String peerHash = dna.get("key"); + final Map.Entry> dna = it.next(); + String peerHash = UTF8.String(dna.getKey()); if (peerHash.length() < Word.commonHashLength) { - final String peerName = dna.get("Name"); - final String peerIP = dna.get("IP"); - final String peerPort = dna.get("Port"); + final String peerName = dna.getValue().get("Name"); + final String peerIP = dna.getValue().get("IP"); + final String peerPort = dna.getValue().get("Port"); while (peerHash.length() < Word.commonHashLength) { peerHash = peerHash + "_"; } System.err.println("Invalid Peer-Hash found in '" + dbFileName + "': " + peerName + ":" + peerHash + ", http://" + peerIP + ":" + peerPort);