Вы находитесь на странице: 1из 49

Установка и настройка поискового сервера на базе Nutch в Gentoo Linux

1 Переменные, используемые в документе


- ${NUTCH_DOMAIN} – домен, используемый для поискового сервера (например
search.domain.com)
- ${OVERLAY_DIR} – корневая папка оверлея пакетов Gentoo Linux (например
/usr/local/overlay)

2 Требования к установленному программному обеспечению


Предполагается, что на сервере установлена операционная система Gentoo Linux 2006.1
или выше.
Перед тем, как приступить к установке и настройке настройке Nutch необходимо
убедиться что на сервере уже установлено следующее программное обеспечение:
- сервер приложений Tomcat 5.5.x
- веб-сервер Apache 2.0.x с модулями mod_jk, mod_macro, mod_proxy, mod_rewrite

3 Установка Nutch в Gentoo Linux


Перед установкой Nutch необходимо сконфигурировать оверлей пакетов. Для этого
нужно создать папку, где будет размещаться оверлей
mkdir ${OVERLAY_DIR}
и указать Gentoo Linux информацию о том, где искать дополнительные пакеты
echo "PORTDIR_OVERLAY=${OVERLAY_DIR}" >> /etc/make.conf
После этого необходимо создать иерархию файлов, приведенную в Приложении 1.
Также её можно загрузить с RSYNC сервера jdev.tusur.ru/jdev-overlay.
В файл /etc/portage/package.keywords необходимо дописать строки
dev-java/commons-httpclient
dev-java/poi
В файл /etc/portage/package.use дописать строки
www-apps/nutch analyzers
dev-java/poi nutch
dev-java/lucene analyzers
dev-java/commons-logging log4j
Установка Nutch производится командой
emerge nutch

4 Конфигурирование поискового сервера


Все базовые изменения должны проводиться в файле конфигурации
/etc/nutch/nutch-site.xml. Все значения указанных ниже свойств должны быть записаны
в виде:
<property>
<name>свойство</name>
<value>значение</value>
<description></description>
</property>
Список параметров конфигурации приведён в приложении 2.
Файлы конфигурации Nutch для единого информационного пространства ТУСУР
приведены в приложении 3. С такой конфигурацией поисковый робот будет только те сайты,
которые добавлены в поисковую базу при помощи команды
nutch inject

5 Запуск поискового робота


Перед запуском поискового робота необходимо задать первоначальный список URL.
nutch inject /var/lib/nutch/crawl/crawldb /var/lib/nutch/urls/
где /var/lib/nutch/urls/ - директория, в которой находится список файлов, каждый
из которых содержит адреса сайтов, разделённых символом перевода строки.
После первоначальной инициализации поисковой базы можно запустить скрипт
recrawl, который проведёт цикл сбора информации.
recrawl /var/lib/tomcat-5.5/webapps/nutch /var/lib/nutch/crawl 100 0
500
где
- /var/lib/tomcat-5.5/webapps/nutch – директория, в которую установлено веб-
приложение Nutch;
- /var/lib/nutch/crawl – директория базы данных
- 100 – максимальная глубина страниц в дереве сайта
- 0 – к текущему времени добавляется 0 дней (этот параметр может использоваться для
обхода параметра db.default.fetch.interval - описанному на странице 31)
- 500 – количество циклов итерации

6 Настройка веб-сервера Apache


Для того, чтобы поисковый сервер работал через стандартное соединение на 80 порту
рекомендуется использовать веб-сервер Apache версии 2.0.x с модулями mod_jk и
mod_rewrite. Настройка виртуального хоста для дистрибутива Gentoo Linux проводится
путём добавления файла с именем, заканчивающимся на .conf в директорию
/etc/apache2/vhosts.d/. Примерное содержание файла:
# Используем name-based виртульный хостинг
<VirtualHost *:80>
ServerName search.tusur.ru
ServerAlias www.search.tusur.ru
ServerAdmin ilab@tusur.ru

# Указываем корневую директорию виртуального хоста, чтобы


# веб-сервер мог напрямую отдавать статический контент
DocumentRoot "/var/lib/tomcat-5.5/nutch"

# Запрещаем доступ к папке WEB-INF


<Directory "/var/lib/tomcat-5.5/nutch/WEB-INF">
AllowOverride none
Order allow,deny
Allow from none
</Directory>

RewriteEngine on
RewriteRule !^/nutch/(.*)$ /nutch%{REQUEST_URI} [PT]

# Настройка журналирования
CustomLog logs/search.tusur.ru-access.log combined
ErrorLog logs/search.tusur.ru-errors.log
</VirtualHost>
Приложение 1: Иерархия оверлея пакетов
Иерархия пактов оверлея представлена в виде дерева
${OVERLAY_DIR}
|-- dev-java
| |-- lucene
| | |-- lucene-2.1.0.ebuild
| `-- poi
| |-- files
| | |-- poi-3.0_alpha3-build.xml.patch
| | `-- poi-3.0_alpha3-src.patch
| `-- poi-3.0_alpha3-r1.ebuild
|-- sys-cluster
| `-- hadoop
| |-- files
| | |-- StatusHttpServer_java.diff
| | |-- ToolBase_java.diff
| | |-- build_xml.patch
| `-- hadoop-0.12.3.ebuild
`-- www-apps
`-- nutch
|-- files
| |-- build_xml.patch
| |-- nutch-analyzers.patch
| |-- nutch-site.xml
| `-- recrawl
`-- nutch-0.9.ebuild
- dev-java/lucene/lucene-2.1.0.ebuild
# Copyright 1999-2007 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Header: $

inherit java-pkg-2 java-ant-2

DESCRIPTION="High-performance, full-featured text search engine \


written entirely in Java"
HOMEPAGE="http://lucene.apache.org/"
SRC_URI="mirror://apache/lucene/java/${P}-src.tar.gz"
LICENSE="Apache-2.0"
SLOT="2"
KEYWORDS="amd64 ~ia64 ppc x86 ~x86-fbsd"
IUSE="analyzers"
DEPEND=">=virtual/jre-1.5
>=dev-java/ant-core-1.5"
RDEPEND=">=virtual/jdk-1.5"
LV="2.1.1-dev"
LCN="${PN}-core"
LAN="${PN}-analyzers"
LSN="${PN}-snowball"
LMN="${PN}-misc"

src_unpack() {
unpack ${A}
}

src_compile() {
eant jar-core
if use analyzers; then
cd contrib/analyzers
eant
cd ../snowball
eant
cd ../../
fi
cd contrib/miscellaneous
eant
}

src_test() {
eant test
}

src_install() {
dodoc CHANGES.txt README.txt
java-pkg_newjar build/${LCN}-${LV}.jar ${PN}.jar
java-pkg_newjar build/contrib/misc/${LMN}-${LV}.jar ${LMN}.jar
if use analyzers; then
java-pkg_newjar build/contrib/analyzers/${LAN}-${LV}.jar \
${LAN}.jar
java-pkg_newjar build/contrib/snowball/${LSN}-${LV}.jar ${LSN}.jar
fi
}
- dev-java/poi/poi-3.0_alpha3-r1.ebuild
# Copyright 1999-2006 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Header: $

inherit java-pkg-2 java-ant-2 versionator

DESCRIPTION="Java API To Access Microsoft Format Files"


HOMEPAGE="http://jakarta.apache.org/poi/"
MY_PV=$(replace_version_separator 2 '-' ${PV})
RELEASE_DATE="20061212"
SRC_URI="mirror://apache/jakarta/poi/dev/src/${PN}-src-${MY_PV}-$
{RELEASE_DATE}.tar.gz"

LICENSE="Apache-2.0"
SLOT="0"
KEYWORDS="~amd64 ~ppc ~x86"
IUSE="nutch"

RDEPEND=">=virtual/jre-1.2
>=dev-java/commons-logging-1.1
>=dev-java/log4j-1.2.13
=dev-java/commons-beanutils-1.7*
>=dev-java/commons-collections-3.2
=dev-java/commons-lang-2.1*"
DEPEND=">=virtual/jdk-1.2
${RDEPEND}
>=dev-java/ant-core-1.4
test? ( =dev-java/junit-3.8*
>=dev-java/ant-junit-1.4 )"

S=${WORKDIR}

src_unpack() {
unpack ${A}
cd ${S}
epatch ${FILESDIR}/${P}-build.xml.patch
use nutch && epatch ${FILESDIR}/${P}-src.patch
cd ${S}/lib
rm -f *.jar
java-pkg_jar-from commons-logging
java-pkg_jar-from log4j
cd ${S}/src/contrib/lib
rm -f *.jar
java-pkg_jar-from commons-beanutils-1.7 commons-beanutils.jar \
commons-beanutils-1.7.0.jar
java-pkg_jar-from commons-collections commons-collections.jar \
commons-collections-3.2.jar
java-pkg_jar-from commons-lang-2.1 commons-lang.jar \
commons-lang-2.1.jar
}

src_compile() {
eant jar -Ddisconnected=true $(use_doc javadocs)
}

src_install() {
cd build/dist/
local VERSION=$(get_version_component_range 1-2 ${PV})
java-pkg_newjar poi-scratchpad-${VERSION}* ${PN}-scratchpad.jar
java-pkg_newjar poi-contrib-${VERSION}* ${PN}-contrib.jar
java-pkg_newjar poi-${VERSION}* ${PN}.jar
}
- dev-java/poi/files/poi-3.0_alpha3-build.xml.patch
--- build.xml.original 2006-10-31 22:51:15.000000000 +0100
+++ build.xml 2006-10-31 22:51:37.000000000 +0100
@@ -269,15 +269,6 @@
srcdir="${main.src}">
<classpath refid="main.classpath"/>
</javac>
- <javac target="${jdk.version.class}" source="$
{jdk.version.source}"
- failonerror="true" destdir="${main.output.test.dir}" debug="on"
- fork="yes" srcdir="${main.src.test}">
- <classpath>
- <path refid="main.classpath"/>
- <pathelement location="${main.output.dir}"/>
- <pathelement location="${junit.jar1.dir}"/>
- </classpath>
- </javac>
</target>

<target name="compile-scratchpad" depends="init">


@@ -286,15 +277,6 @@
fork="yes" srcdir="${scratchpad.src}">
<classpath refid="scratchpad.classpath"/>
</javac>
- <javac target="${jdk.version.class}" source="$
{jdk.version.source}"
- failonerror="true" destdir="${scratchpad.output.test.dir}"
debug="on"
- fork="yes" srcdir="${scratchpad.src.test}">
- <classpath>
- <path refid="scratchpad.classpath"/>
- <pathelement location="${scratchpad.output.dir}"/>
- <pathelement location="${junit.jar1.dir}"/>
- </classpath>
- </javac>

<!-- Copy HSLF Resources over -->


<property name="hslf.data" value="org/apache/poi/hslf/data" />
@@ -312,15 +294,6 @@
srcdir="${contrib.src}">
<classpath refid="contrib.classpath"/>
</javac>
- <javac target="${jdk.version.class}" source="$
{jdk.version.source}"
- failonerror="true" destdir="${contrib.output.test.dir}"
debug="on"
- fork="yes" srcdir="${contrib.src.test}">
- <classpath>
- <path refid="contrib.classpath"/>
- <pathelement location="${contrib.output.dir}"/>
- <pathelement location="${junit.jar1.dir}"/>
- </classpath>
- </javac>
</target>

<target name="compile-examples" depends="init">


- dev-java/poi/files/poi-3.0_alpha3-src.patch
diff -ru poi.original/src/java/org/apache/poi/hssf/model/Workbook.java
poi/src/java/org/apache/poi/hssf/model/Workbook.java
--- poi.original/src/java/org/apache/poi/hssf/model/Workbook.java
2006-01-03 12:41:36.000000000 +0100
+++ poi/src/java/org/apache/poi/hssf/model/Workbook.java 2006-11-03
21:10:29.000000000 +0100
@@ -103,6 +103,19 @@

private static POILogger log =


POILogFactory.getLogger(Workbook.class);

+ /**
+ * The date strings to look for
+ */
+ private static final String[] dateStrings = new String[]
+ {
+ "dd",
+ "mm",
+ "yy",
+ "hh",
+ "ss",
+ "m/",
+ "/d"
+ };
/**
* Creates new Workbook with no intitialization --useless right
now
* @see #createWorkbook(List)
@@ -2221,6 +2234,58 @@
{
return drawingManager;
}
+
+ public FormatRecord getFormat(final short index) {
+ FormatRecord foundFormat = null;
+ Iterator iterator = formats.iterator();
+ while (iterator.hasNext()) {
+ final FormatRecord format = (FormatRecord)
iterator.next();
+ if (format.getIndexCode() == index) {
+ foundFormat = format;
+ break;
+ }
+ }
+ return foundFormat;
+ }

-}
+ public boolean isDateFormat(final short index) {
+ boolean isDate = false;
+ final FormatRecord format = getFormat(index);
+ if (format != null) {
+ switch(format.getIndexCode()) {
+ // Internal Date Formats as described on page 427 in
+ // Microsoft Excel Dev's Kit...
+ case 0x0e:
+ case 0x0f:
+ case 0x10:
+ case 0x11:
+ case 0x12:
+ case 0x13:
+ case 0x14:
+ case 0x15:
+ case 0x16:
+ case 0x2d:
+ case 0x2e:
+ case 0x2f:
+ isDate = true;
+ break;

+ default:
+ break;
+ }
+
+ if (!isDate) {
+ final String formatString = format.getFormatString();
+ for (int i = 0; i < dateStrings.length; i++) {
+ final String dateString = dateStrings[i];
+ if (formatString.indexOf(dateString) != -1 ||
+
formatString.indexOf(dateString.toUpperCase()) != -1) {
+ isDate = true;
+ break;
+ }
+ }
+ }
+ }
+ return isDate;
+ }
+}
diff -ru
poi.original/src/java/org/apache/poi/hssf/usermodel/HSSFWorkbook.java
poi/src/java/org/apache/poi/hssf/usermodel/HSSFWorkbook.java
---
poi.original/src/java/org/apache/poi/hssf/usermodel/HSSFWorkbook.java
2006-07-27 16:15:11.000000000 +0200
+++ poi/src/java/org/apache/poi/hssf/usermodel/HSSFWorkbook.java
2006-11-03 21:09:50.000000000 +0100
@@ -1279,4 +1279,8 @@
byte[] bytes = new byte[16];
return bytes;
}
+
+ public boolean isDateFormat(final short index) {
+ return workbook.isDateFormat(index);
+ }
}
diff -ru
poi.original/src/scratchpad/src/org/apache/poi/hwpf/model/TextPiece.ja
va poi/src/scratchpad/src/org/apache/poi/hwpf/model/TextPiece.java
---
poi.original/src/scratchpad/src/org/apache/poi/hwpf/model/TextPiece.ja
va 2006-07-27 16:15:11.000000000 +0200
+++ poi/src/scratchpad/src/org/apache/poi/hwpf/model/TextPiece.java
2006-11-03 21:09:50.000000000 +0100
@@ -20,6 +20,7 @@

import java.io.UnsupportedEncodingException;
+import java.lang.StringIndexOutOfBoundsException;
/**
* Lightweight representation of a text piece.
*
@@ -84,8 +85,13 @@
public String substring(int start, int end)
{
int denominator = _usesUnicode ? 2 : 1;
-
- return ((StringBuffer)_buf).substring(start/denominator,
end/denominator);
+ String string = "";
+ try {
+ string = ((StringBuffer)_buf).substring(start/denominator,
end/denominator);
+ } catch(StringIndexOutOfBoundsException e) {
+ string = "";
+ }
+ return string;
}

public void adjustForDelete(int start, int length)


- sys-cluster/hadoop-0.12.3.ebuild
# Copyright 1999-2007 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Header: $

inherit eutils java-pkg-2 java-ant-2

DESCRIPTION="Hadoop is a framework for running applications on large


clusters of commodity hardware."
HOMEPAGE="http://lucene.apache.org/hadoop"
SRC_URI="mirror://apache/lucene/${PN}/${P}.tar.gz"
LICENSE="Apache-2.0"
SLOT="0"
KEYWORDS="amd64 x86"
IUSE="s3fs"

COMMON_DEPEND="
>=dev-java/commons-logging-1.0
=dev-java/commons-cli-1*
>=dev-java/tomcat-servlet-api-5.5
dev-java/log4j
"
DEPEND=">=virtual/jdk-1.5
dev-java/ant-core
s3fs? (www-servers/jetty)
${COMMON_DEPEND}
"
RDEPEND=">=virtual/jre-1.5
${COMMON_DEPEND}
"

src_unpack() {
unpack ${A}
cd ${S}
epatch ${FILESDIR}/build_xml.patch
rm -rf ${S}/lib/*
if ! use s3fs; then
rm -rf ${S}/src/java/org/apache/hadoop/fs/s3/
epatch ${FILESDIR}/StatusHttpServer_java.diff
fi
rm ${S}/src/java/org/apache/hadoop/dfs/JspHelper.java
epatch ${FILESDIR}/ToolBase_java.diff
cd ${S}/lib
java-pkg_jar-from commons-logging commons-logging-api.jar
java-pkg_jar-from commons-cli-1 commons-cli.jar
java-pkg_jar-from tomcat-servlet-api-2.4 servlet-api.jar
java-pkg_jar-from log4j log4j.jar
}

src_compile() {
eant jar
}

src_install() {
# hadoop.jar
java-pkg_newjar build/${P}-core.jar ${PN}.jar
}
- sys-cluster/hadoop/files/StatusHttpServer_java.diff
-- src/java/org/apache/hadoop/mapred/StatusHttpServer.java.orig 2007-
05-18 17:25:18.000000000 +0700
+++ src/java/org/apache/hadoop/mapred/StatusHttpServer.java 2007-05-18
17:32:24.000000000 +0700
@@ -29,11 +29,12 @@
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.hadoop.util.*;
+/*
import org.mortbay.http.HttpContext;
import org.mortbay.http.handler.ResourceHandler;
import org.mortbay.http.SocketListener;
import org.mortbay.jetty.servlet.WebApplicationContext;
-
+*/
/**
* Create a Jetty embedded server to answer http requests. The
primary goal
* is to serve up status information for the server.
@@ -44,6 +45,7 @@
* @author Owen O'Malley
*/
public class StatusHttpServer {
+/*
private static final boolean isWindows =
System.getProperty("os.name").startsWith("Windows");
private org.mortbay.jetty.Server webServer;
@@ -52,7 +54,7 @@
private WebApplicationContext webAppContext;
private static final Log LOG =
LogFactory.getLog(StatusHttpServer.class.getName());
-
+*/
/**
* Create a status server on the given port.
* The jsp scripts are taken from src/webapps/<name>.
@@ -63,6 +65,7 @@
*/
public StatusHttpServer(String name, String bindAddress, int port,
boolean findPort) throws IOException {
+/*
webServer = new org.mortbay.jetty.Server();
this.findPort = findPort;
listener = new SocketListener();
@@ -92,6 +95,7 @@
webAppContext =
webServer.addWebApplication("/", appDir + File.separator +
name);
addServlet("stacks", "/stacks", StackServlet.class);
+*/
}

/**
@@ -101,7 +105,9 @@
* @param value The value of the attribute
*/
public void setAttribute(String name, Object value) {
+/*
webAppContext.setAttribute(name,value);
+*/
}
/**
@@ -113,6 +119,7 @@
public <T extends HttpServlet>
void addServlet(String name, String pathSpec,
Class<T> servletClass) {
+/*
WebApplicationContext context = webAppContext;
try {
if (name == null) {
@@ -127,15 +134,19 @@
} catch (IllegalAccessException ex) {
throw makeRuntimeException("Problem instantiating class", ex);
}
+*/
}

private static RuntimeException makeRuntimeException(String msg,


Throwable
cause) {
+/*
RuntimeException result = new RuntimeException(msg);
if (cause != null) {
result.initCause(cause);
}
return result;
+*/
+ return null;
}

/**
@@ -144,7 +155,10 @@
* @return The value of the attribute
*/
public Object getAttribute(String name) {
+/*
return webAppContext.getAttribute(name);
+*/
+ return null;
}

/**
@@ -152,6 +166,7 @@ * @return the pathname
*/
private static String getWebAppsPath() throws IOException {
+/*
URL url =
StatusHttpServer.class.getClassLoader().getResource("webapps");
if( url == null )
throw new IOException("webapps not found in CLASSPATH");
@@ -164,6 +179,8 @@
}
}
return new File(path).getCanonicalPath();
+*/
+ return null;
}

/**
@@ -171,17 +188,23 @@
* @return the port
*/
public int getPort() {
+/*
return listener.getPort();
+*/
+ return 0;
}

public void setThreads(int min, int max) {


+/*
listener.setMinThreads(min);
listener.setMaxThreads(max);
+*/
}
/**
* Start the server. Does not wait for the server to start.
*/
public void start() throws IOException {
+/*
try {
while (true) {
try {
@@ -212,13 +235,16 @@
ie.initCause(e);
throw ie;
}
+*/
}

/**
* stop the server
*/
public void stop() throws InterruptedException {
+/*
webServer.stop();
+*/
}

/**
@@ -232,10 +258,12 @@
public void doGet(HttpServletRequest request,
HttpServletResponse response
) throws ServletException, IOException {
+/*
OutputStream outStream = response.getOutputStream();
ReflectionUtils.printThreadInfo(new PrintWriter(outStream),
"");
outStream.close();
ReflectionUtils.logThreadInfo(LOG, "jsp requested", 1);
+*/
}
}
- sys-cluster/hadoop/files/ToolBase_java.diff
--- src/java/org/apache/hadoop/util/ToolBase.java.orig 2007-05-18
18:23:32.000000000 +0700
+++ src/java/org/apache/hadoop/util/ToolBase.java 2007-05-18
17:56:00.000000000 +0700
@@ -112,7 +112,9 @@
.create("conf");
Option property = OptionBuilder.withArgName("property=value")
.hasArgs()
+/*
.withArgPattern("=", 1)
+*/
.withDescription("use value for given
property")
.create('D');
Options opts = new Options();
- sys-cluster/hadoop/files/build_xml.patch
--- build.xml.orig 2007-04-06 23:26:13.000000000 +0700
+++ build.xml 2007-05-18 15:21:43.000000000 +0700
@@ -9,7 +9,7 @@

<property name="Name" value="Hadoop"/>


<property name="name" value="hadoop"/>
- <property name="version" value="0.12.4-dev"/>
+ <property name="version" value="0.12.3"/>
<property name="final.name" value="${name}-${version}"/>
<property name="year" value="2006"/>
<property name="libhdfs.version" value="1"/>
@@ -111,10 +111,12 @@
<mkdir dir="${test.build.dir}"/>
<mkdir dir="${test.build.classes}"/>
<mkdir dir="${test.build.testjar}"/>
+ <!--
<touch datetime="01/25/1971 2:00 pm">
<fileset dir="${conf.dir}" includes="**/*.template"/>
<fileset dir="${contrib.dir}" includes="**/*.template"/>
</touch>
+ -->

<!-- copy all of the jsp and static files -->


<copy todir="${build.webapps}">
@@ -141,9 +143,6 @@
<!-- ====================================================== -->
<!-- Compile the Java files -->
<!-- ====================================================== -->
- <taskdef classname="org.apache.jasper.JspC" name="jsp-compile" >
- <classpath refid="test.classpath"/>
- </taskdef>

<target name="record-parser" depends="init" if="javacc.home">


<javacc
@@ -175,35 +174,6 @@

<target name="compile-core-classes" depends="init, compile-rcc-


compiler">
-
- <jsp-compile
- uriroot="${src.webapps}/task"
- outputdir="${build.src}"
- package="org.apache.hadoop.mapred"
- webxml="${build.webapps}/task/WEB-INF/web.xml">
- </jsp-compile>
-
- <jsp-compile
- uriroot="${src.webapps}/job"
- outputdir="${build.src}"
- package="org.apache.hadoop.mapred"
- webxml="${build.webapps}/task/WEB-INF/web.xml">
- </jsp-compile>
-
- <jsp-compile
- uriroot="${src.webapps}/job"
- outputdir="${build.src}"
- package="org.apache.hadoop.mapred"
- webxml="${build.webapps}/job/WEB-INF/web.xml">
- </jsp-compile>
-
- <jsp-compile
- uriroot="${src.webapps}/dfs"
- outputdir="${build.src}"
- package="org.apache.hadoop.dfs"
- webxml="${build.webapps}/dfs/WEB-INF/web.xml">
- </jsp-compile>
-
- <jsp-compile
- uriroot="${src.webapps}/datanode"
- outputdir="${build.src}"
- package="org.apache.hadoop.dfs"
- webxml="${build.webapps}/datanode/WEB-INF/web.xml">
- </jsp-compile>
-
<javac
encoding="${build.encoding}"
srcdir="${src.dir};${build.src}"
- www-apps/nutch/nutch-0.9.ebuild
# Copyright 1999-2007 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Header: $

inherit java-pkg-2 java-ant-2 eutils

WANT_ANT_TASKS="ant-trax"

DESCRIPTION="Nutch is open source web-search software"


HOMEPAGE="http://lucene.apache.org/nutch"
SRC_URI="mirror://apache/lucene/nutch/${P}.tar.gz"

LICENSE="Apache-2.0"
SLOT="0"
KEYWORDS="amd64 x86"
IUSE="analyzers"

COMMON_DEPEND="
>=dev-java/lucene-2.1
sys-cluster/hadoop
dev-java/commons-logging
=dev-java/jakarta-oro-2.0*
=dev-java/servletapi-2.4*
=dev-java/commons-lang-2.1*
=dev-java/xerces-2.6*
=dev-java/commons-httpclient-3*
dev-java/commons-codec
=dev-java/commons-cli-1*
dev-java/log4j
analyzers? (>=dev-java/poi-3)"

DEPEND=">=virtual/jdk-1.5
>=dev-java/ant-core-1.6
>=dev-java/ant-tasks-1.6
${COMMON_DEPEND}"

RDEPEND=">=virtual/jdk-1.5
>=www-servers/tomcat-4.0
${COMMON_DEPEND}"

NUTCH_HOME="/usr/share/${PN}"
NUTCH_LIB="/var/lib/${PN}"
NUTCH_WEBAPP="/var/lib/tomcat-5.5/webapps/${PN}"
NUTCH_CONF="/etc/${PN}"
NUTCH_LOGS="/var/log/nutch"

pkg_setup() {
if use analyzers && ! built_with_use 'dev-java/lucene' analyzers;
then
eerror "dev-java/lucene must be built with the analyzers USE-
flag enabled"
die "emerge dev-java/lucene with the analyzers USE-flag
enabled"
fi
if use analyzers && ! built_with_use 'dev-java/poi' nutch; then
eerror "dev-java/poi must be built with the nutch USE-flag
enabled"
die "emerge dev-java/poi with the nutch USE-flag enabled"
fi
if ! built_with_use 'dev-java/commons-logging' log4j; then
eerror "dev-java/commons-logging must be built with the \
log4j USE-flag enabled"
die "emerge dev-java/commons-logging with the log4j \
USE-flag enabled"
fi
}

src_unpack() {
unpack ${A}
cd ${S}

# conf
cp ${FILESDIR}/nutch-site.xml conf/

# bin
cp ${FILESDIR}/recrawl bin/

# patches for building


epatch ${FILESDIR}/build_xml.patch
if use analyzers; then
epatch ${FILESDIR}/${PN}-analyzers.patch
cd src/plugin/lib-jakarta-poi/lib
rm -f *.jar
java-pkg_jar-from poi poi.jar
java-pkg_jar-from poi poi-scratchpad.jar
cd ${S}
fi
mv lib/taglibs-i18n.{jar,tld} .
rm -rf lib/*
mv taglibs-i18n.{jar,tld} lib/
cd lib/
java-pkg_jar-from lucene-2
java-pkg_jar-from hadoop
java-pkg_jar-from jakarta-oro-2.0
java-pkg_jar-from commons-logging
java-pkg_jar-from servletapi-2.4
java-pkg_jar-from commons-lang-2.1
java-pkg_jar-from xerces-2.6
java-pkg_jar-from commons-httpclient-3
java-pkg_jar-from commons-codec
java-pkg_jar-from log4j
java-pkg_jar-from commons-cli-1
}

src_compile() {
ANT_TASKS="ant-trax" eant war
mkdir ${PN}
mv build/${P}.war ${PN}/
cd ${PN}/
jar -xf ${P}.war
rm -f ${P}.war
}

src_install() {
# webapp
keepdir ${NUTCH_WEBAPP} && dodir ${NUTCH_WEBAPP}
cp -R ${PN}/* ${D}/${NUTCH_WEBAPP}/

# root of nutch
dodir ${NUTCH_LIB}

# conf
keepdir ${NUTCH_CONF}
for f in `ls conf/*`; do
dosym ${NUTCH_WEBAPP}/WEB-INF/classes/`basename $f` \
${NUTCH_CONF}/`basename $f`;
done
dosym ${NUTCH_CONF} ${NUTCH_LIB}/conf
dosym ${NUTCH_LIB}/bin/${PN} /usr/bin/${PN}

# plugins
dosym ${NUTCH_WEBAPP}/WEB-INF/classes/plugins ${NUTCH_LIB}/

# bin
exeinto ${NUTCH_LIB}/bin
doexe bin/${PN}
doexe bin/recrawl
dosym ${NUTCH_LIB}/bin/${PN} /usr/bin/${PN}
dosym ${NUTCH_LIB}/bin/recrawl /usr/bin/

# logs
keepdir ${NUTCH_LOGS}
dosym ${NUTCH_LOGS} ${NUTCH_LIB}/logs

# urls
keepdir ${NUTCH_LIB}/urls && dodir ${NUTCH_LIB}/urls
echo "#http://www.tusur.ru/" > ${D}/$
{NUTCH_LIB}/urls/www.tusur.ru

# lib
dodir ${NUTCH_LIB}/lib
insinto ${NUTCH_LIB}/lib
for f in `ls ${D}/${NUTCH_WEBAPP}/WEB-INF/lib/*`; do
dosym ${NUTCH_WEBAPP}/WEB-INF/lib/`basename $f` \
${NUTCH_LIB}/lib
done

# crawl
keepdir ${NUTCH_LIB}/crawl && dodir ${NUTCH_LIB}/crawl
keepdir ${NUTCH_LIB}/crawl/tmp && dodir ${NUTCH_LIB}/crawl/tmp
}
- www-apps/nutch/files/build_xml.patch
--- build.xml.orig 2007-04-03 10:44:27.000000000 +0700
+++ build.xml 2007-05-21 15:00:36.000000000 +0700
@@ -58,9 +58,11 @@
<mkdir dir="${test.build.dir}"/>
<mkdir dir="${test.build.classes}"/>

+<!--
<touch datetime="01/25/1971 2:00 pm">
<fileset dir="${conf.dir}" includes="**/*.template"/>
</touch>
+-->

<copy todir="${conf.dir}" verbose="true">


<fileset dir="${conf.dir}" includes="**/*.template"/>
@@ -151,7 +153,7 @@
<zipfileset dir="${build.classes}"/>
<zipfileset dir="${conf.dir}" excludes="*.template"/>
<zipfileset dir="${lib.dir}" prefix="lib"
- includes="**/*.jar" excludes="hadoop-*.jar"/>
+ includes="**/*.jar" excludes="hadoop*.jar"/>
<zipfileset dir="${build.plugins}" prefix="plugins"/>
</jar>
</target>
@@ -178,14 +180,14 @@
<fileset dir="${docs.dir}"/>
<lib dir="${lib.dir}">
<include name="lucene*.jar"/>
- <include name="taglibs-*.jar"/>
- <include name="hadoop-*.jar"/>
- <include name="dom4j-*.jar"/>
- <include name="xerces-*.jar"/>
- <include name="commons-cli-*.jar"/>
- <include name="commons-lang-*.jar"/>
- <include name="commons-logging-*.jar"/>
- <include name="log4j-*.jar"/>
+ <include name="taglibs*.jar"/>
+ <include name="hadoop*.jar"/>
+ <include name="dom4j*.jar"/>
+ <include name="xerces*.jar"/>
+ <include name="commons-cli*.jar"/>
+ <include name="commons-lang*.jar"/>
+ <include name="commons-logging*.jar"/>
+ <include name="log4j*.jar"/>
</lib>
<lib dir="${build.dir}">
<include name="${final.name}.jar"/>
- www-apps/nutch/files/nutch-analyzers.patch
diff -urN ../nutch-dist/conf/nutch-site.xml ./conf/nutch-site.xml
--- ../nutch-dist/conf/nutch-site.xml 2007-05-21 11:22:00.000000000
+0700
+++ ./conf/nutch-site.xml 2007-05-21 11:25:46.000000000 +0700
@@ -23,5 +23,19 @@
<value>/var/lib/nutch/crawl/tmp</value>
<description>Hadoop temporary directory</description>
</property>
-
+
+ <property>
+ <name>plugin.includes</name>
+ <value>protocol-http|urlfilter-regex|parse-(text|html|js)|index-
basic|query-(basic|site|url)|summary-basic|scoring-opic|urlnormalizer-
(pass|regex|basic
)
+|analyzis-(de|en|ru)|language-identifier</value>
+ <description>Regular expression naming plugin directory names to
+ include. Any plugin not matching this expression is excluded.
+ In any case you need at least include the nutch-extensionpoints
plugin. By
+ default Nutch includes crawling just HTML and plain text via
HTTP,
+ and basic indexing and search plugins. In order to use HTTPS
please enable
+ protocol-httpclient, but be aware of possible intermittent
problems with the
+ underlying commons-httpclient library.
+ </description>
+ </property>
+
</configuration>
diff -urN ../nutch-dist/src/plugin/analysis-en/build.xml
./src/plugin/analysis-en/build.xml
--- ../nutch-dist/src/plugin/analysis-en/build.xml 1970-01-01
07:00:00.000000000 +0700
+++ ./src/plugin/analysis-en/build.xml 2007-04-09 18:49:42.000000000
+0700
@@ -0,0 +1,18 @@
+<?xml version="1.0"?>
+
+<project name="analysis-en" default="jar-core">
+
+ <import file="../build-plugin.xml"/>
+
+ <target name="deps-jar">
+ <ant target="jar" inheritall="false" dir="../lib-lucene-
analyzers"/>
+ </target>
+
+ <!-- Add compilation dependencies to classpath -->
+ <path id="plugin.deps">
+ <fileset dir="${nutch.root}/build">
+ <include name="**/lib-lucene-analyzers/*.jar" />
+ </fileset>
+ </path>
+
+</project>
diff -urN ../nutch-dist/src/plugin/analysis-en/plugin.xml
./src/plugin/analysis-en/plugin.xml
--- ../nutch-dist/src/plugin/analysis-en/plugin.xml 1970-01-01
07:00:00.000000000 +0700
+++ ./src/plugin/analysis-en/plugin.xml 2007-04-09 18:49:42.000000000
+0700
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<plugin
+ id="analysis-en"
+ name="English Analysis Plug-in"
+ version="1.0.0"
+ provider-name="org.apache.nutch">
+
+ <runtime>
+ <library name="analysis-en.jar">
+ <export name="*"/>
+ </library>
+ </runtime>
+
+ <requires>
+ <import plugin="nutch-extensionpoints"/>
+ <import plugin="lib-lucene-analyzers"/>
+ </requires>
+
+ <extension id="org.apache.nutch.analysis.en"
+ name="EnglishAnalyzer"
+ point="org.apache.nutch.analysis.NutchAnalyzer">
+
+ <implementation
id="org.apache.nutch.analysis.en.EnglishAnalyzer"
+
class="org.apache.nutch.analysis.en.EnglishAnalyzer">
+ <parameter name="lang" value="en"/>
+ </implementation>
+
+ </extension>
+
+</plugin>
diff -urN ../nutch-dist/src/plugin/analysis-
en/src/java/org/apache/nutch/analysis/en/EnglishAnalyzer.java
./src/plugin/analysis-en/src/java/org/apache/nutch
/analysis/en/EnglishAnalyzer.java
--- ../nutch-dist/src/plugin/analysis-
en/src/java/org/apache/nutch/analysis/en/EnglishAnalyzer.java
1970-01-01 07:00:00.000000000 +0700
+++ ./src/plugin/analysis-
en/src/java/org/apache/nutch/analysis/en/EnglishAnalyzer.java 2007-04-
09 18:49:42.000000000 +0700
@@ -0,0 +1,48 @@
+/**
+ * Copyright 2005 The Apache Software Foundation
+ *
+ * Licensed 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 org.apache.nutch.analysis.en;
+
+// JDK imports
+import java.io.Reader;
+
+// Lucene imports
+import org.apache.lucene.analysis.Analyzer;
+import org.apache.lucene.analysis.TokenStream;
+
+// Nutch imports
+import org.apache.nutch.analysis.NutchAnalyzer;
+
+
+/**
+ * A simple English Analyzer that wraps the Lucene one.
+ * @author Jerome Charron
+ */
+public class EnglishAnalyzer extends NutchAnalyzer {
+
+ private final static Analyzer ANALYZER =
+ new
org.apache.lucene.analysis.snowball.SnowballAnalyzer("English",
org.apache.lucene.analysis.StopAnalyzer.ENGLISH_STOP_WORDS);
+
+
+ /** Creates a new instance of FrenchAnalyzer */
+ public EnglishAnalyzer() { }
+
+
+ public TokenStream tokenStream(String fieldName, Reader reader) {
+ return ANALYZER.tokenStream(fieldName, reader);
+ }
+
+}
diff -urN ../nutch-dist/src/plugin/analysis-ru/build.xml
./src/plugin/analysis-ru/build.xml
--- ../nutch-dist/src/plugin/analysis-ru/build.xml 1970-01-01
07:00:00.000000000 +0700
+++ ./src/plugin/analysis-ru/build.xml 2007-04-09 18:49:42.000000000
+0700
@@ -0,0 +1,19 @@
+<?xml version="1.0"?>
+
+<project name="analysis-ru" default="jar-core">
+
+ <import file="../build-plugin.xml"/>
+
+ <!-- Build compilation dependencies -->
+ <target name="deps-jar">
+ <ant target="jar" inheritall="false" dir="../lib-lucene-
analyzers"/>
+ </target>
+
+ <!-- Add compilation dependencies to classpath -->
+ <path id="plugin.deps">
+ <fileset dir="${nutch.root}/build">
+ <include name="**/lib-lucene-analyzers/*.jar" />
+ </fileset>
+ </path>
+
+</project>
diff -urN ../nutch-dist/src/plugin/analysis-ru/plugin.xml
./src/plugin/analysis-ru/plugin.xml
--- ../nutch-dist/src/plugin/analysis-ru/plugin.xml 1970-01-01
07:00:00.000000000 +0700
+++ ./src/plugin/analysis-ru/plugin.xml 2007-04-09 18:49:42.000000000
+0700
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<plugin
+ id="analysis-ru"
+ name="Russian Analysis Plug-in"
+ version="1.0.0"
+ provider-name="org.apache.nutch">
+
+ <runtime>
+ <library name="analysis-ru.jar">
+ <export name="*"/>
+ </library>
+ </runtime>
+
+ <requires>
+ <import plugin="nutch-extensionpoints"/>
+ <import plugin="lib-lucene-analyzers"/>
+ </requires>
+
+ <extension id="org.apache.nutch.analysis.ru"
+ name="Russian Analyzer"
+ point="org.apache.nutch.analysis.NutchAnalyzer">
+
+ <implementation id="RussianAnalyzer"
+
class="org.apache.nutch.analysis.ru.RussianAnalyzer">
+ <parameter name="lang" value="ru"/>
+ </implementation>
+
+ </extension>
+
+</plugin>
diff -urN ../nutch-dist/src/plugin/analysis-
ru/src/java/org/apache/nutch/analysis/ru/RussianAnalyzer.java
./src/plugin/analysis-ru/src/java/org/apache/nutch
/analysis/ru/RussianAnalyzer.java
--- ../nutch-dist/src/plugin/analysis-
ru/src/java/org/apache/nutch/analysis/ru/RussianAnalyzer.java
1970-01-01 07:00:00.000000000 +0700
+++ ./src/plugin/analysis-
ru/src/java/org/apache/nutch/analysis/ru/RussianAnalyzer.java 2007-04-
09 18:49:42.000000000 +0700
@@ -0,0 +1,48 @@
+/**
+ * Copyright 2005 The Apache Software Foundation
+ *
+ * Licensed 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 org.apache.nutch.analysis.ru;
+
+// JDK imports
+import java.io.Reader;
+
+// Lucene imports
+import org.apache.lucene.analysis.Analyzer;
+import org.apache.lucene.analysis.TokenStream;
+
+// Nutch imports
+import org.apache.nutch.analysis.NutchAnalyzer;
+
+
+/**
+ * A simple Russian Analyzer that wraps the Lucene one.
+ * @author Jerome Charron
+ */
+public class RussianAnalyzer extends NutchAnalyzer {
+
+ private final static Analyzer ANALYZER =
+ new org.apache.lucene.analysis.ru.RussianAnalyzer();
+
+
+ /** Creates a new instance of RussianAnalyzer */
+ public RussianAnalyzer() { }
+
+
+ public TokenStream tokenStream(String fieldName, Reader reader) {
+ return ANALYZER.tokenStream(fieldName, reader);
+ }
+
+}
diff -urN ../nutch-dist/src/plugin/build.xml ./src/plugin/build.xml
--- ../nutch-dist/src/plugin/build.xml 2007-04-03 10:44:25.000000000
+0700
+++ ./src/plugin/build.xml 2007-04-12 16:36:07.000000000 +0700
@@ -26,6 +26,9 @@
+ * See the License for the specific language governing permissions
and
+ * limitations under the License.
+ */
+
+package org.apache.nutch.analysis.ru;
+
+// JDK imports
+import java.io.Reader;
+
+// Lucene imports
+import org.apache.lucene.analysis.Analyzer;
+import org.apache.lucene.analysis.TokenStream;
+
+// Nutch imports
+import org.apache.nutch.analysis.NutchAnalyzer;
+
+
+/**
+ * A simple Russian Analyzer that wraps the Lucene one.
+ * @author Jerome Charron
+ */
+public class RussianAnalyzer extends NutchAnalyzer {
+
+ private final static Analyzer ANALYZER =
+ new org.apache.lucene.analysis.ru.RussianAnalyzer();
+
+
+ /** Creates a new instance of RussianAnalyzer */
+ public RussianAnalyzer() { }
+
+
+ public TokenStream tokenStream(String fieldName, Reader reader) {
+ return ANALYZER.tokenStream(fieldName, reader);
+ }
+
+}
diff -urN ../nutch-dist/src/plugin/build.xml ./src/plugin/build.xml
--- ../nutch-dist/src/plugin/build.xml 2007-04-03 10:44:25.000000000
+0700
+++ ./src/plugin/build.xml 2007-04-12 16:36:07.000000000 +0700
@@ -26,6 +26,9 @@
<!-- Build & deploy all the plugin jars. -->
<!-- ====================================================== -->
<target name="deploy">
+ <ant dir="analysis-de" target="deploy"/>
+ <ant dir="analysis-en" target="deploy"/>
+ <ant dir="analysis-ru" target="deploy"/>
<ant dir="clustering-carrot2" target="deploy"/>
<ant dir="creativecommons" target="deploy"/>
<ant dir="index-basic" target="deploy"/>

- www-apps/nutch/files/nutch-site.xml
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<!-- Put site-specific property overrides in this file. -->

<configuration>

<property>
<name>searcher.dir</name>
<value>/var/lib/nutch/crawldb</value>
<description>
Path to root of crawl. This directory is searched (in
order) for either the file search-servers.txt, containing a list
of
distributed search servers, or the directory "index" containing
merged indexes, or the directory "segments" containing segment
indexes.
</description>
</property>

<!-- hadoop configuration -->


<property>
<name>hadoop.tmp.dir</name>
<value>/var/lib/nutch/crawl/tmp</value>
<description>Hadoop temporary directory</description>
</property>

</configuration>
- www-apps/nutch/files/recrawl
#!/bin/bash

# Nutch recrawl script.


# Based on 0.7.2 script at
http://today.java.net/pub/a/today/2006/02/16/introduction-to-nutch-
2.html
#
# The script merges the new segments all into one segment to prevent
redundant
# data. However, if your crawl/segments directory is becoming very
large, I
# would suggest you delete it completely and generate a new crawl.
This probaly
# needs to be done every 6 months.
#
# Modified by Matthew Holt
# mholt at elon dot edu

print_level() {
echo
echo "-------------------------------------------------------------"
echo "| curent level is $1 |"
echo "-------------------------------------------------------------"
echo
}

if [ -z "${JAVA_HOME}" ]; then
export JAVA_HOME=`/usr/bin/java-config-2 -o`
fi

if [ $# -lt 4 ]; then
echo "Usage: `basename $0` servlet_path crawl_dir depth adddays
[topN]"
echo "servlet_dir - Path of the nutch servlet (full path, ie:
/var/lib/tomcat-5.5/webapps/nutch)"
echo "crawl_dir - Path of the directory the crawl is located in.
(full path, ie: /var/lib/nutch/crawl)"
echo "depth - The link depth from the root page that should be
crawled."
echo "adddays - Advance the clock # of days for fetchlist
generation. [0 for none]"
echo "[topN] - Optional: Selects the top # ranking URLS to be
crawled."
exit 1
fi

tomcat_dir=$1
crawl_dir=$2
depth=$3
adddays=$4

if [ -n "$5" ]; then
topn="-topN $5"
else
topn=""
fi

#Sets the path to bin


nutch_dir=`dirname $0`
# Only change if your crawl subdirectories are named something
different
webdb_dir=$crawl_dir/crawldb
segments_dir=$crawl_dir/segments
linkdb_dir=$crawl_dir/linkdb
index_dir=$crawl_dir/index

# The generate/fetch/update cycle


for ((i=1; i <= depth ; i++)); do
print_level $i
$nutch_dir/nutch generate $webdb_dir $segments_dir $topn -adddays
$adddays
segment=`ls -d $segments_dir/* | tail -1`
$nutch_dir/nutch fetch2 $segment
#$nutch_dir/nutch parse $segment
$nutch_dir/nutch updatedb $webdb_dir $segment
done

# Merge segments and cleanup unused segments


mergesegs_dir=$crawl_dir/mergesegs_dir
$nutch_dir/nutch mergesegs $mergesegs_dir -dir $segments_dir

for segment in `ls -d $segments_dir/* | tail -$depth`


do
echo "Removing Temporary Segment: $segment"
rm -rf $segment
done

cp -R $mergesegs_dir/* $segments_dir
rm -rf $mergesegs_dir

# Update segments
$nutch_dir/nutch invertlinks $linkdb_dir -dir $segments_dir

# Index segments
new_indexes=$crawl_dir/newindexes
segment=`ls -d $segments_dir/* | tail -1`
$nutch_dir/nutch index $new_indexes $webdb_dir $linkdb_dir $segment

# De-duplicate indexes
$nutch_dir/nutch dedup $new_indexes

# Merge indexes
$nutch_dir/nutch merge $index_dir $new_indexes

# remove merge-output if possible


if [ -d $index_dir/merge-output ]; then
mv $index_dir/merge-output $index_dir/../
rm -rf $index_dir
mv $crawl_dir/merge-output $index_dir
fi

# Tell Tomcat to reload index


touch $tomcat_dir/WEB-INF/web.xml

# Clean up
rm -rf $new_indexes

echo "FINISHED: Recrawl completed. To conserve disk space, I would


suggest"
echo " that the crawl directory be deleted once every 6 months (or
more"
echo " frequent depending on disk constraints) and a new crawl
generated."
Приложение 2: Параметры конфигурации Nutch
Таблица 1. Настройка протокола HTTP
Имя Описание свойства Значение
свойства по
умолчанию
http.agent. Имя робота, указываемое в заголовке User-Agent HTTP
name запроса. В значении этого свойства можно указать название
организации записанное латиницей. Например TucsrBot.
Должен быть заполнен. В противном случае поисковый
робот не будет запускаться.
http.robots Имена поисковых роботов, записи о которых в файле *
.agents robots.txt будут учитываться при обходе сайта,
перечисленные через запятую. В конце должен быть указан
символ *, например: TucsrBot,*.
http.robots Некоторые серверы возвращают статус 403 (Доступ запрещён) true
.403.allow если /robots.txt не существует. Тем не менее это может
означать что робот позволено посещать страницы сайта. Если
установлено значение false, то сайты с такой реакцией на
запрос /robots.txt будут рассматриваться как запрещённые.
http.agent. Дополнительное описание робота, указываемое в заголовке
description User-Agent HTTP запроса. Оно будет указано в круглых
скобках после имени робота.
http.agent. Адрес электронной почты, размещаемый в заголовках From и
email User-Agent запроса HTTP. Хорошей практикой является
искажение этого адреса (например ilab at tusur dot ru) для
предотвращения нежелательных рассылок электронной почты.
http.agent. Версия, размещаемая в заголовке User-Agent. Nutch-0.9
version
http.timeou Время тайм-аута сети, в миллисекундах. 10000
t
http.max.de Количество попыток получения нитью выполнения страницы. 100
lays Каждый раз, когда нить выполнения видит что хост занят она
ждёт время, указанное в fetcher.server.delay. После
указанного в http.max.delays количества попыток, нить
прекращает попытки получения страницы.
http.conten Предел длины содержимого в байтах. Если это значение 65536
t.limit неотрицательное (>=0), то содержимое большее
http.content.limit будет отсечено, в противном случае
отсечение производиться не будет.
http.proxy. Адрес прокси сервера. Если значение не указано, то прокси
host сервер использоваться не будет.
http.proxy. Порт прокси сервера.
port
http.verbos Если значение true, то в журналы HTTP будет записано больше false
e информации.
Имя Описание свойства Значение
свойства по
умолчанию
http.redire Максимальное количество переназначений, которым будет 0
ct.max следовать выборщик при попытке получения страницы.
Если значение неположительное (<=0), выборщик не
будет сразу же следовать перенаправленному URL, а
запишет перенаправленный URL для последующего
получения.
http.useHtt Примечание: на данный момент работает только с false
p11 использованием подключаемого модуля protocol-
httpclient. Если значение true, то используется
протокол HTTP 1.1, иначе используется протокол HTTP
1.0.

Таблица 2. Свойства, конфигурирующие протокол FTP


Имя Описание свойства Значение
свойства по
умолчанию
ftp.usernam Имя пользователя, используемое при соединении с ftp anonymous
e сервером.
ftp.passwor Пароль пользователя, используемый при соединении с ftp anonymous@
d сервером. example
.com
ftp.content Предел длины содержимого в байтах. Если это значение 65536
.limit неотрицательное (>=0), то содержимое большее
ftp.content.limit будет отсечено, в противном случае
отсечение производиться не будет.
Предостережение: классический RFC для ftp серверов
не определяет передачу по частям, поэтому некоторые
ftp серверы некорректно обрабатывают клиентские
запросы close-down, нужные для определения длины
содержимого. Данная реализация пытается наилучшим
образом обработать такие ситуации.
ftp.timeout Тайм-аут ftp клиента, в миллисекундах.. 60000
См. также ftp.keep.connection.
ftp.server. Оценка таймаута ftp сервера, в миллисекундах. 100000
timeout Для многих ftp-серверов обычно достаточно 120000
миллисекунд.
Однако лучше использовать меньшие значения. Это
значение используется в совокупности с ftp.timeout,
для решения вопроса о том, удалить ли
(аннигилировать) текущую инстанцию ftp клиента, или
запустить новую инстанцию. Это необходимо так как
нить сборщика может быть неспособна получить
следующий результат из очереди (из-за незанятости)
перед тем как ftp клиент завершит соединение с
сервером по тайм-ауту. Используется только если
значение ftp.keep.connection true.
Имя Описание свойства Значение
свойства по
умолчанию
ftp.keep.co Использование хранимых ftp соединений. Полезно при false
nnection повторных обходах поисковым роботом ftp серверов.
Когда значение установлено в true, соединение
сохраняется открытым, что позволяет уменьшить
трафик между поисковым роботом и ftp хостом, а
также ускорить получение результатов от ftp сервера.
Если значение установлено в true, необходимо
убедиться в том, что:
1. ftp.timeout меньше ftp.server.timeout
2. ftp.timeout больше чем (fetcher.threads.fetch *
fetcher.server.delay)
Иначе будет слишком много сообщений "delete client
because idled too long" в журнальных файлах.
ftp.follow. Журналирование диалога между клиентом и ftp-сервером. false
talk Полезно при отладке

Таблица 3. Свойства, конфигурирующие базу данных ссылок


Имя Описание свойства Значение
свойства по
умолчанию
db.default. Количество дней по умолчанию между повторным обходом 30
fetch.inter страницы.
val
db.update.a Если значение установлено в true, при обновлении базы новые true
dditions.al найденные URL будут добавляться, иначе (установлено
lowed
значение false) существующие в базе данных URL будут
обновлены, а новые URL добавляться не будут.
db.ignore.i Если значение установлено в true, при добавлении новых true
nternal.lin ссылок на страницу, ссылки с этого же сайта игнорируются.
ks
Это эффективный путь ограничения размера базы
данных ссылок, сохраняются только
высококачественные ссылки.
db.ignore.e Если значение установлено в true, ссылки ведущие за пределы false
xternal.lin текущего сайта будут проигнорированы.
ks
Это эффективный путь ограничить робота набором
первоначальных сайтов без создания сложных
фильтров URL1.
db.score.in Множитель рейтинга для новых страниц добавленных через 1.0
jected ссылки с других хостов относительно рейтинга ссылающейся
страницы. Подключаемые модули начисления рейтинга могут
использовать это значение для воздействия на рейтинги
внешних ссылок.

1 В текущей версии Nutch имеется ошибка, вследствие которой робот при при наличии URL, пересылающих
на внешние сайты может посещать внешние ссылки. Обходной путь – установка http.redirect.max=0.
Имя Описание свойства Значение
свойства по
умолчанию
db.score.li Множитель рейтинга для страниц, добавленных через ссылки с 1.0
nk.internal этого же хоста относительно рейтинга ссылающейся страницы.
Подключаемые модули начисления рейтинга могут
использовать это значение для воздействия на рейтинги
внутренних ссылок.
db.score.co Значение рейтинга зачисляемое только что обнаруженным false
unt.filtere страницам вычисляется как результат деления рейтинга
d
текущей страницы на количество ссылок найденных на
странице. Если значение db.score.count.filtered false то
рейтинг страницы будет делиться только на количество ссылок,
прошедших фильтры URL. Если значение true, то будут
учтены все ссылки.
db.max.inli Максимальное количество страниц ссылающихся на URL 10000
nks которое будет сохранено в базе данных ссылок. Если подсчёт
обратного количества ссылающихся страниц больше этого
значения, то будут сохранены только первые db.max.inlinks
ссылок, а остальные будут отброшены.
db.max.outl Максимальное количество ссылок на странице, которое будет 100
inks.per.pa обработано. Если значение неотрицательное (>=0), то будут
ge
обработаны только db.max.outlinks.per.page, в противном
случае будут обработаны все ссылки.
db.max.anch Максимальное количество символов в якоре. 100
or.length
db.fetch.re Максимальное количество попыток выборки содержимого 3
try.max страницы.
db.signatur Реализация получения сигнатуры страницы. Сигнатура org.apache
e.class созданная при помощи этой реализации будет использоваться .nutch.cra
wl.MD5Sign
для определения дублирующих страниц. ature
db.signatur Минимальная длина токена который будет включён в 2
e.text_prof сигнатуру.
ile.min_tok
en_len
db.signatur Частоты токенов в профиле будут округлены вниз до 0.01
e.text_prof произведения QUANT = (int)(QUANT_RATE * maxFreq), где
ile.quant_r
ate maxFreq – максимальная частота встречаемости токена. Если
maxFreq > 1 то QUANT будет равен как минимум 2, это означает
что для длинных текстов токены с частотой 1 будут
пропущены.2

2 Profile frequencies will be rounded down to a multiple of QUANT = (int)(QUANT_RATE * maxFreq), where maxFreq
is a maximum token frequency. If maxFreq > 1 then QUANT will be at least 2, which means that for longer texts
tokens with frequency 1 will always be discarded.
Таблица 4. Свойства, конфигурирующие генерацию
Имя Описание свойства Значение
свойства по
умолчанию
generate.ma Максимальное количество URL на хост для одного списка -1
x.per.host выборки. -1 если количество URL неограниченно.
generate.ma Если false, одинаковые имена хоста будут подсчитаны. Если false
x.per.host. true, то по IP-адресу хоста будет получен DNS адрес и будут
by.ip
подсчитываться те же IP-адреса.
Внимание: Если значение переменной установлено в
true, то генератор будет создавать много частых
запросы DNS-поиска. Это может стать причиной атаки
типа «отказ в обслуживании» на удалённые DNS
серверы, а также увеличить объём трафика и время
ожидания. По этим причинам эта опция подразумевает
использование локального кэширующего DNS.
generate.up Для окружений с высокой степенью параллелизма, где false
date.crawld различные циклы генерирования/выборки/обновления могут
b
перекрываться, установленное в true значение гарантирует что
генератор будет создавать различные списки выборки, ценой
запуска дополнительных задач по обновлению базы робота.
Если значение переменной false, то два одновременно
запущенных генератора будут генерировать идентичные списки
выборки.

Таблица 5. Свойства, конфигурирующие сборщика


Имя Описание свойства Значение
свойства по
умолчанию
fetcher.ser Задержка в секундах между удачными запросами к одному и 5.0
ver.delay тому же серверу.
fetcher.max Если поле Crawl-Delay в файле robots.txt установлено в 30
.crawl.dela значение, большее этого (в секундах) выборщик пропустит
y
страницу, сгенерировав отчёт об ошибке. Если установлено
значение -1 то выборщик никогда не будет пропускать
страницы, независимо от того, какое значение задержки
указано в поле Crawl-Delay файла robots.txt.
fetcher.thr Количество нитей выборщика. Это значение также определяет 10
eads.fetch максимально возможное количество запросов за раз (каждая
нить выборщика управляет одним соединением).
fetcher.thr Максимальное количество нитей, которые могут обратиться к 1
eads.per.ho одному и тому же серверу.
st
Имя Описание свойства Значение
свойства по
умолчанию
fetcher.thr Если установлено значение true, то сборщик будет считать true
eads.per.ho нити по IP-адресам. Если установлено значение false, то будет
st.by.ip
использован подсчёт по DNS именам.
Примечание: должно быть установлено то же значение
что и в generate.max.per.host.by.ip - значения по
умолчанию различаются только по причинам обратной
совместимости.
fetcher.ver Если значение true, то в журналы сборщика будет записано false
bose больше информации.
fetcher.par Если значение true, то сборщик будет анализировать true
se содержимое.
fetcher.sto Если значение true, то сборщик будет сохранять содержимое. true
re.content

Таблица 6. Свойства, конфигурирующие индексатор


Имя Описание свойства Значение по
свойства умолчанию
indexer.sco Определяет степень для подсчёта рейтинга ссылок. Каждая 0.5
re.power повышение рейтинга страницы вычисляется как
рейтингстепеньРейтинга где рейтинг – это рейтинг, начисленный при
анализе ссылок и степеньРейтинга – это значение параметра.
Так как это значение прописывается в поисковый индекс, то
оно не может быть изменено «на лету», страницы должны быть
переиндексированы для получения эффекта.
indexer.max Максимальное количество идексируемых символов в заголовке 100
.title.leng документа.
th
indexer.max Максимальное количество слов, которое будет 10000
.tokens индексироваться в одном поле документа. Это значение
ограничивает количество памяти, используемое для
индексации, поэтому коллекции с большими полями не будут
разрушать процесс индексирования.
Примечание: это эффективный путь усечения больших
документов, исключая слова встречаемые в документе
в дальнейшем. Если известно, что исходные документы
большие, необходимо убедиться в том, что указано
приемлемое значение. Если значение переменной
2147483647 то использование памяти сборщиком будет
ограничено только свободной памятью операционной
системы, и в процессе индексирования могут появиться
ошибки OutOfMemoryError, связанные с нехваткой
памяти.
Имя Описание свойства Значение по
свойства умолчанию
indexer.mer Коэффициент, определяющий частоту слияния сегментов 50
geFactor Lucene. Значение не должно быть меньше 2. Большие значения
увеличивают скорость индексации, однако приводят к
увеличению использования оперативной памяти и увеличивают
количество открытых файловых дескрипторов (что может
привести к появлению ошибок "Too many open files[Слишком
много открытых файлов]").
Примечание: под "сегментом" здесь подразумеваются
низкоуровневые модули данных Lucene не имеющие
ничего общего с сегментами Nutch.
indexer.min Значение этого параметра определяет минимальное количество 50
MergeDocs документов Lucene, буферизуемых в оперативной памяти
между слияниями сегментов Lucene. Большие значения
увеличивают скорость индексации и увеличивают
использование оперативной памяти.
indexer.max Значение этого параметра определяет максимальное 2147483647
MergeDocs количество документов Lucene которые будут объединены в
новый сегмент Lucene. Большие значения увеличивают
пакетную скорость индексирования и уменьшают количество
сегментов Lucene (что, в свою очередь, уменьшает количество
открытых файловых дескрипторов); тем не менее это также
уменьшает пошаговую производительность индексирования.
indexer.ter Значение этого параметра определяет долю слов, которую 128
mIndexInter Lucene будет сохранять в памяти при поиске для облегчения
val
случайного доступа. Меньшие значения приводят к
использованию большего количества оперативной памяти
однако могут привести к ускорению поиска. Большие значения
приводят к меньшему использованию оперативной памяти
однако могут привести к замедлению поиска.

Таблица 7. Свойства, конфигурирующие подключаемый модуль indexingfilter


Имя Описание свойства Значение по
свойства умолчанию
indexingfil Порядок, в котором будут применяться фильтры
ter.order индексирования. Если значение этого поля не задано, то будут
использованы все доступные фильтры индексации
(определённые свойствами plugin.includes и
plugin.excludes) загружаемые и применяемые в порядке,
определённом системой. Если значение поля не пустое, то
будут загружаться и применяться только именованные
фильтры в указанном порядке. Например, если значение
свойства определено как:
org.apache.nutch.indexer.basic.BasicIndexingFilter
org.apache.nutch.indexer.more.MoreIndexingFilter,
то BasicIndexingFilter будет применён первым, а
MoreIndexingFilter вторым.
Примечание: порядок применения фильтров может
оказывать воздействие на результаты если один фильтр
зависит от результатов работы другого фильтра
Таблица 8. Настройки анализатора
Имя Описание свойства Значение по
свойства умолчанию
analysis.co Имя файла, содержащего список часто встречающихся слов, common-
mmon.terms. который должен быть индексирован по n-граммам. terms.utf8
file

Таблица 9. Настройки поиска


Имя Описание свойства Значение по
свойства умолчанию
searcher.di Путь до директории, являющейся корнем поисковой базы crawl
r данных . Этот путь ищется (по порядку) указанному в файле
search-servers.txt, содержащему список распределённых
поисковых серверов или папки "index" содержащие
объединенённые индексы, или папки "segments" содержащие
индексные сегменты.
searcher.fi Максимальное количество фильтров в кэше. Фильтры могут 16
lter.cache. ускорить некоторые основанные на полях (таких как язык, тип
size
документа, дата индексации и т.д.) запросы. Каждый фильтр
требует 1 бит оперативной памяти. Таким образом, для
индекса содержащего 10 миллионов страниц при размере кэша
16 (расходуется 2 байта на страницу) суммарный объём
выделенной кэш памяти составит 20 мегабайт.
searcher.fi Кэш фильтров используется когда слово совпадает с большой 0.05
lter.cache. долей страниц. Например при пороге 0,05 и 10 миллионах
threshold
индексированных страниц слово должно встречаться более чем
в 1/20 (5% или 50.000 при 10 миллионах индексированных)
страниц. Таким образом, если проиндексировано 50% страниц
на русском языке и 2% на финском при пороге 0,05 поиск по
запросу lang:ru будет использовать кэш фильтров а поиск по
запросу lang:fi будет выдавать все 20.000 финских
документов.
searcher.ho Коэффициент, используемый для определения количества 2.0
stgrouping. первоначально выбирающихся хитов перед тем как будет
rawhits.fac
tor
сделана группировка по хостам (сколько хитов на сайт будет в
выдаче).
searcher.su Количество слов показываемых перед и после совпадений в 5
mmary.conte кратком изложении найденного совпадения.
xt
searcher.su Количество слов для показа в кратком изложении найденного 20
mmary.lengt совпадения.
h
searcher.ma Если это значение положительно (>0) поиск будет остановлен -1
x.hits после того как будут найдено указанное количество хитов.
Установка достаточно маленьких (например 1000)
значений может существенно ускорить поиск. При
использовании сортированного индекса качество хитов
будет достаточно низким.
Имя Описание свойства Значение по
свойства умолчанию
searcher.ma Если это значение положительно (>0) то для каждого -1
x.time.tick выполнения запроса устанавливается лимит времени равный
_count
произведению searcher.max.time.tick_count и
searcher.max.time.tick_length. Если время поиска истекло,
то будет выдача будет неполной, а общее количество хитов
будет приблизительным.
searcher.ma Количество миллисекунд в одном тике. Большие значения 200
x.time.tick уменьшают степень детализации (точность) счётчика времени
_length
и. Меньшие значения приводят к большим накладным
расходам.

Таблица 10. Настройки нормализаторов3 URL.


Имя Описание свойства Значение по
свойства умолчанию
urlnormaliz Порядок, в котором будут запускаться нормализаторы URL. org.apache.
er.order Если какой-либо нормализатор URL не активирован, то он nutch.net.u
rlnormalize
будет пропущен. Если какие-либо нормализаторы не находятся r.basic.Bas
в списке и активизированы, то они будут применяться в icURLNormal
случайном порядке после того как будут распознаны в качестве izer
активных. org.apache.
nutch.net.u
rlnormalize
r.regex.Reg
exURLNormal
izer
urlnormaliz Имя файла, используемого классом the RegexUrlNormalizer. regex-
er.regex.fi normalize.x
le ml
urlnormaliz Количество циклов преобразований URL для получения 1
er.loop.cou гарантии того, что все преобразования выполнены.
nt

Таблица 11. Свойства, конфигурирующие MIME-типы


mime.types. Имя файла, содержащего расширения файлов и магические mime-
file последовательности [magic sequence] для определения MIME- types.xml
типа содержимого.
mime.type.m Определяет, используются ли магические последовательности true
agic для определения типа файла.

Таблица 12. Свойства, конфигурирующие плагины


Имя Описание свойства Значение по
свойства умолчанию
plugin.fold Директории, где размещаются подключаемые модули. Каждый plugins
ers элемент может быть как абсолютным, так и относительным
путём. Если указан относительный путь, то он ищется
относительно путей, указанных в переменной CLASSPATH.
3 Нормализаторы приводят URL к нормальной форме. Например, если в URL распознаётся идентификатор
сессии пользователя, то он будет исключён в выдаче.
Имя Описание свойства Значение по
свойства умолчанию
plugin.auto Определяет, будут ли неактивированные в plugin.includes и true
-activation plugin.excludes подключаемые модули загружаться, если они
нужны каким либо активированным подключаемым модулям.
plugin.incl Регулярное выражение для описания директорий protocol-
udes подключаемых модулей. Любой подключаемый модуль, не http|
urlfilter-
удовлетворяющий этому выражению будет исключен. В regex|
любом случае необходимо подключить модуль nutch- parse-
extensionpoints. По умолчанию Nutch включает только (text|html|
роботов, разбирающих HTML и текстовые документы js)|index-
посещающие сайты только по протоколу HTTP, а также basic|
query-
базовые модули индексации и поиска. Для посещений (basic|
роботом сайтов по протоколу HTTPS необходимо подключить site|url)|
модуль protocol-httpclient, однако могут появиться summary-
переменные проблемы, связанные с лежащей в онове этого basic|
модуля библиотекой commons-httpclient. scoring-
opic|
urlnormaliz
er-(pass|
regex|
basic)
plugin.excl Регулярное выражение для описания директорий исключаемых
udes модулей.

Таблица 13. Настройка синтаксического анализатора


Имя Описание свойства Значение по
свойства умолчанию
parse.plugi Имя файла, ассоциирующего синтаксические анализаторы с parse-
n.file типами содержимого. plugins.xml

parser.char Кодировка символов, используемая в случае невозможности её windows-


acter.encod определения. 1252
ing.default
parser.cach Если сайт (или страница) устанавливает метатэги поискового content
ing.forbidd робота, запрещающие показывать содержимое, каким образом
en.policy
обрабатывать это правило. На данный момент распознаются
три ключевых слова: "none" игнорирует все директивы
"noarchive"; "content" запрещает показывать содержимое, но
показывает краткое изложение найденного соответствия; "all"
запрещает показ как содержимого, так и краткого изложения
найденного соответствия.
parser.html Реализация синтаксического анализатора HTML. На данный neko
.impl момент обрабатываются два ключевых слова: "neko"
соответствует реализации NekoHTML, "tagsoup" соответствует
реализации TagSoup.
Имя Описание свойства Значение по
свойства умолчанию
parser.html Если значение параметра установлено в true, синтаксический false
.form.use_a анализатор HTML будет собирать URL из атрибута action
ction
HTML форм. Это может привести к нежелательному
поведению (отправке пустых форм на следующем цикле сбора
информации)This may к lead to undesirable behavior. Если
значение параметра установлено в false, атрибут action
HTML форм будет игнорироваться.

Таблица 14. Настройки подключаемых модулей фильтрования URL.


Имя Описание свойства Значение по
свойства умолчанию
urlfilter.r Имя файла, содержащего регулярные выражения, regex-
egex.file используемые подключаемым модулем urlfilter-regex urlfilter.tx
t
(RegexURLFilter).
urlfilter.a Имя файла, содержащего регулярные выражения, automaton-
utomaton.fi используемые подключаемым модулем urlfilter-automaton urlfilter.tx
le t
(AutomatonURLFilter).
urlfilter.p Имя файла, содержащего префиксы URL, используемые prefix-
refix.file подключаемым модулем urlfilter-prefix urlfilter.tx
t
(PrefixURLFilter).
urlfilter.s Имя файла, содержащего суффиксы URL, используемые suffix-
uffix.file подключаемым модулем urlfilter-suffix urlfilter.tx
t
(SuffixURLFilter).
urlfilter.o Порядок, в котором будут применяться фильтры URL. Если
rder значение этого поля не установлено, будут загружаться все
доступные (см. plugin.includes и plugin.excludes)
фильтры URL и применяться в порядке, определённом
системой. Если значение этого поля установлено, то будут
применяться только указанные фильтры в указанном порядке.
Например, если установлено значение:
org.apache.nutch.urlfilter.regex.RegexURLFilter
org.apache.nutch.urlfilter.prefix.PrefixURLFilter,
то сначала будет применён RegexURLFilter, а после него
будет применён PrefixURLFilter.
Так как фильтры применяются с логическим условием
И, то порядок фильтрования не оказывает влияния на
конечный результат. Однако порядок применения
может оказывать воздействие на производительность,
в зависимости от относительной трудоёмкости
каждого фильтра.
Таблица 15. Настройки подключаемых модулей фильтрования URL по рейтингу.
Имя Описание свойства Значение по
свойства умолчанию
scoring.fil Порядок, в котором будут применяться рейтинговые фильтры.
ter.order Если значение этого свойства не задано, то все доступные
фильтры будут применяться в порядке, определяемом
системой. Если значение этого поля установлено, то будут
применяться только указанные фильтры в указанном порядке.

Таблица 16. Настройки кластерного расширения.


Имя Описание свойства Значение по
свойства умолчанию
extension.c Количество кратких описаний хитов, возвращаемых узлом 100
lustering.h кластера.
its-to-
cluster
Если кластерное расширение включено и результаты
поиска распределены по кластеру.
extension.c Имя используемого кластерного расширения. Если значение
lustering.e поля не установлено, будет использоваться первое доступное
xtension-
name
расширение. Здесь имя является ссылкой на атрибут id тега
implementation в XML файле, описывающем подключаемые
модули.

Таблица 17. Свойства, конфигурирующие расширение онтологии.


Имя Описание свойства Значение по
свойства умолчанию
extension.o Имя используемого расширения онтологии. Если значение
ntology.ext поля не установлено, будет использоваться первое доступное
ension-name
расширение. Здесь имя является ссылкой на атрибут id тега
implementation в XML файле, описывающем подключаемые
модули.
extension.o Список URL owl-файлов, разделённых пробелами, например
ntology.url http://www.example.com/ontology/time.owl
s http://www.example.com/ontology/space.owl
http://www.example.com/ontology/wine.owl
или
file:/ontology/time.owl
file:/ontology/space.owl
file:/ontology/wine.owl
Каждый URL должен существовать. По умолчанию
owl-файлы не заданы, поэтому улучшения запроса,
основанные на онтологии игнорируется.

Таблица 18. Настройки модуля query-basic.


Имя Описание свойства Значение по
свойства умолчанию
query.url.b Множитель для поля url в запросе Lucene. 4.0
oost
query.ancho Множитель для поля anchor в запросе Lucene. 2.0
r.boost
Имя Описание свойства Значение по
свойства умолчанию
query.title Множитель для поля title в запросе Lucene. 1.5
.boost
query.host. Множитель для поля host в запросе Lucene. 2.0
boost
query.phras Множитель для фразы в запросе Lucene. Умножается на 1.0
e.boost множители для каждого поля, в котором находится
соответствие.

Таблица 19. Настройки модуля creative-commons.


Имя Описание свойства Значение по
свойства умолчанию
query.cc.bo Множитель для поля cc в запросе Lucene. 0.0
ost

Таблица 20. Настройки модуля query-more.


Имя Описание свойства Значение по
свойства умолчанию
query.type. Множитель для поля type в запросе Lucene. 0.0
boost

Таблица 21. Настройки модуля query-site.


Имя Описание свойства Значение по
свойства умолчанию
query.site. Множитель для поля site в запросе Lucene. 0.0
boost

Таблица 22. Настройки модуля microformats-reltag.


Имя Описание свойства Значение по
свойства умолчанию
query.tag.b Множитель для поля tag в запросе Lucene. 1.0
oost

Таблица 23. Настройки модуля language-identifier.


Имя Описание свойства Значение по
свойства умолчанию
lang.ngram. Минимальный размер n-грамм, используемый для 1
min.length определения языка (значение должно быть от 1 до
lang.ngram.max.length).
Большее расстояние между lang.ngram.min.length и
lang.ngram.max.length улучшает идентификацию,
однако замедляет процесс идентификации
Имя Описание свойства Значение по
свойства умолчанию
lang.ngram. Минимальный размер n-грамм, используемый для 4
max.length определения языка (значение должно быть от
lang.ngram.min.length до 4).
Большее расстояние между lang.ngram.min.length и
lang.ngram.max.length улучшает идентификацию,
однако замедляет процесс идентификации
lang.analyz Максимальное количество байт данных, используемых для 2048
e.max.lengt идентификации языка (0 означает анализ всего содержимого).
h
Большие значения улучшают анализ, но
увеличивается время потраченное на анализ.
query.lang. Множитель для поля lang в запросе Lucene. 0.0
boost
Приложение 3: Пример конфигурации Nutch

- Файл /etc/nutch/nutch-site.xml
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!--
Данная конфигурация рассчитана на индексирование страниц
для ограниченном набора сайтов (интранет) - веб-пространства
ТУСУР
-->

<configuration>

<!-- Настройка протокола HTTP -->


<property>
<name>http.agent.name</name>
<value>TusurBot</value>
<description>
Имя поискового робота.
</description>
</property>

<property>
<name>http.robots.agents</name>
<value>TusurBot,*</value>
<description>
Имена поисковых роботов, записи о которых в файле robots.txt
будут учитываться при обходе сайта.
</description>
</property>

<property>
<name>http.agent.description</name>
<value>search bot of http://www.tusur.ru</value>
<description>
Дополнительное описание поискового робота.
</description>
</property>

<property>
<name>http.agent.email</name>
<value>ilab at tusur dot ru</value>
<description>
Адрес электронной почты, указываемый в дополнительной
информации.
</description>
</property>

<property>
<name>http.agent.version</name>
<value>TusurBot-1.0</value>
<description>
Версия робота.
</description>
</property>

<property>
<name>http.content.limit</name>
<value>10485760</value>
<description>
Максимальный размер документа устанавливается в 10Мб для того,
чтобы индексировать большие файлы (обычно ppt).
</description>
</property>

<property>
<name>http.useHttp11</name>
<value>true</value>
<description>
Включаем работу по протоколу HTTP 1.1, дополнительно нужно
подключить модуль protocol-httpclient.
</description>
</property>

<!-- Свойства, конфигурирующие базу данных ссылок -->

<property>
<name>db.default.fetch.interval</name>
<value>1</value>
<description>
Так как используется поиск по интранет, то количество дней между
повторными обходами можно установить достаточно маленьким.
</description>
</property>

<property>
<name>db.ignore.external.links</name>
<value>true</value>
<description>
Поисковый робот не будет уходить за пределы первоначально.
добавленных сайтов
</description>
</property>

<property>
<name>db.max.outlinks.per.page</name>
<value>-1</value>
<description>
Будут обрабатываться все ссылки с данной страницы.
</description>
</property>

<property>
<name>db.max.anchor.length</name>
<value>1024</value>
<description>
На сайтах ТУСУР очень часто используются длинные тесты ссылок.
</description>
</property>

<!-- Свойства, конфигурирующие сборщика -->

<property>
<name>fetcher.server.delay</name>
<value>0.1</value>
<description>
Устанавливаем низкое значение для того, чтобы обновление базы
данных происходило достаточно быстро.
</description>
</property>

<property>
<name>fetcher.max.crawl.delay</name>
<value>5</value>
<description>
Сайты, устанавливающие период ожидания между посещениями
больший 5 секунд не будут индексироваться.
</description>
</property>

<property>
<name>fetcher.threads.per.host</name>
<value>3</value>
<description>
Так как сайты ТУСУР размещаются на достаточно производительных
серверах, увеличим нагрузку до трёх нитей на сайт.
</description>
</property>

<property>
<name>fetcher.threads.per.host.by.ip</name>
<value>false</value>
<description>
Подсчёт нитей будет вестись по DNS именам.
</description>
</property>

<property>
<name>indexer.max.title.length</name>
<value>512</value>
<description>
В русском языке слова обычно длиннее, чем в английском, поэтому
увеличим значение по умолчанию.
</description>
</property>

<property>
<name>indexer.max.tokens</name>
<value>30000</value>
<description>
Некоторые документы, размещаемые на сайтах достаточно большие.
</description>
</property>

<!-- Настройки поиска -->


<property>
<name>searcher.dir</name>
<value>/var/lib/nutch/crawl</value>
<description>
Используем абсолютный путь, чтобы веб-приложение могло получить
доступ к поисковой базе.
</description>
</property>

<property>
<name>searcher.hostgrouping.rawhits.factor</name>
<value>1</value>
<description>
В выдаче будет только один результат на сайт.
</description>
</property>

<property>
<name>searcher.max.hits</name>
<value>1000</value>
<description>
Максимальный размер выдачи - 1000 хитов.
</description>
</property>
<property>
<name>searcher.max.time.tick_count</name>
<value>5</value>
<description>
Поисковый должен выдавать ответ максимально быстро. В данном
случае максимальная задержка перед выдачей составит
5 * 200 = 1000 мс, или 1 секунду.
</description>
</property>

<property>
<name>plugin.includes</name>
<value>protocol-httpclient|urlfilter-(prefix|suffix)|parse-(text|
html|oo|pdf|zip|ms(excel|powerpoint|word))|index-(basic|more)|query-
(basic|more|site|url)|summary-(basic|lucene)|scoring-opic|
urlnormalizer-(regex|basic)|analysis-(en|ru)|language-
identifier</value>
<description>
Краткое описание подключаемых модулей:
protocol-httpclient
используется для доступа к сайтам по протоколу HTTP 1.1;
urlfilter-prefix
используется для отбрасывания URL по префиксам ссылок
(фильтруются протоколы);
urlfilter-suffix
используется для отбрасывания URL по суффиксам ссылок
(расширения файлов);
parse-text
синтаксический анализатор файлов текстового формата;
parse-html
синтаксический анализатор файлов формата HTML;
parse-oo
синтаксический анализатор файлов формата OpenOffice;
parse-zip
синтаксический анализатор файлов формата ZIP - нужен для
индексирования внутреннего содержимого файлов, упакованных
алгоритмом zip;
parse-msexel
синтаксический анализатор файлов формата Microsoft Excel;
parse-mspowerpoint
синтаксический анализатор файлов формата Microsoft Powerpoint;
parse-msword
синтаксический анализатор файлов формата Microsoft Word;
index-basic
добавляет в индекс основные поля документов: заголовок,
содержимое, URL;
index-more
добавляет в индекс дополнительные поля документов: дату,
размер содержимого, тип содержимого;
query-basic
выполнение запросов по содержимому, URL;
query-more
выполнение запросов по дате, длине содержимого, типу
содержимого;
query-url
выполнение запросов по URL;
summary-basic
вывод краткого изложения;
summary-lucene
вывод краткого изложения c расширенными возможностями;
scoring-opic
вычисление рейтинга страницы по алгоритму OPIC
[www2003.org/cdrom/papers/refereed/p007/p7-abiteboul.html];
urlnormalizer-regex
расширенная нормализация URL, в базовой конфигурации удаляет
идентификаторы сессий и бесконечные ссылки (типа xx/xx/xx/..);
urlnormalizer-basic
нормализация URL путём удаления части пути типа xx/../;
analysis-en
морфологический анализатор русского языка, основанный на
алгоритме стеммига Портера;
analysis-ru
морфологический анализатор английского языка, основанный на
алгоритме стеммига Портера;
language-identifier
определение языка на основе результатов анализа содержимого.
</description>
</property>

<!-- Настройка синтаксического анализатора -->


<property>
<name>parser.character.encoding.default</name>
<value>windows-1251</value>
<description>
Кодировка символов, используемая в случае невозможности её
определения.
</description>
</property>

<!-- Настройки подключаемых модулей фильтрования URL. -->


<property>
<name>urlfilter.order</name>
<value>
org.apache.nutch.urlfilter.prefix.PrefixURLFilter
org.apache.nutch.urlfilter.suffix.SuffixURLFilter
</value>
<description>
Сначала используем urlfilter-prefix.
</description>
</property>

<!-- Настройки модуля language-identifier. -->


<property>
<name>lang.analyze.max.length</name>
<value>0</value>
<description>
Для более качественных результатов определения языка
анализируется всё содержимое документа.
</description>
</property>

<!-- Настройки hadoop. -->


<property>
<name>hadoop.tmp.dir</name>
<value>/var/lib/nutch/crawl/tmp</value>
<description>
Директория, в которой Hadoop будет сохранять временные файлы.
</description>
</property>
</configuration>

- Файл /etc/nutch/prefix-urlfilter.txt
# Каждая незакомментированная непустая строка содержит префикс.
# Сборщик будет игнорировать URL начинающиеся с таких префиксов
# режим нечувствительности к регистру букв
+I
# Пропускаем протокол file: (ссылка в локальной файловой системе)
file://
# Пропускаем протокол ftp:
ftp://
# Пропускаем адреса электронной почты
mailto:

- Файл /etc/nutch/suffix-urlfilter.txt
# Каждая незакомментированная непустая строка содержит суффикс.
# Сборщик будет игнорировать URL заканчивающиеся такими суффиксами
# режим нечувствительности к регистру букв
+I

# изображения
.gif
.jpg
.jpeg
.bmp
.png
.tif
.tiff
.ico
.eps
.ps
.wmf
.fpx
.cur
.ani
.img
.lwf
.pcd
.psp
.psd
.tga
.xbm
.xpm

# web-форматы
.css
.js

# архивы/пакеты
.arj
.arc
.7z
.cab
.lzw
.lha
.lzh
.zip
.gz
.tar
.tgz
.sit
.rpm
.deb
.pkg

# аудио/видео
.mid
.midi
.rmi
.mpeg
.mpg
.mpe
.mp3
.mp2
.aac
.mov
.fla
.flv
.ra
.ram
.rm
.rmv
.wma
.wmv
.wav
.wave
.ogg
.avi
.au
.snd

# запускаемые файлы
.exe
.com

# ярлыки windows
.lnk

# расширения файлов системы управления контентом typo3


.t3x

# образы дисков
.iso
.bin

- Файл /var/lib/nutch/urls/tusur-init
http://www.tusur.ru/
http://innovation.tusur.ru/
http://portal.tusur.ru/
http://re.tusur.ru/
http://avt.tusur.ru/
http://zvf.tusur.ru/
http://aoi.tusur.ru/