diff -Nru sphinxsearch-0.9.9+2.0.2beta/api/java/SphinxClient.java sphinxsearch-2.0.4/api/java/SphinxClient.java --- sphinxsearch-0.9.9+2.0.2beta/api/java/SphinxClient.java 2011-07-14 14:20:35.000000000 +0000 +++ sphinxsearch-2.0.4/api/java/SphinxClient.java 2012-03-01 11:38:42.000000000 +0000 @@ -1,11 +1,11 @@ /* - * $Id: SphinxClient.java 2887 2011-07-14 14:20:35Z tomat $ + * $Id: SphinxClient.java 3132 2012-03-01 11:38:42Z klirichek $ * * Java version of Sphinx searchd client (Java API) * * Copyright (c) 2007, Vladimir Fedorkov - * Copyright (c) 2007-2011, Andrew Aksyonoff - * Copyright (c) 2008-2011, Sphinx Technologies Inc + * Copyright (c) 2007-2012, Andrew Aksyonoff + * Copyright (c) 2008-2012, Sphinx Technologies Inc * All rights reserved * * This program is free software; you can redistribute it and/or modify @@ -42,7 +42,8 @@ public final static int SPH_RANK_MATCHANY = 5; public final static int SPH_RANK_FIELDMASK = 6; public final static int SPH_RANK_SPH04 = 7; - public final static int SPH_RANK_TOTAL = 8; + public final static int SPH_RANK_EXPR = 8; + public final static int SPH_RANK_TOTAL = 9; /* sorting modes */ public final static int SPH_SORT_RELEVANCE = 0; @@ -193,6 +194,7 @@ _indexWeights = new LinkedHashMap(); _fieldWeights = new LinkedHashMap(); _ranker = SPH_RANK_PROXIMITY_BM25; + _rankexpr = ""; _overrideTypes = new LinkedHashMap(); _overrideValues = new LinkedHashMap(); @@ -504,9 +506,10 @@ } /** Set ranking mode. */ - public void SetRankingMode ( int ranker ) throws SphinxException + public void SetRankingMode ( int ranker, String rankexpr ) throws SphinxException { myAssert ( ranker>=0 && ranker>$FAILLOG 2>&1 || die "$2" "$3" } -cmd "./configure --with-debug" "configure failed" +cmd "$SHELL ./configure --with-debug" "configure failed" cmd "make clean" "make clean failed" cmd "make" "make failed" diff -Nru sphinxsearch-0.9.9+2.0.2beta/api/libsphinxclient/sphinxclient.c sphinxsearch-2.0.4/api/libsphinxclient/sphinxclient.c --- sphinxsearch-0.9.9+2.0.2beta/api/libsphinxclient/sphinxclient.c 2011-11-13 12:40:26.000000000 +0000 +++ sphinxsearch-2.0.4/api/libsphinxclient/sphinxclient.c 2012-03-01 11:38:42.000000000 +0000 @@ -1,10 +1,10 @@ // -// $Id: sphinxclient.c 3009 2011-11-13 12:40:26Z klirichek $ +// $Id: sphinxclient.c 3132 2012-03-01 11:38:42Z klirichek $ // // -// Copyright (c) 2001-2011, Andrew Aksyonoff -// Copyright (c) 2008-2011, Sphinx Technologies Inc +// Copyright (c) 2001-2012, Andrew Aksyonoff +// Copyright (c) 2008-2012, Sphinx Technologies Inc // All rights reserved // // This program is free software; you can redistribute it and/or modify @@ -159,6 +159,7 @@ const char ** index_weights_names; const int * index_weights_values; int ranker; + const char * rankexpr; int max_query_time; int num_field_weights; const char ** field_weights_names; @@ -240,6 +241,7 @@ client->index_weights_names = NULL; client->index_weights_values = NULL; client->ranker = SPH_RANK_DEFAULT; + client->rankexpr = NULL; client->max_query_time = 0; client->num_field_weights = 0; client->field_weights_names = NULL; @@ -523,15 +525,16 @@ } -sphinx_bool sphinx_set_ranking_mode ( sphinx_client * client, int ranker ) +sphinx_bool sphinx_set_ranking_mode ( sphinx_client * client, int ranker, const char * rankexpr ) { - if ( !client || rankerSPH_RANK_SPH04 ) // FIXME? + if ( !client || ranker=SPH_RANK_TOTAL ) // FIXME? { set_error ( client, "invalid arguments (ranking mode %d out of bounds)", ranker ); return SPH_FALSE; } client->ranker = ranker; + client->rankexpr = strchain ( client, rankexpr ); return SPH_TRUE; } @@ -959,7 +962,8 @@ + safestrlen ( client->group_by ) + safestrlen ( client->group_sort ) + safestrlen ( client->group_distinct ) - + safestrlen ( comment ); + + safestrlen ( comment ) + + safestrlen ( client->rankexpr ); filter_val_size = ( client->ver_search>=0x114 ) ? 8 : 4; for ( i=0; inum_filters; i++ ) @@ -1091,6 +1095,8 @@ send_int ( &req, client->limit ); send_int ( &req, client->mode ); send_int ( &req, client->ranker ); + if ( client->ranker==SPH_RANK_EXPR ) + send_str ( &req, client->rankexpr ); send_int ( &req, client->sort ); send_str ( &req, client->sortby ); send_str ( &req, query ); @@ -2474,5 +2480,5 @@ } // -// $Id: sphinxclient.c 3009 2011-11-13 12:40:26Z klirichek $ +// $Id: sphinxclient.c 3132 2012-03-01 11:38:42Z klirichek $ // diff -Nru sphinxsearch-0.9.9+2.0.2beta/api/libsphinxclient/sphinxclient.h sphinxsearch-2.0.4/api/libsphinxclient/sphinxclient.h --- sphinxsearch-0.9.9+2.0.2beta/api/libsphinxclient/sphinxclient.h 2011-07-08 15:23:04.000000000 +0000 +++ sphinxsearch-2.0.4/api/libsphinxclient/sphinxclient.h 2012-03-01 11:38:42.000000000 +0000 @@ -1,10 +1,10 @@ // -// $Id: sphinxclient.h 2876 2011-07-08 15:23:04Z tomat $ +// $Id: sphinxclient.h 3132 2012-03-01 11:38:42Z klirichek $ // // -// Copyright (c) 2001-2011, Andrew Aksyonoff -// Copyright (c) 2008-2011, Sphinx Technologies Inc +// Copyright (c) 2001-2012, Andrew Aksyonoff +// Copyright (c) 2008-2012, Sphinx Technologies Inc // All rights reserved // // This program is free software; you can redistribute it and/or modify @@ -52,6 +52,9 @@ SPH_RANK_MATCHANY = 5, SPH_RANK_FIELDMASK = 6, SPH_RANK_SPH04 = 7, + SPH_RANK_EXPR = 8, + SPH_RANK_TOTAL = 9, + SPH_RANK_DEFAULT = SPH_RANK_PROXIMITY_BM25 }; @@ -71,7 +74,7 @@ enum { SPH_FILTER_VALUES = 0, SPH_FILTER_RANGE = 1, - SPH_FILTER_FLOATRANGE = 2 + SPH_FILTER_FLOATRANGE = 2 }; /// known attribute types @@ -200,7 +203,7 @@ sphinx_bool sphinx_set_limits ( sphinx_client * client, int offset, int limit, int max_matches, int cutoff ); sphinx_bool sphinx_set_max_query_time ( sphinx_client * client, int max_query_time ); sphinx_bool sphinx_set_match_mode ( sphinx_client * client, int mode ); -sphinx_bool sphinx_set_ranking_mode ( sphinx_client * client, int ranker ); +sphinx_bool sphinx_set_ranking_mode ( sphinx_client * client, int ranker, const char * rankexpr ); sphinx_bool sphinx_set_sort_mode ( sphinx_client * client, int mode, const char * sortby ); sphinx_bool sphinx_set_field_weights ( sphinx_client * client, int num_weights, const char ** field_names, const int * field_weights ); sphinx_bool sphinx_set_index_weights ( sphinx_client * client, int num_weights, const char ** index_names, const int * index_weights ); @@ -249,5 +252,5 @@ #endif // _sphinxclient_ // -// $Id: sphinxclient.h 2876 2011-07-08 15:23:04Z tomat $ +// $Id: sphinxclient.h 3132 2012-03-01 11:38:42Z klirichek $ // diff -Nru sphinxsearch-0.9.9+2.0.2beta/api/libsphinxclient/test.c sphinxsearch-2.0.4/api/libsphinxclient/test.c --- sphinxsearch-0.9.9+2.0.2beta/api/libsphinxclient/test.c 2011-10-30 20:31:23.000000000 +0000 +++ sphinxsearch-2.0.4/api/libsphinxclient/test.c 2012-01-30 23:07:35.000000000 +0000 @@ -1,10 +1,10 @@ // -// $Id: test.c 2992 2011-10-30 20:31:23Z tomat $ +// $Id: test.c 3087 2012-01-30 23:07:35Z shodan $ // // -// Copyright (c) 2001-2011, Andrew Aksyonoff -// Copyright (c) 2008-2011, Sphinx Technologies Inc +// Copyright (c) 2001-2012, Andrew Aksyonoff +// Copyright (c) 2008-2012, Sphinx Technologies Inc // All rights reserved // // This program is free software; you can redistribute it and/or modify @@ -53,17 +53,14 @@ } -void test_query ( sphinx_client * client, const char * query ) +void test_query ( sphinx_client * client, const char * query, const char * index ) { sphinx_result * res; - const char *index; int i, j, k, mva_len; unsigned int * mva; const char * field_names[2]; int field_weights[2]; - index = "test1"; - field_names[0] = "title"; field_names[1] = "content"; field_weights[0] = 100; @@ -145,7 +142,7 @@ sphinx_init_excerpt_options ( &opts ); opts.limit = 60; opts.around = 3; - opts.allow_empty = SPH_TRUE; + opts.allow_empty = SPH_FALSE; for ( j=0; j<2; j++ ) { @@ -363,7 +360,7 @@ k = 0; for ( i=0; i=0 and value<=2**32-1) # -# $Id: sphinxapi.py 2970 2011-09-23 16:50:22Z klirichek $ +# $Id: sphinxapi.py 3087 2012-01-30 23:07:35Z shodan $ # diff -Nru sphinxsearch-0.9.9+2.0.2beta/config.guess sphinxsearch-2.0.4/config.guess --- sphinxsearch-0.9.9+2.0.2beta/config.guess 2012-04-05 17:12:37.000000000 +0000 +++ sphinxsearch-2.0.4/config.guess 1970-01-01 00:00:00.000000000 +0000 @@ -1,1517 +0,0 @@ -#! /bin/sh -# Attempt to guess a canonical system name. -# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, -# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, -# 2011 Free Software Foundation, Inc. - -timestamp='2011-05-11' - -# This file 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., 51 Franklin Street - Fifth Floor, Boston, MA -# 02110-1301, USA. -# -# As a special exception to the GNU General Public License, if you -# distribute this file as part of a program that contains a -# configuration script generated by Autoconf, you may include it under -# the same distribution terms that you use for the rest of that program. - - -# Originally written by Per Bothner. Please send patches (context -# diff format) to and include a ChangeLog -# entry. -# -# This script attempts to guess a canonical system name similar to -# config.sub. If it succeeds, it prints the system name on stdout, and -# exits with 0. Otherwise, it exits with 1. -# -# You can get the latest version of this script from: -# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD - -me=`echo "$0" | sed -e 's,.*/,,'` - -usage="\ -Usage: $0 [OPTION] - -Output the configuration name of the system \`$me' is run on. - -Operation modes: - -h, --help print this help, then exit - -t, --time-stamp print date of last modification, then exit - -v, --version print version number, then exit - -Report bugs and patches to ." - -version="\ -GNU config.guess ($timestamp) - -Originally written by Per Bothner. -Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, -2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free -Software Foundation, Inc. - -This is free software; see the source for copying conditions. There is NO -warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." - -help=" -Try \`$me --help' for more information." - -# Parse command line -while test $# -gt 0 ; do - case $1 in - --time-stamp | --time* | -t ) - echo "$timestamp" ; exit ;; - --version | -v ) - echo "$version" ; exit ;; - --help | --h* | -h ) - echo "$usage"; exit ;; - -- ) # Stop option processing - shift; break ;; - - ) # Use stdin as input. - break ;; - -* ) - echo "$me: invalid option $1$help" >&2 - exit 1 ;; - * ) - break ;; - esac -done - -if test $# != 0; then - echo "$me: too many arguments$help" >&2 - exit 1 -fi - -trap 'exit 1' 1 2 15 - -# CC_FOR_BUILD -- compiler used by this script. Note that the use of a -# compiler to aid in system detection is discouraged as it requires -# temporary files to be created and, as you can see below, it is a -# headache to deal with in a portable fashion. - -# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still -# use `HOST_CC' if defined, but it is deprecated. - -# Portable tmp directory creation inspired by the Autoconf team. - -set_cc_for_build=' -trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; -trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; -: ${TMPDIR=/tmp} ; - { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || - { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || - { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || - { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; -dummy=$tmp/dummy ; -tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; -case $CC_FOR_BUILD,$HOST_CC,$CC in - ,,) echo "int x;" > $dummy.c ; - for c in cc gcc c89 c99 ; do - if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then - CC_FOR_BUILD="$c"; break ; - fi ; - done ; - if test x"$CC_FOR_BUILD" = x ; then - CC_FOR_BUILD=no_compiler_found ; - fi - ;; - ,,*) CC_FOR_BUILD=$CC ;; - ,*,*) CC_FOR_BUILD=$HOST_CC ;; -esac ; set_cc_for_build= ;' - -# This is needed to find uname on a Pyramid OSx when run in the BSD universe. -# (ghazi@noc.rutgers.edu 1994-08-24) -if (test -f /.attbin/uname) >/dev/null 2>&1 ; then - PATH=$PATH:/.attbin ; export PATH -fi - -UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown -UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown -UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown -UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown - -# Note: order is significant - the case branches are not exclusive. - -case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in - *:NetBSD:*:*) - # NetBSD (nbsd) targets should (where applicable) match one or - # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*, - # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently - # switched to ELF, *-*-netbsd* would select the old - # object file format. This provides both forward - # compatibility and a consistent mechanism for selecting the - # object file format. - # - # Note: NetBSD doesn't particularly care about the vendor - # portion of the name. We always set it to "unknown". - sysctl="sysctl -n hw.machine_arch" - UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ - /usr/sbin/$sysctl 2>/dev/null || echo unknown)` - case "${UNAME_MACHINE_ARCH}" in - armeb) machine=armeb-unknown ;; - arm*) machine=arm-unknown ;; - sh3el) machine=shl-unknown ;; - sh3eb) machine=sh-unknown ;; - sh5el) machine=sh5le-unknown ;; - *) machine=${UNAME_MACHINE_ARCH}-unknown ;; - esac - # The Operating System including object format, if it has switched - # to ELF recently, or will in the future. - case "${UNAME_MACHINE_ARCH}" in - arm*|i386|m68k|ns32k|sh3*|sparc|vax) - eval $set_cc_for_build - if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ - | grep -q __ELF__ - then - # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). - # Return netbsd for either. FIX? - os=netbsd - else - os=netbsdelf - fi - ;; - *) - os=netbsd - ;; - esac - # The OS release - # Debian GNU/NetBSD machines have a different userland, and - # thus, need a distinct triplet. However, they do not need - # kernel version information, so it can be replaced with a - # suitable tag, in the style of linux-gnu. - case "${UNAME_VERSION}" in - Debian*) - release='-gnu' - ;; - *) - release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` - ;; - esac - # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: - # contains redundant information, the shorter form: - # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. - echo "${machine}-${os}${release}" - exit ;; - *:OpenBSD:*:*) - UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` - echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} - exit ;; - *:ekkoBSD:*:*) - echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} - exit ;; - *:SolidBSD:*:*) - echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} - exit ;; - macppc:MirBSD:*:*) - echo powerpc-unknown-mirbsd${UNAME_RELEASE} - exit ;; - *:MirBSD:*:*) - echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} - exit ;; - alpha:OSF1:*:*) - case $UNAME_RELEASE in - *4.0) - UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` - ;; - *5.*) - UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` - ;; - esac - # According to Compaq, /usr/sbin/psrinfo has been available on - # OSF/1 and Tru64 systems produced since 1995. I hope that - # covers most systems running today. This code pipes the CPU - # types through head -n 1, so we only detect the type of CPU 0. - ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` - case "$ALPHA_CPU_TYPE" in - "EV4 (21064)") - UNAME_MACHINE="alpha" ;; - "EV4.5 (21064)") - UNAME_MACHINE="alpha" ;; - "LCA4 (21066/21068)") - UNAME_MACHINE="alpha" ;; - "EV5 (21164)") - UNAME_MACHINE="alphaev5" ;; - "EV5.6 (21164A)") - UNAME_MACHINE="alphaev56" ;; - "EV5.6 (21164PC)") - UNAME_MACHINE="alphapca56" ;; - "EV5.7 (21164PC)") - UNAME_MACHINE="alphapca57" ;; - "EV6 (21264)") - UNAME_MACHINE="alphaev6" ;; - "EV6.7 (21264A)") - UNAME_MACHINE="alphaev67" ;; - "EV6.8CB (21264C)") - UNAME_MACHINE="alphaev68" ;; - "EV6.8AL (21264B)") - UNAME_MACHINE="alphaev68" ;; - "EV6.8CX (21264D)") - UNAME_MACHINE="alphaev68" ;; - "EV6.9A (21264/EV69A)") - UNAME_MACHINE="alphaev69" ;; - "EV7 (21364)") - UNAME_MACHINE="alphaev7" ;; - "EV7.9 (21364A)") - UNAME_MACHINE="alphaev79" ;; - esac - # A Pn.n version is a patched version. - # A Vn.n version is a released version. - # A Tn.n version is a released field test version. - # A Xn.n version is an unreleased experimental baselevel. - # 1.2 uses "1.2" for uname -r. - echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` - # Reset EXIT trap before exiting to avoid spurious non-zero exit code. - exitcode=$? - trap '' 0 - exit $exitcode ;; - Alpha\ *:Windows_NT*:*) - # How do we know it's Interix rather than the generic POSIX subsystem? - # Should we change UNAME_MACHINE based on the output of uname instead - # of the specific Alpha model? - echo alpha-pc-interix - exit ;; - 21064:Windows_NT:50:3) - echo alpha-dec-winnt3.5 - exit ;; - Amiga*:UNIX_System_V:4.0:*) - echo m68k-unknown-sysv4 - exit ;; - *:[Aa]miga[Oo][Ss]:*:*) - echo ${UNAME_MACHINE}-unknown-amigaos - exit ;; - *:[Mm]orph[Oo][Ss]:*:*) - echo ${UNAME_MACHINE}-unknown-morphos - exit ;; - *:OS/390:*:*) - echo i370-ibm-openedition - exit ;; - *:z/VM:*:*) - echo s390-ibm-zvmoe - exit ;; - *:OS400:*:*) - echo powerpc-ibm-os400 - exit ;; - arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) - echo arm-acorn-riscix${UNAME_RELEASE} - exit ;; - arm:riscos:*:*|arm:RISCOS:*:*) - echo arm-unknown-riscos - exit ;; - SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) - echo hppa1.1-hitachi-hiuxmpp - exit ;; - Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) - # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. - if test "`(/bin/universe) 2>/dev/null`" = att ; then - echo pyramid-pyramid-sysv3 - else - echo pyramid-pyramid-bsd - fi - exit ;; - NILE*:*:*:dcosx) - echo pyramid-pyramid-svr4 - exit ;; - DRS?6000:unix:4.0:6*) - echo sparc-icl-nx6 - exit ;; - DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) - case `/usr/bin/uname -p` in - sparc) echo sparc-icl-nx7; exit ;; - esac ;; - s390x:SunOS:*:*) - echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` - exit ;; - sun4H:SunOS:5.*:*) - echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` - exit ;; - sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) - echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` - exit ;; - i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) - echo i386-pc-auroraux${UNAME_RELEASE} - exit ;; - i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) - eval $set_cc_for_build - SUN_ARCH="i386" - # If there is a compiler, see if it is configured for 64-bit objects. - # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. - # This test works for both compilers. - if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then - if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ - (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ - grep IS_64BIT_ARCH >/dev/null - then - SUN_ARCH="x86_64" - fi - fi - echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` - exit ;; - sun4*:SunOS:6*:*) - # According to config.sub, this is the proper way to canonicalize - # SunOS6. Hard to guess exactly what SunOS6 will be like, but - # it's likely to be more like Solaris than SunOS4. - echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` - exit ;; - sun4*:SunOS:*:*) - case "`/usr/bin/arch -k`" in - Series*|S4*) - UNAME_RELEASE=`uname -v` - ;; - esac - # Japanese Language versions have a version number like `4.1.3-JL'. - echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` - exit ;; - sun3*:SunOS:*:*) - echo m68k-sun-sunos${UNAME_RELEASE} - exit ;; - sun*:*:4.2BSD:*) - UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` - test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 - case "`/bin/arch`" in - sun3) - echo m68k-sun-sunos${UNAME_RELEASE} - ;; - sun4) - echo sparc-sun-sunos${UNAME_RELEASE} - ;; - esac - exit ;; - aushp:SunOS:*:*) - echo sparc-auspex-sunos${UNAME_RELEASE} - exit ;; - # The situation for MiNT is a little confusing. The machine name - # can be virtually everything (everything which is not - # "atarist" or "atariste" at least should have a processor - # > m68000). The system name ranges from "MiNT" over "FreeMiNT" - # to the lowercase version "mint" (or "freemint"). Finally - # the system name "TOS" denotes a system which is actually not - # MiNT. But MiNT is downward compatible to TOS, so this should - # be no problem. - atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) - echo m68k-atari-mint${UNAME_RELEASE} - exit ;; - atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) - echo m68k-atari-mint${UNAME_RELEASE} - exit ;; - *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) - echo m68k-atari-mint${UNAME_RELEASE} - exit ;; - milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) - echo m68k-milan-mint${UNAME_RELEASE} - exit ;; - hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) - echo m68k-hades-mint${UNAME_RELEASE} - exit ;; - *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) - echo m68k-unknown-mint${UNAME_RELEASE} - exit ;; - m68k:machten:*:*) - echo m68k-apple-machten${UNAME_RELEASE} - exit ;; - powerpc:machten:*:*) - echo powerpc-apple-machten${UNAME_RELEASE} - exit ;; - RISC*:Mach:*:*) - echo mips-dec-mach_bsd4.3 - exit ;; - RISC*:ULTRIX:*:*) - echo mips-dec-ultrix${UNAME_RELEASE} - exit ;; - VAX*:ULTRIX*:*:*) - echo vax-dec-ultrix${UNAME_RELEASE} - exit ;; - 2020:CLIX:*:* | 2430:CLIX:*:*) - echo clipper-intergraph-clix${UNAME_RELEASE} - exit ;; - mips:*:*:UMIPS | mips:*:*:RISCos) - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c -#ifdef __cplusplus -#include /* for printf() prototype */ - int main (int argc, char *argv[]) { -#else - int main (argc, argv) int argc; char *argv[]; { -#endif - #if defined (host_mips) && defined (MIPSEB) - #if defined (SYSTYPE_SYSV) - printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); - #endif - #if defined (SYSTYPE_SVR4) - printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); - #endif - #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) - printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); - #endif - #endif - exit (-1); - } -EOF - $CC_FOR_BUILD -o $dummy $dummy.c && - dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && - SYSTEM_NAME=`$dummy $dummyarg` && - { echo "$SYSTEM_NAME"; exit; } - echo mips-mips-riscos${UNAME_RELEASE} - exit ;; - Motorola:PowerMAX_OS:*:*) - echo powerpc-motorola-powermax - exit ;; - Motorola:*:4.3:PL8-*) - echo powerpc-harris-powermax - exit ;; - Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) - echo powerpc-harris-powermax - exit ;; - Night_Hawk:Power_UNIX:*:*) - echo powerpc-harris-powerunix - exit ;; - m88k:CX/UX:7*:*) - echo m88k-harris-cxux7 - exit ;; - m88k:*:4*:R4*) - echo m88k-motorola-sysv4 - exit ;; - m88k:*:3*:R3*) - echo m88k-motorola-sysv3 - exit ;; - AViiON:dgux:*:*) - # DG/UX returns AViiON for all architectures - UNAME_PROCESSOR=`/usr/bin/uname -p` - if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] - then - if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ - [ ${TARGET_BINARY_INTERFACE}x = x ] - then - echo m88k-dg-dgux${UNAME_RELEASE} - else - echo m88k-dg-dguxbcs${UNAME_RELEASE} - fi - else - echo i586-dg-dgux${UNAME_RELEASE} - fi - exit ;; - M88*:DolphinOS:*:*) # DolphinOS (SVR3) - echo m88k-dolphin-sysv3 - exit ;; - M88*:*:R3*:*) - # Delta 88k system running SVR3 - echo m88k-motorola-sysv3 - exit ;; - XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) - echo m88k-tektronix-sysv3 - exit ;; - Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) - echo m68k-tektronix-bsd - exit ;; - *:IRIX*:*:*) - echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` - exit ;; - ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. - echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id - exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' - i*86:AIX:*:*) - echo i386-ibm-aix - exit ;; - ia64:AIX:*:*) - if [ -x /usr/bin/oslevel ] ; then - IBM_REV=`/usr/bin/oslevel` - else - IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} - fi - echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} - exit ;; - *:AIX:2:3) - if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c - #include - - main() - { - if (!__power_pc()) - exit(1); - puts("powerpc-ibm-aix3.2.5"); - exit(0); - } -EOF - if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` - then - echo "$SYSTEM_NAME" - else - echo rs6000-ibm-aix3.2.5 - fi - elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then - echo rs6000-ibm-aix3.2.4 - else - echo rs6000-ibm-aix3.2 - fi - exit ;; - *:AIX:*:[4567]) - IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` - if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then - IBM_ARCH=rs6000 - else - IBM_ARCH=powerpc - fi - if [ -x /usr/bin/oslevel ] ; then - IBM_REV=`/usr/bin/oslevel` - else - IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} - fi - echo ${IBM_ARCH}-ibm-aix${IBM_REV} - exit ;; - *:AIX:*:*) - echo rs6000-ibm-aix - exit ;; - ibmrt:4.4BSD:*|romp-ibm:BSD:*) - echo romp-ibm-bsd4.4 - exit ;; - ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and - echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to - exit ;; # report: romp-ibm BSD 4.3 - *:BOSX:*:*) - echo rs6000-bull-bosx - exit ;; - DPX/2?00:B.O.S.:*:*) - echo m68k-bull-sysv3 - exit ;; - 9000/[34]??:4.3bsd:1.*:*) - echo m68k-hp-bsd - exit ;; - hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) - echo m68k-hp-bsd4.4 - exit ;; - 9000/[34678]??:HP-UX:*:*) - HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` - case "${UNAME_MACHINE}" in - 9000/31? ) HP_ARCH=m68000 ;; - 9000/[34]?? ) HP_ARCH=m68k ;; - 9000/[678][0-9][0-9]) - if [ -x /usr/bin/getconf ]; then - sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` - sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` - case "${sc_cpu_version}" in - 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 - 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 - 532) # CPU_PA_RISC2_0 - case "${sc_kernel_bits}" in - 32) HP_ARCH="hppa2.0n" ;; - 64) HP_ARCH="hppa2.0w" ;; - '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 - esac ;; - esac - fi - if [ "${HP_ARCH}" = "" ]; then - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c - - #define _HPUX_SOURCE - #include - #include - - int main () - { - #if defined(_SC_KERNEL_BITS) - long bits = sysconf(_SC_KERNEL_BITS); - #endif - long cpu = sysconf (_SC_CPU_VERSION); - - switch (cpu) - { - case CPU_PA_RISC1_0: puts ("hppa1.0"); break; - case CPU_PA_RISC1_1: puts ("hppa1.1"); break; - case CPU_PA_RISC2_0: - #if defined(_SC_KERNEL_BITS) - switch (bits) - { - case 64: puts ("hppa2.0w"); break; - case 32: puts ("hppa2.0n"); break; - default: puts ("hppa2.0"); break; - } break; - #else /* !defined(_SC_KERNEL_BITS) */ - puts ("hppa2.0"); break; - #endif - default: puts ("hppa1.0"); break; - } - exit (0); - } -EOF - (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` - test -z "$HP_ARCH" && HP_ARCH=hppa - fi ;; - esac - if [ ${HP_ARCH} = "hppa2.0w" ] - then - eval $set_cc_for_build - - # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating - # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler - # generating 64-bit code. GNU and HP use different nomenclature: - # - # $ CC_FOR_BUILD=cc ./config.guess - # => hppa2.0w-hp-hpux11.23 - # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess - # => hppa64-hp-hpux11.23 - - if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | - grep -q __LP64__ - then - HP_ARCH="hppa2.0w" - else - HP_ARCH="hppa64" - fi - fi - echo ${HP_ARCH}-hp-hpux${HPUX_REV} - exit ;; - ia64:HP-UX:*:*) - HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` - echo ia64-hp-hpux${HPUX_REV} - exit ;; - 3050*:HI-UX:*:*) - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c - #include - int - main () - { - long cpu = sysconf (_SC_CPU_VERSION); - /* The order matters, because CPU_IS_HP_MC68K erroneously returns - true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct - results, however. */ - if (CPU_IS_PA_RISC (cpu)) - { - switch (cpu) - { - case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; - case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; - case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; - default: puts ("hppa-hitachi-hiuxwe2"); break; - } - } - else if (CPU_IS_HP_MC68K (cpu)) - puts ("m68k-hitachi-hiuxwe2"); - else puts ("unknown-hitachi-hiuxwe2"); - exit (0); - } -EOF - $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && - { echo "$SYSTEM_NAME"; exit; } - echo unknown-hitachi-hiuxwe2 - exit ;; - 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) - echo hppa1.1-hp-bsd - exit ;; - 9000/8??:4.3bsd:*:*) - echo hppa1.0-hp-bsd - exit ;; - *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) - echo hppa1.0-hp-mpeix - exit ;; - hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) - echo hppa1.1-hp-osf - exit ;; - hp8??:OSF1:*:*) - echo hppa1.0-hp-osf - exit ;; - i*86:OSF1:*:*) - if [ -x /usr/sbin/sysversion ] ; then - echo ${UNAME_MACHINE}-unknown-osf1mk - else - echo ${UNAME_MACHINE}-unknown-osf1 - fi - exit ;; - parisc*:Lites*:*:*) - echo hppa1.1-hp-lites - exit ;; - C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) - echo c1-convex-bsd - exit ;; - C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) - if getsysinfo -f scalar_acc - then echo c32-convex-bsd - else echo c2-convex-bsd - fi - exit ;; - C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) - echo c34-convex-bsd - exit ;; - C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) - echo c38-convex-bsd - exit ;; - C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) - echo c4-convex-bsd - exit ;; - CRAY*Y-MP:*:*:*) - echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' - exit ;; - CRAY*[A-Z]90:*:*:*) - echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ - | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ - -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ - -e 's/\.[^.]*$/.X/' - exit ;; - CRAY*TS:*:*:*) - echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' - exit ;; - CRAY*T3E:*:*:*) - echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' - exit ;; - CRAY*SV1:*:*:*) - echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' - exit ;; - *:UNICOS/mp:*:*) - echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' - exit ;; - F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) - FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` - FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` - FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` - echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" - exit ;; - 5000:UNIX_System_V:4.*:*) - FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` - FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` - echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" - exit ;; - i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) - echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} - exit ;; - sparc*:BSD/OS:*:*) - echo sparc-unknown-bsdi${UNAME_RELEASE} - exit ;; - *:BSD/OS:*:*) - echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} - exit ;; - *:FreeBSD:*:*) - case ${UNAME_MACHINE} in - pc98) - echo i386-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; - amd64) - echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; - *) - echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; - esac - exit ;; - i*:CYGWIN*:*) - echo ${UNAME_MACHINE}-pc-cygwin - exit ;; - *:MINGW*:*) - echo ${UNAME_MACHINE}-pc-mingw32 - exit ;; - i*:windows32*:*) - # uname -m includes "-pc" on this system. - echo ${UNAME_MACHINE}-mingw32 - exit ;; - i*:PW*:*) - echo ${UNAME_MACHINE}-pc-pw32 - exit ;; - *:Interix*:*) - case ${UNAME_MACHINE} in - x86) - echo i586-pc-interix${UNAME_RELEASE} - exit ;; - authenticamd | genuineintel | EM64T) - echo x86_64-unknown-interix${UNAME_RELEASE} - exit ;; - IA64) - echo ia64-unknown-interix${UNAME_RELEASE} - exit ;; - esac ;; - [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) - echo i${UNAME_MACHINE}-pc-mks - exit ;; - 8664:Windows_NT:*) - echo x86_64-pc-mks - exit ;; - i*:Windows_NT*:* | Pentium*:Windows_NT*:*) - # How do we know it's Interix rather than the generic POSIX subsystem? - # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we - # UNAME_MACHINE based on the output of uname instead of i386? - echo i586-pc-interix - exit ;; - i*:UWIN*:*) - echo ${UNAME_MACHINE}-pc-uwin - exit ;; - amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) - echo x86_64-unknown-cygwin - exit ;; - p*:CYGWIN*:*) - echo powerpcle-unknown-cygwin - exit ;; - prep*:SunOS:5.*:*) - echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` - exit ;; - *:GNU:*:*) - # the GNU system - echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` - exit ;; - *:GNU/*:*:*) - # other systems with GNU libc and userland - echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu - exit ;; - i*86:Minix:*:*) - echo ${UNAME_MACHINE}-pc-minix - exit ;; - alpha:Linux:*:*) - case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in - EV5) UNAME_MACHINE=alphaev5 ;; - EV56) UNAME_MACHINE=alphaev56 ;; - PCA56) UNAME_MACHINE=alphapca56 ;; - PCA57) UNAME_MACHINE=alphapca56 ;; - EV6) UNAME_MACHINE=alphaev6 ;; - EV67) UNAME_MACHINE=alphaev67 ;; - EV68*) UNAME_MACHINE=alphaev68 ;; - esac - objdump --private-headers /bin/sh | grep -q ld.so.1 - if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi - echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} - exit ;; - arm*:Linux:*:*) - eval $set_cc_for_build - if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ - | grep -q __ARM_EABI__ - then - echo ${UNAME_MACHINE}-unknown-linux-gnu - else - if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ - | grep -q __ARM_PCS_VFP - then - echo ${UNAME_MACHINE}-unknown-linux-gnueabi - else - echo ${UNAME_MACHINE}-unknown-linux-gnueabihf - fi - fi - exit ;; - avr32*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit ;; - cris:Linux:*:*) - echo cris-axis-linux-gnu - exit ;; - crisv32:Linux:*:*) - echo crisv32-axis-linux-gnu - exit ;; - frv:Linux:*:*) - echo frv-unknown-linux-gnu - exit ;; - i*86:Linux:*:*) - LIBC=gnu - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c - #ifdef __dietlibc__ - LIBC=dietlibc - #endif -EOF - eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'` - echo "${UNAME_MACHINE}-pc-linux-${LIBC}" - exit ;; - ia64:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit ;; - m32r*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit ;; - m68*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit ;; - mips:Linux:*:* | mips64:Linux:*:*) - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c - #undef CPU - #undef ${UNAME_MACHINE} - #undef ${UNAME_MACHINE}el - #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) - CPU=${UNAME_MACHINE}el - #else - #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) - CPU=${UNAME_MACHINE} - #else - CPU= - #endif - #endif -EOF - eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'` - test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } - ;; - or32:Linux:*:*) - echo or32-unknown-linux-gnu - exit ;; - padre:Linux:*:*) - echo sparc-unknown-linux-gnu - exit ;; - parisc64:Linux:*:* | hppa64:Linux:*:*) - echo hppa64-unknown-linux-gnu - exit ;; - parisc:Linux:*:* | hppa:Linux:*:*) - # Look for CPU level - case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in - PA7*) echo hppa1.1-unknown-linux-gnu ;; - PA8*) echo hppa2.0-unknown-linux-gnu ;; - *) echo hppa-unknown-linux-gnu ;; - esac - exit ;; - ppc64:Linux:*:*) - echo powerpc64-unknown-linux-gnu - exit ;; - ppc:Linux:*:*) - echo powerpc-unknown-linux-gnu - exit ;; - s390:Linux:*:* | s390x:Linux:*:*) - echo ${UNAME_MACHINE}-ibm-linux - exit ;; - sh64*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit ;; - sh*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit ;; - sparc:Linux:*:* | sparc64:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit ;; - tile*:Linux:*:*) - echo ${UNAME_MACHINE}-tilera-linux-gnu - exit ;; - vax:Linux:*:*) - echo ${UNAME_MACHINE}-dec-linux-gnu - exit ;; - x86_64:Linux:*:*) - echo x86_64-unknown-linux-gnu - exit ;; - xtensa*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit ;; - i*86:DYNIX/ptx:4*:*) - # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. - # earlier versions are messed up and put the nodename in both - # sysname and nodename. - echo i386-sequent-sysv4 - exit ;; - i*86:UNIX_SV:4.2MP:2.*) - # Unixware is an offshoot of SVR4, but it has its own version - # number series starting with 2... - # I am not positive that other SVR4 systems won't match this, - # I just have to hope. -- rms. - # Use sysv4.2uw... so that sysv4* matches it. - echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} - exit ;; - i*86:OS/2:*:*) - # If we were able to find `uname', then EMX Unix compatibility - # is probably installed. - echo ${UNAME_MACHINE}-pc-os2-emx - exit ;; - i*86:XTS-300:*:STOP) - echo ${UNAME_MACHINE}-unknown-stop - exit ;; - i*86:atheos:*:*) - echo ${UNAME_MACHINE}-unknown-atheos - exit ;; - i*86:syllable:*:*) - echo ${UNAME_MACHINE}-pc-syllable - exit ;; - i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) - echo i386-unknown-lynxos${UNAME_RELEASE} - exit ;; - i*86:*DOS:*:*) - echo ${UNAME_MACHINE}-pc-msdosdjgpp - exit ;; - i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) - UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` - if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then - echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} - else - echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} - fi - exit ;; - i*86:*:5:[678]*) - # UnixWare 7.x, OpenUNIX and OpenServer 6. - case `/bin/uname -X | grep "^Machine"` in - *486*) UNAME_MACHINE=i486 ;; - *Pentium) UNAME_MACHINE=i586 ;; - *Pent*|*Celeron) UNAME_MACHINE=i686 ;; - esac - echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} - exit ;; - i*86:*:3.2:*) - if test -f /usr/options/cb.name; then - UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then - UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` - (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 - (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ - && UNAME_MACHINE=i586 - (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ - && UNAME_MACHINE=i686 - (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ - && UNAME_MACHINE=i686 - echo ${UNAME_MACHINE}-pc-sco$UNAME_REL - else - echo ${UNAME_MACHINE}-pc-sysv32 - fi - exit ;; - pc:*:*:*) - # Left here for compatibility: - # uname -m prints for DJGPP always 'pc', but it prints nothing about - # the processor, so we play safe by assuming i586. - # Note: whatever this is, it MUST be the same as what config.sub - # prints for the "djgpp" host, or else GDB configury will decide that - # this is a cross-build. - echo i586-pc-msdosdjgpp - exit ;; - Intel:Mach:3*:*) - echo i386-pc-mach3 - exit ;; - paragon:*:*:*) - echo i860-intel-osf1 - exit ;; - i860:*:4.*:*) # i860-SVR4 - if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then - echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 - else # Add other i860-SVR4 vendors below as they are discovered. - echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 - fi - exit ;; - mini*:CTIX:SYS*5:*) - # "miniframe" - echo m68010-convergent-sysv - exit ;; - mc68k:UNIX:SYSTEM5:3.51m) - echo m68k-convergent-sysv - exit ;; - M680?0:D-NIX:5.3:*) - echo m68k-diab-dnix - exit ;; - M68*:*:R3V[5678]*:*) - test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; - 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) - OS_REL='' - test -r /etc/.relid \ - && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` - /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ - && { echo i486-ncr-sysv4.3${OS_REL}; exit; } - /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ - && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; - 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) - /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ - && { echo i486-ncr-sysv4; exit; } ;; - NCR*:*:4.2:* | MPRAS*:*:4.2:*) - OS_REL='.3' - test -r /etc/.relid \ - && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` - /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ - && { echo i486-ncr-sysv4.3${OS_REL}; exit; } - /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ - && { echo i586-ncr-sysv4.3${OS_REL}; exit; } - /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ - && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; - m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) - echo m68k-unknown-lynxos${UNAME_RELEASE} - exit ;; - mc68030:UNIX_System_V:4.*:*) - echo m68k-atari-sysv4 - exit ;; - TSUNAMI:LynxOS:2.*:*) - echo sparc-unknown-lynxos${UNAME_RELEASE} - exit ;; - rs6000:LynxOS:2.*:*) - echo rs6000-unknown-lynxos${UNAME_RELEASE} - exit ;; - PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) - echo powerpc-unknown-lynxos${UNAME_RELEASE} - exit ;; - SM[BE]S:UNIX_SV:*:*) - echo mips-dde-sysv${UNAME_RELEASE} - exit ;; - RM*:ReliantUNIX-*:*:*) - echo mips-sni-sysv4 - exit ;; - RM*:SINIX-*:*:*) - echo mips-sni-sysv4 - exit ;; - *:SINIX-*:*:*) - if uname -p 2>/dev/null >/dev/null ; then - UNAME_MACHINE=`(uname -p) 2>/dev/null` - echo ${UNAME_MACHINE}-sni-sysv4 - else - echo ns32k-sni-sysv - fi - exit ;; - PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort - # says - echo i586-unisys-sysv4 - exit ;; - *:UNIX_System_V:4*:FTX*) - # From Gerald Hewes . - # How about differentiating between stratus architectures? -djm - echo hppa1.1-stratus-sysv4 - exit ;; - *:*:*:FTX*) - # From seanf@swdc.stratus.com. - echo i860-stratus-sysv4 - exit ;; - i*86:VOS:*:*) - # From Paul.Green@stratus.com. - echo ${UNAME_MACHINE}-stratus-vos - exit ;; - *:VOS:*:*) - # From Paul.Green@stratus.com. - echo hppa1.1-stratus-vos - exit ;; - mc68*:A/UX:*:*) - echo m68k-apple-aux${UNAME_RELEASE} - exit ;; - news*:NEWS-OS:6*:*) - echo mips-sony-newsos6 - exit ;; - R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) - if [ -d /usr/nec ]; then - echo mips-nec-sysv${UNAME_RELEASE} - else - echo mips-unknown-sysv${UNAME_RELEASE} - fi - exit ;; - BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. - echo powerpc-be-beos - exit ;; - BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. - echo powerpc-apple-beos - exit ;; - BePC:BeOS:*:*) # BeOS running on Intel PC compatible. - echo i586-pc-beos - exit ;; - BePC:Haiku:*:*) # Haiku running on Intel PC compatible. - echo i586-pc-haiku - exit ;; - SX-4:SUPER-UX:*:*) - echo sx4-nec-superux${UNAME_RELEASE} - exit ;; - SX-5:SUPER-UX:*:*) - echo sx5-nec-superux${UNAME_RELEASE} - exit ;; - SX-6:SUPER-UX:*:*) - echo sx6-nec-superux${UNAME_RELEASE} - exit ;; - SX-7:SUPER-UX:*:*) - echo sx7-nec-superux${UNAME_RELEASE} - exit ;; - SX-8:SUPER-UX:*:*) - echo sx8-nec-superux${UNAME_RELEASE} - exit ;; - SX-8R:SUPER-UX:*:*) - echo sx8r-nec-superux${UNAME_RELEASE} - exit ;; - Power*:Rhapsody:*:*) - echo powerpc-apple-rhapsody${UNAME_RELEASE} - exit ;; - *:Rhapsody:*:*) - echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} - exit ;; - *:Darwin:*:*) - UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown - case $UNAME_PROCESSOR in - i386) - eval $set_cc_for_build - if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then - if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ - (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ - grep IS_64BIT_ARCH >/dev/null - then - UNAME_PROCESSOR="x86_64" - fi - fi ;; - unknown) UNAME_PROCESSOR=powerpc ;; - esac - echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} - exit ;; - *:procnto*:*:* | *:QNX:[0123456789]*:*) - UNAME_PROCESSOR=`uname -p` - if test "$UNAME_PROCESSOR" = "x86"; then - UNAME_PROCESSOR=i386 - UNAME_MACHINE=pc - fi - echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} - exit ;; - *:QNX:*:4*) - echo i386-pc-qnx - exit ;; - NEO-?:NONSTOP_KERNEL:*:*) - echo neo-tandem-nsk${UNAME_RELEASE} - exit ;; - NSE-?:NONSTOP_KERNEL:*:*) - echo nse-tandem-nsk${UNAME_RELEASE} - exit ;; - NSR-?:NONSTOP_KERNEL:*:*) - echo nsr-tandem-nsk${UNAME_RELEASE} - exit ;; - *:NonStop-UX:*:*) - echo mips-compaq-nonstopux - exit ;; - BS2000:POSIX*:*:*) - echo bs2000-siemens-sysv - exit ;; - DS/*:UNIX_System_V:*:*) - echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} - exit ;; - *:Plan9:*:*) - # "uname -m" is not consistent, so use $cputype instead. 386 - # is converted to i386 for consistency with other x86 - # operating systems. - if test "$cputype" = "386"; then - UNAME_MACHINE=i386 - else - UNAME_MACHINE="$cputype" - fi - echo ${UNAME_MACHINE}-unknown-plan9 - exit ;; - *:TOPS-10:*:*) - echo pdp10-unknown-tops10 - exit ;; - *:TENEX:*:*) - echo pdp10-unknown-tenex - exit ;; - KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) - echo pdp10-dec-tops20 - exit ;; - XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) - echo pdp10-xkl-tops20 - exit ;; - *:TOPS-20:*:*) - echo pdp10-unknown-tops20 - exit ;; - *:ITS:*:*) - echo pdp10-unknown-its - exit ;; - SEI:*:*:SEIUX) - echo mips-sei-seiux${UNAME_RELEASE} - exit ;; - *:DragonFly:*:*) - echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` - exit ;; - *:*VMS:*:*) - UNAME_MACHINE=`(uname -p) 2>/dev/null` - case "${UNAME_MACHINE}" in - A*) echo alpha-dec-vms ; exit ;; - I*) echo ia64-dec-vms ; exit ;; - V*) echo vax-dec-vms ; exit ;; - esac ;; - *:XENIX:*:SysV) - echo i386-pc-xenix - exit ;; - i*86:skyos:*:*) - echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' - exit ;; - i*86:rdos:*:*) - echo ${UNAME_MACHINE}-pc-rdos - exit ;; - i*86:AROS:*:*) - echo ${UNAME_MACHINE}-pc-aros - exit ;; -esac - -#echo '(No uname command or uname output not recognized.)' 1>&2 -#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 - -eval $set_cc_for_build -cat >$dummy.c < -# include -#endif -main () -{ -#if defined (sony) -#if defined (MIPSEB) - /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, - I don't know.... */ - printf ("mips-sony-bsd\n"); exit (0); -#else -#include - printf ("m68k-sony-newsos%s\n", -#ifdef NEWSOS4 - "4" -#else - "" -#endif - ); exit (0); -#endif -#endif - -#if defined (__arm) && defined (__acorn) && defined (__unix) - printf ("arm-acorn-riscix\n"); exit (0); -#endif - -#if defined (hp300) && !defined (hpux) - printf ("m68k-hp-bsd\n"); exit (0); -#endif - -#if defined (NeXT) -#if !defined (__ARCHITECTURE__) -#define __ARCHITECTURE__ "m68k" -#endif - int version; - version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; - if (version < 4) - printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); - else - printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); - exit (0); -#endif - -#if defined (MULTIMAX) || defined (n16) -#if defined (UMAXV) - printf ("ns32k-encore-sysv\n"); exit (0); -#else -#if defined (CMU) - printf ("ns32k-encore-mach\n"); exit (0); -#else - printf ("ns32k-encore-bsd\n"); exit (0); -#endif -#endif -#endif - -#if defined (__386BSD__) - printf ("i386-pc-bsd\n"); exit (0); -#endif - -#if defined (sequent) -#if defined (i386) - printf ("i386-sequent-dynix\n"); exit (0); -#endif -#if defined (ns32000) - printf ("ns32k-sequent-dynix\n"); exit (0); -#endif -#endif - -#if defined (_SEQUENT_) - struct utsname un; - - uname(&un); - - if (strncmp(un.version, "V2", 2) == 0) { - printf ("i386-sequent-ptx2\n"); exit (0); - } - if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ - printf ("i386-sequent-ptx1\n"); exit (0); - } - printf ("i386-sequent-ptx\n"); exit (0); - -#endif - -#if defined (vax) -# if !defined (ultrix) -# include -# if defined (BSD) -# if BSD == 43 - printf ("vax-dec-bsd4.3\n"); exit (0); -# else -# if BSD == 199006 - printf ("vax-dec-bsd4.3reno\n"); exit (0); -# else - printf ("vax-dec-bsd\n"); exit (0); -# endif -# endif -# else - printf ("vax-dec-bsd\n"); exit (0); -# endif -# else - printf ("vax-dec-ultrix\n"); exit (0); -# endif -#endif - -#if defined (alliant) && defined (i860) - printf ("i860-alliant-bsd\n"); exit (0); -#endif - - exit (1); -} -EOF - -$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` && - { echo "$SYSTEM_NAME"; exit; } - -# Apollos put the system type in the environment. - -test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; } - -# Convex versions that predate uname can use getsysinfo(1) - -if [ -x /usr/convex/getsysinfo ] -then - case `getsysinfo -f cpu_type` in - c1*) - echo c1-convex-bsd - exit ;; - c2*) - if getsysinfo -f scalar_acc - then echo c32-convex-bsd - else echo c2-convex-bsd - fi - exit ;; - c34*) - echo c34-convex-bsd - exit ;; - c38*) - echo c38-convex-bsd - exit ;; - c4*) - echo c4-convex-bsd - exit ;; - esac -fi - -cat >&2 < in order to provide the needed -information to handle your system. - -config.guess timestamp = $timestamp - -uname -m = `(uname -m) 2>/dev/null || echo unknown` -uname -r = `(uname -r) 2>/dev/null || echo unknown` -uname -s = `(uname -s) 2>/dev/null || echo unknown` -uname -v = `(uname -v) 2>/dev/null || echo unknown` - -/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` -/bin/uname -X = `(/bin/uname -X) 2>/dev/null` - -hostinfo = `(hostinfo) 2>/dev/null` -/bin/universe = `(/bin/universe) 2>/dev/null` -/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` -/bin/arch = `(/bin/arch) 2>/dev/null` -/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` -/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` - -UNAME_MACHINE = ${UNAME_MACHINE} -UNAME_RELEASE = ${UNAME_RELEASE} -UNAME_SYSTEM = ${UNAME_SYSTEM} -UNAME_VERSION = ${UNAME_VERSION} -EOF - -exit 1 - -# Local variables: -# eval: (add-hook 'write-file-hooks 'time-stamp) -# time-stamp-start: "timestamp='" -# time-stamp-format: "%:y-%02m-%02d" -# time-stamp-end: "'" -# End: diff -Nru sphinxsearch-0.9.9+2.0.2beta/config.sub sphinxsearch-2.0.4/config.sub --- sphinxsearch-0.9.9+2.0.2beta/config.sub 2012-04-05 17:12:37.000000000 +0000 +++ sphinxsearch-2.0.4/config.sub 1970-01-01 00:00:00.000000000 +0000 @@ -1,1760 +0,0 @@ -#! /bin/sh -# Configuration validation subroutine script. -# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, -# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, -# 2011 Free Software Foundation, Inc. - -timestamp='2011-03-23' - -# This file is (in principle) common to ALL GNU software. -# The presence of a machine in this file suggests that SOME GNU software -# can handle that machine. It does not imply ALL GNU software can. -# -# This file 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., 51 Franklin Street - Fifth Floor, Boston, MA -# 02110-1301, USA. -# -# As a special exception to the GNU General Public License, if you -# distribute this file as part of a program that contains a -# configuration script generated by Autoconf, you may include it under -# the same distribution terms that you use for the rest of that program. - - -# Please send patches to . Submit a context -# diff and a properly formatted GNU ChangeLog entry. -# -# Configuration subroutine to validate and canonicalize a configuration type. -# Supply the specified configuration type as an argument. -# If it is invalid, we print an error message on stderr and exit with code 1. -# Otherwise, we print the canonical config type on stdout and succeed. - -# You can get the latest version of this script from: -# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD - -# This file is supposed to be the same for all GNU packages -# and recognize all the CPU types, system types and aliases -# that are meaningful with *any* GNU software. -# Each package is responsible for reporting which valid configurations -# it does not support. The user should be able to distinguish -# a failure to support a valid configuration from a meaningless -# configuration. - -# The goal of this file is to map all the various variations of a given -# machine specification into a single specification in the form: -# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM -# or in some cases, the newer four-part form: -# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM -# It is wrong to echo any other type of specification. - -me=`echo "$0" | sed -e 's,.*/,,'` - -usage="\ -Usage: $0 [OPTION] CPU-MFR-OPSYS - $0 [OPTION] ALIAS - -Canonicalize a configuration name. - -Operation modes: - -h, --help print this help, then exit - -t, --time-stamp print date of last modification, then exit - -v, --version print version number, then exit - -Report bugs and patches to ." - -version="\ -GNU config.sub ($timestamp) - -Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, -2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free -Software Foundation, Inc. - -This is free software; see the source for copying conditions. There is NO -warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." - -help=" -Try \`$me --help' for more information." - -# Parse command line -while test $# -gt 0 ; do - case $1 in - --time-stamp | --time* | -t ) - echo "$timestamp" ; exit ;; - --version | -v ) - echo "$version" ; exit ;; - --help | --h* | -h ) - echo "$usage"; exit ;; - -- ) # Stop option processing - shift; break ;; - - ) # Use stdin as input. - break ;; - -* ) - echo "$me: invalid option $1$help" - exit 1 ;; - - *local*) - # First pass through any local machine types. - echo $1 - exit ;; - - * ) - break ;; - esac -done - -case $# in - 0) echo "$me: missing argument$help" >&2 - exit 1;; - 1) ;; - *) echo "$me: too many arguments$help" >&2 - exit 1;; -esac - -# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). -# Here we must recognize all the valid KERNEL-OS combinations. -maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` -case $maybe_os in - nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \ - linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \ - knetbsd*-gnu* | netbsd*-gnu* | \ - kopensolaris*-gnu* | \ - storm-chaos* | os2-emx* | rtmk-nova*) - os=-$maybe_os - basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` - ;; - *) - basic_machine=`echo $1 | sed 's/-[^-]*$//'` - if [ $basic_machine != $1 ] - then os=`echo $1 | sed 's/.*-/-/'` - else os=; fi - ;; -esac - -### Let's recognize common machines as not being operating systems so -### that things like config.sub decstation-3100 work. We also -### recognize some manufacturers as not being operating systems, so we -### can provide default operating systems below. -case $os in - -sun*os*) - # Prevent following clause from handling this invalid input. - ;; - -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ - -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ - -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ - -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ - -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ - -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ - -apple | -axis | -knuth | -cray | -microblaze) - os= - basic_machine=$1 - ;; - -bluegene*) - os=-cnk - ;; - -sim | -cisco | -oki | -wec | -winbond) - os= - basic_machine=$1 - ;; - -scout) - ;; - -wrs) - os=-vxworks - basic_machine=$1 - ;; - -chorusos*) - os=-chorusos - basic_machine=$1 - ;; - -chorusrdb) - os=-chorusrdb - basic_machine=$1 - ;; - -hiux*) - os=-hiuxwe2 - ;; - -sco6) - os=-sco5v6 - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -sco5) - os=-sco3.2v5 - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -sco4) - os=-sco3.2v4 - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -sco3.2.[4-9]*) - os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -sco3.2v[4-9]*) - # Don't forget version if it is 3.2v4 or newer. - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -sco5v6*) - # Don't forget version if it is 3.2v4 or newer. - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -sco*) - os=-sco3.2v2 - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -udk*) - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -isc) - os=-isc2.2 - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -clix*) - basic_machine=clipper-intergraph - ;; - -isc*) - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -lynx*) - os=-lynxos - ;; - -ptx*) - basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` - ;; - -windowsnt*) - os=`echo $os | sed -e 's/windowsnt/winnt/'` - ;; - -psos*) - os=-psos - ;; - -mint | -mint[0-9]*) - basic_machine=m68k-atari - os=-mint - ;; -esac - -# Decode aliases for certain CPU-COMPANY combinations. -case $basic_machine in - # Recognize the basic CPU types without company name. - # Some are omitted here because they have special meanings below. - 1750a | 580 \ - | a29k \ - | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ - | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ - | am33_2.0 \ - | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \ - | bfin \ - | c4x | clipper \ - | d10v | d30v | dlx | dsp16xx \ - | fido | fr30 | frv \ - | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ - | i370 | i860 | i960 | ia64 \ - | ip2k | iq2000 \ - | lm32 \ - | m32c | m32r | m32rle | m68000 | m68k | m88k \ - | maxq | mb | microblaze | mcore | mep | metag \ - | mips | mipsbe | mipseb | mipsel | mipsle \ - | mips16 \ - | mips64 | mips64el \ - | mips64octeon | mips64octeonel \ - | mips64orion | mips64orionel \ - | mips64r5900 | mips64r5900el \ - | mips64vr | mips64vrel \ - | mips64vr4100 | mips64vr4100el \ - | mips64vr4300 | mips64vr4300el \ - | mips64vr5000 | mips64vr5000el \ - | mips64vr5900 | mips64vr5900el \ - | mipsisa32 | mipsisa32el \ - | mipsisa32r2 | mipsisa32r2el \ - | mipsisa64 | mipsisa64el \ - | mipsisa64r2 | mipsisa64r2el \ - | mipsisa64sb1 | mipsisa64sb1el \ - | mipsisa64sr71k | mipsisa64sr71kel \ - | mipstx39 | mipstx39el \ - | mn10200 | mn10300 \ - | moxie \ - | mt \ - | msp430 \ - | nds32 | nds32le | nds32be \ - | nios | nios2 \ - | ns16k | ns32k \ - | open8 \ - | or32 \ - | pdp10 | pdp11 | pj | pjl \ - | powerpc | powerpc64 | powerpc64le | powerpcle \ - | pyramid \ - | rx \ - | score \ - | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ - | sh64 | sh64le \ - | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ - | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ - | spu \ - | tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \ - | ubicom32 \ - | v850 | v850e \ - | we32k \ - | x86 | xc16x | xstormy16 | xtensa \ - | z8k | z80) - basic_machine=$basic_machine-unknown - ;; - c54x) - basic_machine=tic54x-unknown - ;; - c55x) - basic_machine=tic55x-unknown - ;; - c6x) - basic_machine=tic6x-unknown - ;; - m6811 | m68hc11 | m6812 | m68hc12 | picochip) - # Motorola 68HC11/12. - basic_machine=$basic_machine-unknown - os=-none - ;; - m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) - ;; - ms1) - basic_machine=mt-unknown - ;; - - strongarm | thumb | xscale) - basic_machine=arm-unknown - ;; - - xscaleeb) - basic_machine=armeb-unknown - ;; - - xscaleel) - basic_machine=armel-unknown - ;; - - # We use `pc' rather than `unknown' - # because (1) that's what they normally are, and - # (2) the word "unknown" tends to confuse beginning users. - i*86 | x86_64) - basic_machine=$basic_machine-pc - ;; - # Object if more than one company name word. - *-*-*) - echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 - exit 1 - ;; - # Recognize the basic CPU types with company name. - 580-* \ - | a29k-* \ - | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ - | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ - | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ - | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ - | avr-* | avr32-* \ - | bfin-* | bs2000-* \ - | c[123]* | c30-* | [cjt]90-* | c4x-* \ - | clipper-* | craynv-* | cydra-* \ - | d10v-* | d30v-* | dlx-* \ - | elxsi-* \ - | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ - | h8300-* | h8500-* \ - | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ - | i*86-* | i860-* | i960-* | ia64-* \ - | ip2k-* | iq2000-* \ - | lm32-* \ - | m32c-* | m32r-* | m32rle-* \ - | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ - | m88110-* | m88k-* | maxq-* | mcore-* | metag-* | microblaze-* \ - | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ - | mips16-* \ - | mips64-* | mips64el-* \ - | mips64octeon-* | mips64octeonel-* \ - | mips64orion-* | mips64orionel-* \ - | mips64r5900-* | mips64r5900el-* \ - | mips64vr-* | mips64vrel-* \ - | mips64vr4100-* | mips64vr4100el-* \ - | mips64vr4300-* | mips64vr4300el-* \ - | mips64vr5000-* | mips64vr5000el-* \ - | mips64vr5900-* | mips64vr5900el-* \ - | mipsisa32-* | mipsisa32el-* \ - | mipsisa32r2-* | mipsisa32r2el-* \ - | mipsisa64-* | mipsisa64el-* \ - | mipsisa64r2-* | mipsisa64r2el-* \ - | mipsisa64sb1-* | mipsisa64sb1el-* \ - | mipsisa64sr71k-* | mipsisa64sr71kel-* \ - | mipstx39-* | mipstx39el-* \ - | mmix-* \ - | mt-* \ - | msp430-* \ - | nds32-* | nds32le-* | nds32be-* \ - | nios-* | nios2-* \ - | none-* | np1-* | ns16k-* | ns32k-* \ - | open8-* \ - | orion-* \ - | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ - | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \ - | pyramid-* \ - | romp-* | rs6000-* | rx-* \ - | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ - | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ - | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ - | sparclite-* \ - | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx?-* \ - | tahoe-* \ - | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ - | tile-* | tilegx-* \ - | tron-* \ - | ubicom32-* \ - | v850-* | v850e-* | vax-* \ - | we32k-* \ - | x86-* | x86_64-* | xc16x-* | xps100-* \ - | xstormy16-* | xtensa*-* \ - | ymp-* \ - | z8k-* | z80-*) - ;; - # Recognize the basic CPU types without company name, with glob match. - xtensa*) - basic_machine=$basic_machine-unknown - ;; - # Recognize the various machine names and aliases which stand - # for a CPU type and a company and sometimes even an OS. - 386bsd) - basic_machine=i386-unknown - os=-bsd - ;; - 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) - basic_machine=m68000-att - ;; - 3b*) - basic_machine=we32k-att - ;; - a29khif) - basic_machine=a29k-amd - os=-udi - ;; - abacus) - basic_machine=abacus-unknown - ;; - adobe68k) - basic_machine=m68010-adobe - os=-scout - ;; - alliant | fx80) - basic_machine=fx80-alliant - ;; - altos | altos3068) - basic_machine=m68k-altos - ;; - am29k) - basic_machine=a29k-none - os=-bsd - ;; - amd64) - basic_machine=x86_64-pc - ;; - amd64-*) - basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - amdahl) - basic_machine=580-amdahl - os=-sysv - ;; - amiga | amiga-*) - basic_machine=m68k-unknown - ;; - amigaos | amigados) - basic_machine=m68k-unknown - os=-amigaos - ;; - amigaunix | amix) - basic_machine=m68k-unknown - os=-sysv4 - ;; - apollo68) - basic_machine=m68k-apollo - os=-sysv - ;; - apollo68bsd) - basic_machine=m68k-apollo - os=-bsd - ;; - aros) - basic_machine=i386-pc - os=-aros - ;; - aux) - basic_machine=m68k-apple - os=-aux - ;; - balance) - basic_machine=ns32k-sequent - os=-dynix - ;; - blackfin) - basic_machine=bfin-unknown - os=-linux - ;; - blackfin-*) - basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'` - os=-linux - ;; - bluegene*) - basic_machine=powerpc-ibm - os=-cnk - ;; - c54x-*) - basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - c55x-*) - basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - c6x-*) - basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - c90) - basic_machine=c90-cray - os=-unicos - ;; - cegcc) - basic_machine=arm-unknown - os=-cegcc - ;; - convex-c1) - basic_machine=c1-convex - os=-bsd - ;; - convex-c2) - basic_machine=c2-convex - os=-bsd - ;; - convex-c32) - basic_machine=c32-convex - os=-bsd - ;; - convex-c34) - basic_machine=c34-convex - os=-bsd - ;; - convex-c38) - basic_machine=c38-convex - os=-bsd - ;; - cray | j90) - basic_machine=j90-cray - os=-unicos - ;; - craynv) - basic_machine=craynv-cray - os=-unicosmp - ;; - cr16 | cr16-*) - basic_machine=cr16-unknown - os=-elf - ;; - crds | unos) - basic_machine=m68k-crds - ;; - crisv32 | crisv32-* | etraxfs*) - basic_machine=crisv32-axis - ;; - cris | cris-* | etrax*) - basic_machine=cris-axis - ;; - crx) - basic_machine=crx-unknown - os=-elf - ;; - da30 | da30-*) - basic_machine=m68k-da30 - ;; - decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) - basic_machine=mips-dec - ;; - decsystem10* | dec10*) - basic_machine=pdp10-dec - os=-tops10 - ;; - decsystem20* | dec20*) - basic_machine=pdp10-dec - os=-tops20 - ;; - delta | 3300 | motorola-3300 | motorola-delta \ - | 3300-motorola | delta-motorola) - basic_machine=m68k-motorola - ;; - delta88) - basic_machine=m88k-motorola - os=-sysv3 - ;; - dicos) - basic_machine=i686-pc - os=-dicos - ;; - djgpp) - basic_machine=i586-pc - os=-msdosdjgpp - ;; - dpx20 | dpx20-*) - basic_machine=rs6000-bull - os=-bosx - ;; - dpx2* | dpx2*-bull) - basic_machine=m68k-bull - os=-sysv3 - ;; - ebmon29k) - basic_machine=a29k-amd - os=-ebmon - ;; - elxsi) - basic_machine=elxsi-elxsi - os=-bsd - ;; - encore | umax | mmax) - basic_machine=ns32k-encore - ;; - es1800 | OSE68k | ose68k | ose | OSE) - basic_machine=m68k-ericsson - os=-ose - ;; - fx2800) - basic_machine=i860-alliant - ;; - genix) - basic_machine=ns32k-ns - ;; - gmicro) - basic_machine=tron-gmicro - os=-sysv - ;; - go32) - basic_machine=i386-pc - os=-go32 - ;; - h3050r* | hiux*) - basic_machine=hppa1.1-hitachi - os=-hiuxwe2 - ;; - h8300hms) - basic_machine=h8300-hitachi - os=-hms - ;; - h8300xray) - basic_machine=h8300-hitachi - os=-xray - ;; - h8500hms) - basic_machine=h8500-hitachi - os=-hms - ;; - harris) - basic_machine=m88k-harris - os=-sysv3 - ;; - hp300-*) - basic_machine=m68k-hp - ;; - hp300bsd) - basic_machine=m68k-hp - os=-bsd - ;; - hp300hpux) - basic_machine=m68k-hp - os=-hpux - ;; - hp3k9[0-9][0-9] | hp9[0-9][0-9]) - basic_machine=hppa1.0-hp - ;; - hp9k2[0-9][0-9] | hp9k31[0-9]) - basic_machine=m68000-hp - ;; - hp9k3[2-9][0-9]) - basic_machine=m68k-hp - ;; - hp9k6[0-9][0-9] | hp6[0-9][0-9]) - basic_machine=hppa1.0-hp - ;; - hp9k7[0-79][0-9] | hp7[0-79][0-9]) - basic_machine=hppa1.1-hp - ;; - hp9k78[0-9] | hp78[0-9]) - # FIXME: really hppa2.0-hp - basic_machine=hppa1.1-hp - ;; - hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) - # FIXME: really hppa2.0-hp - basic_machine=hppa1.1-hp - ;; - hp9k8[0-9][13679] | hp8[0-9][13679]) - basic_machine=hppa1.1-hp - ;; - hp9k8[0-9][0-9] | hp8[0-9][0-9]) - basic_machine=hppa1.0-hp - ;; - hppa-next) - os=-nextstep3 - ;; - hppaosf) - basic_machine=hppa1.1-hp - os=-osf - ;; - hppro) - basic_machine=hppa1.1-hp - os=-proelf - ;; - i370-ibm* | ibm*) - basic_machine=i370-ibm - ;; -# I'm not sure what "Sysv32" means. Should this be sysv3.2? - i*86v32) - basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` - os=-sysv32 - ;; - i*86v4*) - basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` - os=-sysv4 - ;; - i*86v) - basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` - os=-sysv - ;; - i*86sol2) - basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` - os=-solaris2 - ;; - i386mach) - basic_machine=i386-mach - os=-mach - ;; - i386-vsta | vsta) - basic_machine=i386-unknown - os=-vsta - ;; - iris | iris4d) - basic_machine=mips-sgi - case $os in - -irix*) - ;; - *) - os=-irix4 - ;; - esac - ;; - isi68 | isi) - basic_machine=m68k-isi - os=-sysv - ;; - m68knommu) - basic_machine=m68k-unknown - os=-linux - ;; - m68knommu-*) - basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'` - os=-linux - ;; - m88k-omron*) - basic_machine=m88k-omron - ;; - magnum | m3230) - basic_machine=mips-mips - os=-sysv - ;; - merlin) - basic_machine=ns32k-utek - os=-sysv - ;; - microblaze) - basic_machine=microblaze-xilinx - ;; - mingw32) - basic_machine=i386-pc - os=-mingw32 - ;; - mingw32ce) - basic_machine=arm-unknown - os=-mingw32ce - ;; - miniframe) - basic_machine=m68000-convergent - ;; - *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) - basic_machine=m68k-atari - os=-mint - ;; - mips3*-*) - basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` - ;; - mips3*) - basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown - ;; - monitor) - basic_machine=m68k-rom68k - os=-coff - ;; - morphos) - basic_machine=powerpc-unknown - os=-morphos - ;; - msdos) - basic_machine=i386-pc - os=-msdos - ;; - ms1-*) - basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` - ;; - mvs) - basic_machine=i370-ibm - os=-mvs - ;; - ncr3000) - basic_machine=i486-ncr - os=-sysv4 - ;; - netbsd386) - basic_machine=i386-unknown - os=-netbsd - ;; - netwinder) - basic_machine=armv4l-rebel - os=-linux - ;; - news | news700 | news800 | news900) - basic_machine=m68k-sony - os=-newsos - ;; - news1000) - basic_machine=m68030-sony - os=-newsos - ;; - news-3600 | risc-news) - basic_machine=mips-sony - os=-newsos - ;; - necv70) - basic_machine=v70-nec - os=-sysv - ;; - next | m*-next ) - basic_machine=m68k-next - case $os in - -nextstep* ) - ;; - -ns2*) - os=-nextstep2 - ;; - *) - os=-nextstep3 - ;; - esac - ;; - nh3000) - basic_machine=m68k-harris - os=-cxux - ;; - nh[45]000) - basic_machine=m88k-harris - os=-cxux - ;; - nindy960) - basic_machine=i960-intel - os=-nindy - ;; - mon960) - basic_machine=i960-intel - os=-mon960 - ;; - nonstopux) - basic_machine=mips-compaq - os=-nonstopux - ;; - np1) - basic_machine=np1-gould - ;; - neo-tandem) - basic_machine=neo-tandem - ;; - nse-tandem) - basic_machine=nse-tandem - ;; - nsr-tandem) - basic_machine=nsr-tandem - ;; - op50n-* | op60c-*) - basic_machine=hppa1.1-oki - os=-proelf - ;; - openrisc | openrisc-*) - basic_machine=or32-unknown - ;; - os400) - basic_machine=powerpc-ibm - os=-os400 - ;; - OSE68000 | ose68000) - basic_machine=m68000-ericsson - os=-ose - ;; - os68k) - basic_machine=m68k-none - os=-os68k - ;; - pa-hitachi) - basic_machine=hppa1.1-hitachi - os=-hiuxwe2 - ;; - paragon) - basic_machine=i860-intel - os=-osf - ;; - parisc) - basic_machine=hppa-unknown - os=-linux - ;; - parisc-*) - basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'` - os=-linux - ;; - pbd) - basic_machine=sparc-tti - ;; - pbb) - basic_machine=m68k-tti - ;; - pc532 | pc532-*) - basic_machine=ns32k-pc532 - ;; - pc98) - basic_machine=i386-pc - ;; - pc98-*) - basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - pentium | p5 | k5 | k6 | nexgen | viac3) - basic_machine=i586-pc - ;; - pentiumpro | p6 | 6x86 | athlon | athlon_*) - basic_machine=i686-pc - ;; - pentiumii | pentium2 | pentiumiii | pentium3) - basic_machine=i686-pc - ;; - pentium4) - basic_machine=i786-pc - ;; - pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) - basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - pentiumpro-* | p6-* | 6x86-* | athlon-*) - basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) - basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - pentium4-*) - basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - pn) - basic_machine=pn-gould - ;; - power) basic_machine=power-ibm - ;; - ppc | ppcbe) basic_machine=powerpc-unknown - ;; - ppc-* | ppcbe-*) - basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - ppcle | powerpclittle | ppc-le | powerpc-little) - basic_machine=powerpcle-unknown - ;; - ppcle-* | powerpclittle-*) - basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - ppc64) basic_machine=powerpc64-unknown - ;; - ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - ppc64le | powerpc64little | ppc64-le | powerpc64-little) - basic_machine=powerpc64le-unknown - ;; - ppc64le-* | powerpc64little-*) - basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - ps2) - basic_machine=i386-ibm - ;; - pw32) - basic_machine=i586-unknown - os=-pw32 - ;; - rdos) - basic_machine=i386-pc - os=-rdos - ;; - rom68k) - basic_machine=m68k-rom68k - os=-coff - ;; - rm[46]00) - basic_machine=mips-siemens - ;; - rtpc | rtpc-*) - basic_machine=romp-ibm - ;; - s390 | s390-*) - basic_machine=s390-ibm - ;; - s390x | s390x-*) - basic_machine=s390x-ibm - ;; - sa29200) - basic_machine=a29k-amd - os=-udi - ;; - sb1) - basic_machine=mipsisa64sb1-unknown - ;; - sb1el) - basic_machine=mipsisa64sb1el-unknown - ;; - sde) - basic_machine=mipsisa32-sde - os=-elf - ;; - sei) - basic_machine=mips-sei - os=-seiux - ;; - sequent) - basic_machine=i386-sequent - ;; - sh) - basic_machine=sh-hitachi - os=-hms - ;; - sh5el) - basic_machine=sh5le-unknown - ;; - sh64) - basic_machine=sh64-unknown - ;; - sparclite-wrs | simso-wrs) - basic_machine=sparclite-wrs - os=-vxworks - ;; - sps7) - basic_machine=m68k-bull - os=-sysv2 - ;; - spur) - basic_machine=spur-unknown - ;; - st2000) - basic_machine=m68k-tandem - ;; - stratus) - basic_machine=i860-stratus - os=-sysv4 - ;; - strongarm-* | thumb-*) - basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - sun2) - basic_machine=m68000-sun - ;; - sun2os3) - basic_machine=m68000-sun - os=-sunos3 - ;; - sun2os4) - basic_machine=m68000-sun - os=-sunos4 - ;; - sun3os3) - basic_machine=m68k-sun - os=-sunos3 - ;; - sun3os4) - basic_machine=m68k-sun - os=-sunos4 - ;; - sun4os3) - basic_machine=sparc-sun - os=-sunos3 - ;; - sun4os4) - basic_machine=sparc-sun - os=-sunos4 - ;; - sun4sol2) - basic_machine=sparc-sun - os=-solaris2 - ;; - sun3 | sun3-*) - basic_machine=m68k-sun - ;; - sun4) - basic_machine=sparc-sun - ;; - sun386 | sun386i | roadrunner) - basic_machine=i386-sun - ;; - sv1) - basic_machine=sv1-cray - os=-unicos - ;; - symmetry) - basic_machine=i386-sequent - os=-dynix - ;; - t3e) - basic_machine=alphaev5-cray - os=-unicos - ;; - t90) - basic_machine=t90-cray - os=-unicos - ;; - # This must be matched before tile*. - tilegx*) - basic_machine=tilegx-unknown - os=-linux-gnu - ;; - tile*) - basic_machine=tile-unknown - os=-linux-gnu - ;; - tx39) - basic_machine=mipstx39-unknown - ;; - tx39el) - basic_machine=mipstx39el-unknown - ;; - toad1) - basic_machine=pdp10-xkl - os=-tops20 - ;; - tower | tower-32) - basic_machine=m68k-ncr - ;; - tpf) - basic_machine=s390x-ibm - os=-tpf - ;; - udi29k) - basic_machine=a29k-amd - os=-udi - ;; - ultra3) - basic_machine=a29k-nyu - os=-sym1 - ;; - v810 | necv810) - basic_machine=v810-nec - os=-none - ;; - vaxv) - basic_machine=vax-dec - os=-sysv - ;; - vms) - basic_machine=vax-dec - os=-vms - ;; - vpp*|vx|vx-*) - basic_machine=f301-fujitsu - ;; - vxworks960) - basic_machine=i960-wrs - os=-vxworks - ;; - vxworks68) - basic_machine=m68k-wrs - os=-vxworks - ;; - vxworks29k) - basic_machine=a29k-wrs - os=-vxworks - ;; - w65*) - basic_machine=w65-wdc - os=-none - ;; - w89k-*) - basic_machine=hppa1.1-winbond - os=-proelf - ;; - xbox) - basic_machine=i686-pc - os=-mingw32 - ;; - xps | xps100) - basic_machine=xps100-honeywell - ;; - xscale-* | xscalee[bl]-*) - basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'` - ;; - ymp) - basic_machine=ymp-cray - os=-unicos - ;; - z8k-*-coff) - basic_machine=z8k-unknown - os=-sim - ;; - z80-*-coff) - basic_machine=z80-unknown - os=-sim - ;; - none) - basic_machine=none-none - os=-none - ;; - -# Here we handle the default manufacturer of certain CPU types. It is in -# some cases the only manufacturer, in others, it is the most popular. - w89k) - basic_machine=hppa1.1-winbond - ;; - op50n) - basic_machine=hppa1.1-oki - ;; - op60c) - basic_machine=hppa1.1-oki - ;; - romp) - basic_machine=romp-ibm - ;; - mmix) - basic_machine=mmix-knuth - ;; - rs6000) - basic_machine=rs6000-ibm - ;; - vax) - basic_machine=vax-dec - ;; - pdp10) - # there are many clones, so DEC is not a safe bet - basic_machine=pdp10-unknown - ;; - pdp11) - basic_machine=pdp11-dec - ;; - we32k) - basic_machine=we32k-att - ;; - sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele) - basic_machine=sh-unknown - ;; - sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) - basic_machine=sparc-sun - ;; - cydra) - basic_machine=cydra-cydrome - ;; - orion) - basic_machine=orion-highlevel - ;; - orion105) - basic_machine=clipper-highlevel - ;; - mac | mpw | mac-mpw) - basic_machine=m68k-apple - ;; - pmac | pmac-mpw) - basic_machine=powerpc-apple - ;; - *-unknown) - # Make sure to match an already-canonicalized machine name. - ;; - *) - echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 - exit 1 - ;; -esac - -# Here we canonicalize certain aliases for manufacturers. -case $basic_machine in - *-digital*) - basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` - ;; - *-commodore*) - basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` - ;; - *) - ;; -esac - -# Decode manufacturer-specific aliases for certain operating systems. - -if [ x"$os" != x"" ] -then -case $os in - # First match some system type aliases - # that might get confused with valid system types. - # -solaris* is a basic system type, with this one exception. - -auroraux) - os=-auroraux - ;; - -solaris1 | -solaris1.*) - os=`echo $os | sed -e 's|solaris1|sunos4|'` - ;; - -solaris) - os=-solaris2 - ;; - -svr4*) - os=-sysv4 - ;; - -unixware*) - os=-sysv4.2uw - ;; - -gnu/linux*) - os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` - ;; - # First accept the basic system types. - # The portable systems comes first. - # Each alternative MUST END IN A *, to match a version number. - # -sysv* is not here because it comes later, after sysvr4. - -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ - | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\ - | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \ - | -sym* | -kopensolaris* \ - | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ - | -aos* | -aros* \ - | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ - | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ - | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ - | -openbsd* | -solidbsd* \ - | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ - | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ - | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ - | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ - | -chorusos* | -chorusrdb* | -cegcc* \ - | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ - | -mingw32* | -linux-gnu* | -linux-android* \ - | -linux-newlib* | -linux-uclibc* \ - | -uxpv* | -beos* | -mpeix* | -udk* \ - | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ - | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ - | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ - | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ - | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ - | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ - | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es*) - # Remember, each alternative MUST END IN *, to match a version number. - ;; - -qnx*) - case $basic_machine in - x86-* | i*86-*) - ;; - *) - os=-nto$os - ;; - esac - ;; - -nto-qnx*) - ;; - -nto*) - os=`echo $os | sed -e 's|nto|nto-qnx|'` - ;; - -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ - | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ - | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) - ;; - -mac*) - os=`echo $os | sed -e 's|mac|macos|'` - ;; - -linux-dietlibc) - os=-linux-dietlibc - ;; - -linux*) - os=`echo $os | sed -e 's|linux|linux-gnu|'` - ;; - -sunos5*) - os=`echo $os | sed -e 's|sunos5|solaris2|'` - ;; - -sunos6*) - os=`echo $os | sed -e 's|sunos6|solaris3|'` - ;; - -opened*) - os=-openedition - ;; - -os400*) - os=-os400 - ;; - -wince*) - os=-wince - ;; - -osfrose*) - os=-osfrose - ;; - -osf*) - os=-osf - ;; - -utek*) - os=-bsd - ;; - -dynix*) - os=-bsd - ;; - -acis*) - os=-aos - ;; - -atheos*) - os=-atheos - ;; - -syllable*) - os=-syllable - ;; - -386bsd) - os=-bsd - ;; - -ctix* | -uts*) - os=-sysv - ;; - -nova*) - os=-rtmk-nova - ;; - -ns2 ) - os=-nextstep2 - ;; - -nsk*) - os=-nsk - ;; - # Preserve the version number of sinix5. - -sinix5.*) - os=`echo $os | sed -e 's|sinix|sysv|'` - ;; - -sinix*) - os=-sysv4 - ;; - -tpf*) - os=-tpf - ;; - -triton*) - os=-sysv3 - ;; - -oss*) - os=-sysv3 - ;; - -svr4) - os=-sysv4 - ;; - -svr3) - os=-sysv3 - ;; - -sysvr4) - os=-sysv4 - ;; - # This must come after -sysvr4. - -sysv*) - ;; - -ose*) - os=-ose - ;; - -es1800*) - os=-ose - ;; - -xenix) - os=-xenix - ;; - -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) - os=-mint - ;; - -aros*) - os=-aros - ;; - -kaos*) - os=-kaos - ;; - -zvmoe) - os=-zvmoe - ;; - -dicos*) - os=-dicos - ;; - -nacl*) - ;; - -none) - ;; - *) - # Get rid of the `-' at the beginning of $os. - os=`echo $os | sed 's/[^-]*-//'` - echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 - exit 1 - ;; -esac -else - -# Here we handle the default operating systems that come with various machines. -# The value should be what the vendor currently ships out the door with their -# machine or put another way, the most popular os provided with the machine. - -# Note that if you're going to try to match "-MANUFACTURER" here (say, -# "-sun"), then you have to tell the case statement up towards the top -# that MANUFACTURER isn't an operating system. Otherwise, code above -# will signal an error saying that MANUFACTURER isn't an operating -# system, and we'll never get to this point. - -case $basic_machine in - score-*) - os=-elf - ;; - spu-*) - os=-elf - ;; - *-acorn) - os=-riscix1.2 - ;; - arm*-rebel) - os=-linux - ;; - arm*-semi) - os=-aout - ;; - c4x-* | tic4x-*) - os=-coff - ;; - tic54x-*) - os=-coff - ;; - tic55x-*) - os=-coff - ;; - tic6x-*) - os=-coff - ;; - # This must come before the *-dec entry. - pdp10-*) - os=-tops20 - ;; - pdp11-*) - os=-none - ;; - *-dec | vax-*) - os=-ultrix4.2 - ;; - m68*-apollo) - os=-domain - ;; - i386-sun) - os=-sunos4.0.2 - ;; - m68000-sun) - os=-sunos3 - # This also exists in the configure program, but was not the - # default. - # os=-sunos4 - ;; - m68*-cisco) - os=-aout - ;; - mep-*) - os=-elf - ;; - mips*-cisco) - os=-elf - ;; - mips*-*) - os=-elf - ;; - or32-*) - os=-coff - ;; - *-tti) # must be before sparc entry or we get the wrong os. - os=-sysv3 - ;; - sparc-* | *-sun) - os=-sunos4.1.1 - ;; - *-be) - os=-beos - ;; - *-haiku) - os=-haiku - ;; - *-ibm) - os=-aix - ;; - *-knuth) - os=-mmixware - ;; - *-wec) - os=-proelf - ;; - *-winbond) - os=-proelf - ;; - *-oki) - os=-proelf - ;; - *-hp) - os=-hpux - ;; - *-hitachi) - os=-hiux - ;; - i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) - os=-sysv - ;; - *-cbm) - os=-amigaos - ;; - *-dg) - os=-dgux - ;; - *-dolphin) - os=-sysv3 - ;; - m68k-ccur) - os=-rtu - ;; - m88k-omron*) - os=-luna - ;; - *-next ) - os=-nextstep - ;; - *-sequent) - os=-ptx - ;; - *-crds) - os=-unos - ;; - *-ns) - os=-genix - ;; - i370-*) - os=-mvs - ;; - *-next) - os=-nextstep3 - ;; - *-gould) - os=-sysv - ;; - *-highlevel) - os=-bsd - ;; - *-encore) - os=-bsd - ;; - *-sgi) - os=-irix - ;; - *-siemens) - os=-sysv4 - ;; - *-masscomp) - os=-rtu - ;; - f30[01]-fujitsu | f700-fujitsu) - os=-uxpv - ;; - *-rom68k) - os=-coff - ;; - *-*bug) - os=-coff - ;; - *-apple) - os=-macos - ;; - *-atari*) - os=-mint - ;; - *) - os=-none - ;; -esac -fi - -# Here we handle the case where we know the os, and the CPU type, but not the -# manufacturer. We pick the logical manufacturer. -vendor=unknown -case $basic_machine in - *-unknown) - case $os in - -riscix*) - vendor=acorn - ;; - -sunos*) - vendor=sun - ;; - -cnk*|-aix*) - vendor=ibm - ;; - -beos*) - vendor=be - ;; - -hpux*) - vendor=hp - ;; - -mpeix*) - vendor=hp - ;; - -hiux*) - vendor=hitachi - ;; - -unos*) - vendor=crds - ;; - -dgux*) - vendor=dg - ;; - -luna*) - vendor=omron - ;; - -genix*) - vendor=ns - ;; - -mvs* | -opened*) - vendor=ibm - ;; - -os400*) - vendor=ibm - ;; - -ptx*) - vendor=sequent - ;; - -tpf*) - vendor=ibm - ;; - -vxsim* | -vxworks* | -windiss*) - vendor=wrs - ;; - -aux*) - vendor=apple - ;; - -hms*) - vendor=hitachi - ;; - -mpw* | -macos*) - vendor=apple - ;; - -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) - vendor=atari - ;; - -vos*) - vendor=stratus - ;; - esac - basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` - ;; -esac - -echo $basic_machine$os -exit - -# Local variables: -# eval: (add-hook 'write-file-hooks 'time-stamp) -# time-stamp-start: "timestamp='" -# time-stamp-format: "%:y-%02m-%02d" -# time-stamp-end: "'" -# End: diff -Nru sphinxsearch-0.9.9+2.0.2beta/configure sphinxsearch-2.0.4/configure --- sphinxsearch-0.9.9+2.0.2beta/configure 2011-11-15 22:35:53.000000000 +0000 +++ sphinxsearch-2.0.4/configure 2012-03-01 09:04:19.000000000 +0000 @@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.65 for sphinx 2.0.2. +# Generated by GNU Autoconf 2.65 for sphinx 2.0.4. # # Report bugs to . # @@ -552,8 +552,8 @@ # Identity of this package. PACKAGE_NAME='sphinx' PACKAGE_TARNAME='sphinx' -PACKAGE_VERSION='2.0.2' -PACKAGE_STRING='sphinx 2.0.2' +PACKAGE_VERSION='2.0.4' +PACKAGE_STRING='sphinx 2.0.4' PACKAGE_BUGREPORT='shodan(at)sphinxsearch.com' PACKAGE_URL='' @@ -1273,7 +1273,7 @@ # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -\`configure' configures sphinx 2.0.2 to adapt to many kinds of systems. +\`configure' configures sphinx 2.0.4 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1339,7 +1339,7 @@ if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of sphinx 2.0.2:";; + short | recursive ) echo "Configuration of sphinx 2.0.4:";; esac cat <<\_ACEOF @@ -1451,7 +1451,7 @@ test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -sphinx configure 2.0.2 +sphinx configure 2.0.4 generated by GNU Autoconf 2.65 Copyright (C) 2009 Free Software Foundation, Inc. @@ -1956,7 +1956,7 @@ This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by sphinx $as_me 2.0.2, which was +It was created by sphinx $as_me 2.0.4, which was generated by GNU Autoconf 2.65. Invocation command line was $ $0 $@ @@ -2340,7 +2340,7 @@ ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. -am__api_version='2.0.2' +am__api_version='2.0.4' # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or @@ -2778,7 +2778,7 @@ # Define the identity of the package. PACKAGE='sphinx' - VERSION='2.0.2' + VERSION='2.0.4' cat >>confdefs.h <<_ACEOF @@ -8446,7 +8446,7 @@ # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by sphinx $as_me 2.0.2, which was +This file was extended by sphinx $as_me 2.0.4, which was generated by GNU Autoconf 2.65. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -8512,7 +8512,7 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ -sphinx config.status 2.0.2 +sphinx config.status 2.0.4 configured by $0, generated by GNU Autoconf 2.65, with options \\"\$ac_cs_config\\" diff -Nru sphinxsearch-0.9.9+2.0.2beta/configure.ac sphinxsearch-2.0.4/configure.ac --- sphinxsearch-0.9.9+2.0.2beta/configure.ac 2011-11-15 22:35:53.000000000 +0000 +++ sphinxsearch-2.0.4/configure.ac 2012-03-01 09:04:19.000000000 +0000 @@ -1,7 +1,7 @@ dnl Process this file with autoconf to produce a configure script. AC_PREREQ(2.59) -AC_INIT([sphinx], [2.0.2], [shodan(at)sphinxsearch.com]) +AC_INIT([sphinx], [2.0.4], [shodan(at)sphinxsearch.com]) dnl -------------------------------------------------------------------------- diff -Nru sphinxsearch-0.9.9+2.0.2beta/debian/changelog sphinxsearch-2.0.4/debian/changelog --- sphinxsearch-0.9.9+2.0.2beta/debian/changelog 2012-04-05 17:12:37.000000000 +0000 +++ sphinxsearch-2.0.4/debian/changelog 2012-04-05 16:29:03.000000000 +0000 @@ -1,3 +1,19 @@ +sphinxsearch (2.0.4-0ubuntu1) precise; urgency=low + + * New upstream release (LP: #930747) + * Remove explicit depends on libmysqlcient16 (LP: #974427) + + -- Clint Byrum Thu, 05 Apr 2012 09:25:55 -0700 + +sphinxsearch (2.0.3-1) unstable; urgency=low + + * New upstream release. + * Upstream release fixes case when omitting mem_limit + generates a spurious warning. (closes: #647815) + * Migrated from dpatch to quilt. + + -- Radu Spineanu Tue, 10 Jan 2012 08:15:19 +0000 + sphinxsearch (0.9.9+2.0.2beta-1) unstable; urgency=low * New upstream release. (2.0.2beta) diff -Nru sphinxsearch-0.9.9+2.0.2beta/debian/control sphinxsearch-2.0.4/debian/control --- sphinxsearch-0.9.9+2.0.2beta/debian/control 2012-04-05 17:12:37.000000000 +0000 +++ sphinxsearch-2.0.4/debian/control 2012-04-05 16:30:25.000000000 +0000 @@ -1,13 +1,14 @@ Source: sphinxsearch Section: misc Priority: optional -Maintainer: Radu Spineanu -Build-Depends: debhelper (>= 7), autotools-dev, gawk, libmysqlclient-dev, dpatch, libpq-dev, autoconf, libtool, automake, docbook-to-man, libexpat-dev, libstemmer-dev, dh-autoreconf, adduser +Maintainer: Ubuntu Developers +XSBC-Original-Maintainer: Radu Spineanu +Build-Depends: debhelper (>= 7.0.50), autotools-dev, gawk, libmysqlclient-dev, libpq-dev, autoconf, libtool, automake, docbook-to-man, libexpat-dev, libstemmer-dev, dh-autoreconf, adduser Standards-Version: 3.9.2 Package: sphinxsearch Architecture: any -Depends: ${shlibs:Depends}, ${misc:Depends}, libmysqlclient16, adduser +Depends: ${shlibs:Depends}, ${misc:Depends}, adduser Description: Fast standalone full-text SQL search engine Sphinx is a standalone full text search engine, meant to provide fast, size-efficient and relevant fulltext search functions to other applications. diff -Nru sphinxsearch-0.9.9+2.0.2beta/debian/patches/00list sphinxsearch-2.0.4/debian/patches/00list --- sphinxsearch-0.9.9+2.0.2beta/debian/patches/00list 2012-04-05 17:12:37.000000000 +0000 +++ sphinxsearch-2.0.4/debian/patches/00list 1970-01-01 00:00:00.000000000 +0000 @@ -1,4 +0,0 @@ -01_Makefile_am.dpatch -02_sphinx.conf.dpatch -03_alpha -04_libstemmer diff -Nru sphinxsearch-0.9.9+2.0.2beta/debian/patches/01_Makefile_am.dpatch sphinxsearch-2.0.4/debian/patches/01_Makefile_am.dpatch --- sphinxsearch-0.9.9+2.0.2beta/debian/patches/01_Makefile_am.dpatch 2012-04-05 17:12:37.000000000 +0000 +++ sphinxsearch-2.0.4/debian/patches/01_Makefile_am.dpatch 1970-01-01 00:00:00.000000000 +0000 @@ -1,16 +0,0 @@ -#! /bin/sh /usr/share/dpatch/dpatch-run -## 01_Makefile_am.dpatch by -## -## All lines beginning with `## DP:' are a description of the patch. -## DP: Change the locations built by install-data-hook to match debian install. - -@DPATCH@ -diff -urNad trunk~/Makefile.am trunk/Makefile.am ---- trunk~/Makefile.am 2008-02-18 13:20:26.000000000 -0800 -+++ trunk/Makefile.am 2008-02-18 13:21:51.000000000 -0800 -@@ -8,4 +8,4 @@ - sysconf_DATA = sphinx.conf.dist example.sql - - install-data-hook: -- mkdir -p $(DESTDIR)$(localstatedir)/data && mkdir -p $(DESTDIR)$(localstatedir)/log -+ mkdir -p $(DESTDIR)$(localstatedir) diff -Nru sphinxsearch-0.9.9+2.0.2beta/debian/patches/01_Makefile_am.patch sphinxsearch-2.0.4/debian/patches/01_Makefile_am.patch --- sphinxsearch-0.9.9+2.0.2beta/debian/patches/01_Makefile_am.patch 1970-01-01 00:00:00.000000000 +0000 +++ sphinxsearch-2.0.4/debian/patches/01_Makefile_am.patch 2012-01-10 09:04:15.000000000 +0000 @@ -0,0 +1,10 @@ +Author: +Description: Change the locations built by install-data-hook to match debian install. +--- a/Makefile.am ++++ b/Makefile.am +@@ -8,4 +8,4 @@ + sysconf_DATA = sphinx.conf.dist sphinx-min.conf.dist example.sql + + install-data-hook: +- mkdir -p $(DESTDIR)$(localstatedir)/data && mkdir -p $(DESTDIR)$(localstatedir)/log ++ mkdir -p $(DESTDIR)$(localstatedir) diff -Nru sphinxsearch-0.9.9+2.0.2beta/debian/patches/02_sphinx.conf.dpatch sphinxsearch-2.0.4/debian/patches/02_sphinx.conf.dpatch --- sphinxsearch-0.9.9+2.0.2beta/debian/patches/02_sphinx.conf.dpatch 2012-04-05 17:12:37.000000000 +0000 +++ sphinxsearch-2.0.4/debian/patches/02_sphinx.conf.dpatch 1970-01-01 00:00:00.000000000 +0000 @@ -1,148 +0,0 @@ -#! /bin/sh /usr/share/dpatch/dpatch-run -## 02_sphinx.conf.dpatch by , modified by Radu Spineanu -## -## All lines beginning with `## DP:' are a description of the patch. -## DP: Changed default locations to match debian locations. - -@DPATCH@ -diff -Naur sphinx-2.0.1-beta-old/sphinx.conf.in sphinx-2.0.1-beta/sphinx.conf.in ---- sphinx-2.0.1-beta-old/sphinx.conf.in 2011-04-18 14:39:40.000000000 +0000 -+++ sphinx-2.0.1-beta/sphinx.conf.in 2011-10-08 15:41:02.815584813 +0000 -@@ -270,7 +270,7 @@ - # shell command to invoke xmlpipe stream producer - # mandatory - # -- # xmlpipe_command = cat @CONFDIR@/test.xml -+ # xmlpipe_command = cat @localstatedir@/test.xml - - # xmlpipe2 field declaration - # multi-value, optional, default is empty -@@ -328,7 +328,7 @@ - - # index files path and file name, without extension - # mandatory, path must be writable, extensions will be auto-appended -- path = @CONFDIR@/data/test1 -+ path = @localstatedir@/data/test1 - - # document attribute values (docinfo) storage mode - # optional, default is 'extern' -@@ -363,13 +363,13 @@ - # optional, default is empty - # contents are plain text, charset_table and stemming are both applied - # -- # stopwords = @CONFDIR@/data/stopwords.txt -+ # stopwords = @localstatedir@/data/stopwords.txt - - - # wordforms file, in "mapfrom > mapto" plain text format - # optional, default is empty - # -- # wordforms = @CONFDIR@/data/wordforms.txt -+ # wordforms = @localstatedir@/data/wordforms.txt - - - # tokenizing exceptions file -@@ -378,7 +378,7 @@ - # plain text, case sensitive, space insensitive in map-from part - # one "Map Several Words => ToASingleOne" entry per line - # -- # exceptions = @CONFDIR@/data/exceptions.txt -+ # exceptions = @localstatedir@/data/exceptions.txt - - - # minimum indexed word length -@@ -577,7 +577,7 @@ - # and may then be overridden in this index definition - index test1stemmed : test1 - { -- path = @CONFDIR@/data/test1stemmed -+ path = @localstatedir@/data/test1stemmed - morphology = stem_en - } - -@@ -631,7 +631,7 @@ - - # index files path and file name, without extension - # mandatory, path must be writable, extensions will be auto-appended -- path = @CONFDIR@/data/rt -+ path = @localstatedir@/data/rt - - # RAM chunk size limit - # RT index will keep at most this much data in RAM, then flush to disk -@@ -721,11 +721,11 @@ - - # log file, searchd run info is logged here - # optional, default is 'searchd.log' -- log = @CONFDIR@/log/searchd.log -+ log = /var/log/sphinxsearch/searchd.log - - # query log file, all search queries are logged here - # optional, default is empty (do not log queries) -- query_log = @CONFDIR@/log/query.log -+ query_log = /var/log/sphinxsearch/query.log - - # client read timeout, seconds - # optional, default is 5 -@@ -741,7 +741,7 @@ - - # PID file, searchd process ID file name - # mandatory -- pid_file = @CONFDIR@/log/searchd.pid -+ pid_file = /var/run/sphinxsearch/searchd.pid - - # max amount of matches the daemon ever keeps in RAM, per-index - # WARNING, THERE'S ALSO PER-QUERY LIMIT, SEE SetLimits() API CALL -@@ -787,7 +787,7 @@ - # searchd will (try to) log crashed query to 'crash_log_path.PID' file - # optional, default is empty (do not create crash logs) - # -- # crash_log_path = @CONFDIR@/log/crash -+ # crash_log_path = /var/log/sphinxsearch/crash - - - # max allowed per-query filter count -@@ -852,7 +852,7 @@ - # optional, default is build-time configured data directory - # - # binlog_path = # disable logging -- # binlog_path = @CONFDIR@/data # binlog.001 etc will be created there -+ # binlog_path = @localstatedir@/data # binlog.001 etc will be created there - - - # binlog flush/sync mode -diff -Naur sphinx-2.0.1-beta-old/sphinx-min.conf.in sphinx-2.0.1-beta/sphinx-min.conf.in ---- sphinx-2.0.1-beta-old/sphinx-min.conf.in 2011-04-18 14:39:40.000000000 +0000 -+++ sphinx-2.0.1-beta/sphinx-min.conf.in 2011-10-08 15:40:58.031584814 +0000 -@@ -26,7 +26,7 @@ - index test1 - { - source = src1 -- path = @CONFDIR@/data/test1 -+ path = @localstatedir@/data/test1 - docinfo = extern - charset_type = sbcs - } -@@ -37,7 +37,7 @@ - type = rt - rt_mem_limit = 32M - -- path = @CONFDIR@/data/testrt -+ path = @localstatedir@/data/testrt - charset_type = utf-8 - - rt_field = title -@@ -56,11 +56,11 @@ - { - listen = 9312 - listen = 9306:mysql41 -- log = @CONFDIR@/log/searchd.log -- query_log = @CONFDIR@/log/query.log -+ log = /var/log/sphinxsearch/searchd.log -+ query_log = /var/log/sphinxsearch/query.log - read_timeout = 5 - max_children = 30 -- pid_file = @CONFDIR@/log/searchd.pid -+ pid_file = /var/run/sphinxsearch/searchd.pid - max_matches = 1000 - seamless_rotate = 1 - preopen_indexes = 1 diff -Nru sphinxsearch-0.9.9+2.0.2beta/debian/patches/02_sphinx.conf.patch sphinxsearch-2.0.4/debian/patches/02_sphinx.conf.patch --- sphinxsearch-0.9.9+2.0.2beta/debian/patches/02_sphinx.conf.patch 1970-01-01 00:00:00.000000000 +0000 +++ sphinxsearch-2.0.4/debian/patches/02_sphinx.conf.patch 2012-01-10 09:04:15.000000000 +0000 @@ -0,0 +1,141 @@ +Author: , modified by Radu Spineanu +Description: Changed default locations to match debian locations. +--- a/sphinx.conf.in ++++ b/sphinx.conf.in +@@ -270,7 +270,7 @@ + # shell command to invoke xmlpipe stream producer + # mandatory + # +- # xmlpipe_command = cat @CONFDIR@/test.xml ++ # xmlpipe_command = cat @localstatedir@/test.xml + + # xmlpipe2 field declaration + # multi-value, optional, default is empty +@@ -328,7 +328,7 @@ + + # index files path and file name, without extension + # mandatory, path must be writable, extensions will be auto-appended +- path = @CONFDIR@/data/test1 ++ path = @localstatedir@/data/test1 + + # document attribute values (docinfo) storage mode + # optional, default is 'extern' +@@ -363,13 +363,13 @@ + # optional, default is empty + # contents are plain text, charset_table and stemming are both applied + # +- # stopwords = @CONFDIR@/data/stopwords.txt ++ # stopwords = @localstatedir@/data/stopwords.txt + + + # wordforms file, in "mapfrom > mapto" plain text format + # optional, default is empty + # +- # wordforms = @CONFDIR@/data/wordforms.txt ++ # wordforms = @localstatedir@/data/wordforms.txt + + + # tokenizing exceptions file +@@ -378,7 +378,7 @@ + # plain text, case sensitive, space insensitive in map-from part + # one "Map Several Words => ToASingleOne" entry per line + # +- # exceptions = @CONFDIR@/data/exceptions.txt ++ # exceptions = @localstatedir@/data/exceptions.txt + + + # minimum indexed word length +@@ -577,7 +577,7 @@ + # and may then be overridden in this index definition + index test1stemmed : test1 + { +- path = @CONFDIR@/data/test1stemmed ++ path = @localstatedir@/data/test1stemmed + morphology = stem_en + } + +@@ -631,7 +631,7 @@ + + # index files path and file name, without extension + # mandatory, path must be writable, extensions will be auto-appended +- path = @CONFDIR@/data/rt ++ path = @localstatedir@/data/rt + + # RAM chunk size limit + # RT index will keep at most this much data in RAM, then flush to disk +@@ -721,11 +721,11 @@ + + # log file, searchd run info is logged here + # optional, default is 'searchd.log' +- log = @CONFDIR@/log/searchd.log ++ log = /var/log/sphinxsearch/searchd.log + + # query log file, all search queries are logged here + # optional, default is empty (do not log queries) +- query_log = @CONFDIR@/log/query.log ++ query_log = /var/log/sphinxsearch/query.log + + # client read timeout, seconds + # optional, default is 5 +@@ -741,7 +741,7 @@ + + # PID file, searchd process ID file name + # mandatory +- pid_file = @CONFDIR@/log/searchd.pid ++ pid_file = /var/run/sphinxsearch/searchd.pid + + # max amount of matches the daemon ever keeps in RAM, per-index + # WARNING, THERE'S ALSO PER-QUERY LIMIT, SEE SetLimits() API CALL +@@ -787,7 +787,7 @@ + # searchd will (try to) log crashed query to 'crash_log_path.PID' file + # optional, default is empty (do not create crash logs) + # +- # crash_log_path = @CONFDIR@/log/crash ++ # crash_log_path = /var/log/sphinxsearch/crash + + + # max allowed per-query filter count +@@ -852,7 +852,7 @@ + # optional, default is build-time configured data directory + # + # binlog_path = # disable logging +- # binlog_path = @CONFDIR@/data # binlog.001 etc will be created there ++ # binlog_path = @localstatedir@/data # binlog.001 etc will be created there + + + # binlog flush/sync mode +--- a/sphinx-min.conf.in ++++ b/sphinx-min.conf.in +@@ -26,7 +26,7 @@ + index test1 + { + source = src1 +- path = @CONFDIR@/data/test1 ++ path = @localstatedir@/data/test1 + docinfo = extern + charset_type = sbcs + } +@@ -37,7 +37,7 @@ + type = rt + rt_mem_limit = 32M + +- path = @CONFDIR@/data/testrt ++ path = @localstatedir@/data/testrt + charset_type = utf-8 + + rt_field = title +@@ -56,11 +56,11 @@ + { + listen = 9312 + listen = 9306:mysql41 +- log = @CONFDIR@/log/searchd.log +- query_log = @CONFDIR@/log/query.log ++ log = /var/log/sphinxsearch/searchd.log ++ query_log = /var/log/sphinxsearch/query.log + read_timeout = 5 + max_children = 30 +- pid_file = @CONFDIR@/log/searchd.pid ++ pid_file = /var/run/sphinxsearch/searchd.pid + max_matches = 1000 + seamless_rotate = 1 + preopen_indexes = 1 diff -Nru sphinxsearch-0.9.9+2.0.2beta/debian/patches/03_alpha.dpatch sphinxsearch-2.0.4/debian/patches/03_alpha.dpatch --- sphinxsearch-0.9.9+2.0.2beta/debian/patches/03_alpha.dpatch 2012-04-05 17:12:37.000000000 +0000 +++ sphinxsearch-2.0.4/debian/patches/03_alpha.dpatch 1970-01-01 00:00:00.000000000 +0000 @@ -1,19 +0,0 @@ -#! /bin/sh /usr/share/dpatch/dpatch-run -## 03_alpha.dpatch by Julian Cristau jcristau@debian.org -## -## All lines beginning with `## DP:' are a description of the patch. -## DP: Fix alpha build ( #564620 ) - -@DPATCH@ -diff -Naur sphinx-2.0.2-beta.old/src/searchd.cpp sphinx-2.0.2-beta/src/searchd.cpp ---- sphinx-2.0.2-beta.old/src/searchd.cpp 2011-12-01 16:28:18.598386855 +0000 -+++ sphinx-2.0.2-beta/src/searchd.cpp 2011-12-01 17:27:19.374541795 +0000 -@@ -14753,8 +14753,6 @@ - CheckFlush (); - CheckChildrenTerm(); - -- sphInfo ( NULL ); // flush dupes -- - if ( pAcceptMutex ) - { - // FIXME! what if all children are busy; we might want to accept here and temp fork more diff -Nru sphinxsearch-0.9.9+2.0.2beta/debian/patches/03_alpha.patch sphinxsearch-2.0.4/debian/patches/03_alpha.patch --- sphinxsearch-0.9.9+2.0.2beta/debian/patches/03_alpha.patch 1970-01-01 00:00:00.000000000 +0000 +++ sphinxsearch-2.0.4/debian/patches/03_alpha.patch 2012-01-10 09:04:16.000000000 +0000 @@ -0,0 +1,13 @@ +Author: Julian Cristau jcristau@debian.org +Description: Fix alpha build ( #564620 ) +--- a/src/searchd.cpp ++++ b/src/searchd.cpp +@@ -14753,8 +14753,6 @@ + CheckFlush (); + CheckChildrenTerm(); + +- sphInfo ( NULL ); // flush dupes +- + if ( pAcceptMutex ) + { + // FIXME! what if all children are busy; we might want to accept here and temp fork more diff -Nru sphinxsearch-0.9.9+2.0.2beta/debian/patches/04_libstemmer.dpatch sphinxsearch-2.0.4/debian/patches/04_libstemmer.dpatch --- sphinxsearch-0.9.9+2.0.2beta/debian/patches/04_libstemmer.dpatch 2012-04-05 17:12:37.000000000 +0000 +++ sphinxsearch-2.0.4/debian/patches/04_libstemmer.dpatch 1970-01-01 00:00:00.000000000 +0000 @@ -1,181 +0,0 @@ -#! /bin/sh /usr/share/dpatch/dpatch-run -## 04_libstemmer.dpatch by Thijs Kinkhorst -## -## All lines beginning with `## DP:' are a description of the patch. -## DP: libstemmer support ( #570506 ) - -@DPATCH@ -diff -Naur sphinx-2.0.1-beta-old/acinclude.m4 sphinx-2.0.1-beta/acinclude.m4 ---- sphinx-2.0.1-beta-old/acinclude.m4 2009-03-24 01:50:25.000000000 +0000 -+++ sphinx-2.0.1-beta/acinclude.m4 2011-10-08 15:48:09.999584656 +0000 -@@ -291,6 +291,83 @@ - ]) - - dnl --------------------------------------------------------------------------- -+dnl Macro: AC_CHECK_LIBSTEMMER -+dnl Author: Adam Golebiowski -+dnl First check for custom libstemmer include path in --with-libstemmer=* option -+dnl If not given, try to guess. -+dnl --------------------------------------------------------------------------- -+ -+AC_DEFUN([AC_CHECK_LIBSTEMMER],[ -+ -+# cflags and libs -+LIBSTEMMER_CFLAGS= -+LIBSTEMMER_LIBS= -+ -+# possible includedir paths -+includedirs="/usr/include /usr/include/libstemmer /usr/include/libstemmer_c" -+ -+# possible libdirs -- 64bit first in case of multiarch environments -+libdirs="/usr/lib/$(/usr/bin/dpkg-architecture -qDEB_HOST_MULTIARCH) /usr/lib64 /usr/local/lib64 /usr/lib /usr/local/lib" -+ -+# possible libnames -- shared one first, then static one -+libnames="stemmer stemmer_c" -+ -+# was (include) path explicitely given? -+if test [ -n "$ac_cv_use_libstemmer" -a x$ac_cv_use_libstemmer != xyes]; then -+ includedirs=$ac_cv_use_libstemmer -+fi -+ -+# try to find header files -+for includedir in $includedirs -+do -+ if test [ -f $includedir/libstemmer.h ]; then -+ LIBSTEMMER_CFLAGS="-I$includedir" -+ break -+ fi -+done -+ -+# try to find shared library -+for libname in $libnames -+do -+ for libdir in $libdirs -+ do -+ if test [ -f $libdir/lib${libname}.so ]; then -+ LIBSTEMMER_LIBS="-L$libdir -l$libname" -+ break 2 -+ fi -+ done -+done -+ -+# if not found, check static libs -+if test [ -z "$LIBSTEMMER_LIBS" ]; then -+ for libname in $libnames -+ do -+ for libdir in $libdirs -+ do -+ if test [ -f $libdir/lib${libname}.a ]; then -+ LIBSTEMMER_LIBS="$libdir/lib${libname}.a" -+ break 2 -+ fi -+ done -+ done -+fi -+ -+# if LIBSTEMMER_LIBS is not set at this moment, -+# our last chanceis to check for existance of internal copy of libstemmer_c -+# in case it doesn't exist -- we lost -+if test [ -z "$LIBSTEMMER_LIBS" ]; then -+ if test [ -d ./libstemmer_c ]; then -+ ac_cv_use_internal_libstemmer=1 -+ LIBSTEMMER_LIBS="\$(top_srcdir)/libstemmer_c/libstemmer.a" -+ LIBSTEMMER_CFLAGS="-I\$(top_srcdir)/libstemmer_c/include" -+ else -+ AC_MSG_ERROR([not found]) -+ fi -+fi -+ -+]) -+ -+dnl --------------------------------------------------------------------------- - dnl Macro: SPHINX_CONFIGURE_PART - dnl - dnl Tells what stage is ./configure running now, nicely formatted -diff -Naur sphinx-2.0.1-beta-old/configure.ac sphinx-2.0.1-beta/configure.ac ---- sphinx-2.0.1-beta-old/configure.ac 2011-02-19 23:50:19.000000000 +0000 -+++ sphinx-2.0.1-beta/configure.ac 2011-10-08 15:51:13.799584589 +0000 -@@ -270,9 +270,6 @@ - MYSQL_CFLAGS="$MYSQL_CFLAGS -I/opt/local/include" - fi - --# we can now set preprocessor flags for both C and C++ compilers --CPPFLAGS="$CPPFLAGS $MYSQL_CFLAGS $PGSQL_CFLAGS" -- - dnl --- - - AC_MSG_CHECKING([whether to use 64-bit document/word IDs]) -@@ -297,22 +294,23 @@ - - AC_MSG_CHECKING([whether to compile with libstemmer support]) - if test x$ac_cv_use_libstemmer != xno; then -- if test -d libstemmer_c && test -f libstemmer_c/include/libstemmer.h; then -- AC_MSG_RESULT([yes]) -- AC_DEFINE(USE_LIBSTEMMER, 1, [libstemmer support]) -- else -- AC_MSG_ERROR([missing libstemmer sources from libstemmer_c. -- --Please download the C version of libstemmer library from --http://snowball.tartarus.org/ and extract its sources over libstemmer_c/ --subdirectory in order to build Sphinx with libstemmer support. --]) -- fi -+ ac_cv_use_internal_libstemmer=0 -+ AC_MSG_RESULT([yes]) -+ AC_CHECK_LIBSTEMMER([$ac_cv_use_listemmer]) -+ AC_DEFINE(USE_LIBSTEMMER, 1, [Define to 1 if you want to compile with libstemmer support]) -+ AC_DEFINE(USE_INTERNAL_LIBSTEMMER, $ac_cv_use_internal_libstemmer, [Define to 1 if you want to compile with internal libstemmer library]) -+ AC_SUBST([LIBSTEMMER_LIBS]) -+ AC_SUBST([LIBSTEMMER_CFLAGS]) - else - AC_MSG_RESULT([no]) -- AC_DEFINE(USE_LIBSTEMMER, 0, [libstemmer support]) - fi - AM_CONDITIONAL(USE_LIBSTEMMER, test x$ac_cv_use_libstemmer != xno) -+AM_CONDITIONAL(USE_INTERNAL_LIBSTEMMER, test x$ac_cv_use_internal_libstemmer != x0) -+ -+dnl --- -+ -+# we can now set preprocessor flags for both C and C++ compilers -+CPPFLAGS="$CPPFLAGS $MYSQL_CFLAGS $PGSQL_CFLAGS $LIBSTEMMER_CFLAGS" - - dnl --- - -diff -Naur sphinx-2.0.1-beta-old/Makefile.am sphinx-2.0.1-beta/Makefile.am ---- sphinx-2.0.1-beta-old/Makefile.am 2008-07-03 21:01:34.000000000 +0000 -+++ sphinx-2.0.1-beta/Makefile.am 2011-10-08 15:51:42.095584579 +0000 -@@ -1,4 +1,4 @@ --if USE_LIBSTEMMER -+if USE_INTERNAL_LIBSTEMMER - SUBDIRS = libstemmer_c src test doc - else - SUBDIRS = src test doc -diff -Naur sphinx-2.0.1-beta-old/src/Makefile.am sphinx-2.0.1-beta/src/Makefile.am ---- sphinx-2.0.1-beta-old/src/Makefile.am 2010-07-19 15:42:32.000000000 +0000 -+++ sphinx-2.0.1-beta/src/Makefile.am 2011-10-08 15:52:10.267584569 +0000 -@@ -21,13 +21,7 @@ - extract-version: - /bin/sh svnxrev.sh .. - --if USE_LIBSTEMMER --LIBSTEMMER_LIBS = $(top_srcdir)/libstemmer_c/libstemmer.a - AM_CPPFLAGS = -I$(top_srcdir)/libstemmer_c/include -DSYSCONFDIR="\"$(sysconfdir)\"" -DDATADIR="\"$(localstatedir)/data\"" --else --LIBSTEMMER_LIBS = --AM_CPPFLAGS = -DSYSCONFDIR="\"$(sysconfdir)\"" -DDATADIR="\"$(localstatedir)/data\"" --endif - - COMMON_LIBS = libsphinx.a $(LIBSTEMMER_LIBS) $(MYSQL_LIBS) $(PGSQL_LIBS) - LDADD = $(COMMON_LIBS) -diff -Naur sphinx-2.0.1-beta-old/src/sphinx.cpp sphinx-2.0.1-beta/src/sphinx.cpp ---- sphinx-2.0.1-beta-old/src/sphinx.cpp 2011-04-19 08:39:24.000000000 +0000 -+++ sphinx-2.0.1-beta/src/sphinx.cpp 2011-10-08 15:52:36.055584560 +0000 -@@ -39,7 +39,7 @@ - #define SPH_READ_NOPROGRESS_CHUNK (32768*1024) - - #if USE_LIBSTEMMER --#include "libstemmer.h" -+#include - #endif - - #if USE_LIBEXPAT diff -Nru sphinxsearch-0.9.9+2.0.2beta/debian/patches/04_libstemmer.patch sphinxsearch-2.0.4/debian/patches/04_libstemmer.patch --- sphinxsearch-0.9.9+2.0.2beta/debian/patches/04_libstemmer.patch 1970-01-01 00:00:00.000000000 +0000 +++ sphinxsearch-2.0.4/debian/patches/04_libstemmer.patch 2012-01-10 09:04:16.000000000 +0000 @@ -0,0 +1,171 @@ +Author: Thijs Kinkhorst +Description: libstemmer support ( #570506 ) +--- a/acinclude.m4 ++++ b/acinclude.m4 +@@ -291,6 +291,83 @@ + ]) + + dnl --------------------------------------------------------------------------- ++dnl Macro: AC_CHECK_LIBSTEMMER ++dnl Author: Adam Golebiowski ++dnl First check for custom libstemmer include path in --with-libstemmer=* option ++dnl If not given, try to guess. ++dnl --------------------------------------------------------------------------- ++ ++AC_DEFUN([AC_CHECK_LIBSTEMMER],[ ++ ++# cflags and libs ++LIBSTEMMER_CFLAGS= ++LIBSTEMMER_LIBS= ++ ++# possible includedir paths ++includedirs="/usr/include /usr/include/libstemmer /usr/include/libstemmer_c" ++ ++# possible libdirs -- 64bit first in case of multiarch environments ++libdirs="/usr/lib/$(/usr/bin/dpkg-architecture -qDEB_HOST_MULTIARCH) /usr/lib64 /usr/local/lib64 /usr/lib /usr/local/lib" ++ ++# possible libnames -- shared one first, then static one ++libnames="stemmer stemmer_c" ++ ++# was (include) path explicitely given? ++if test [ -n "$ac_cv_use_libstemmer" -a x$ac_cv_use_libstemmer != xyes]; then ++ includedirs=$ac_cv_use_libstemmer ++fi ++ ++# try to find header files ++for includedir in $includedirs ++do ++ if test [ -f $includedir/libstemmer.h ]; then ++ LIBSTEMMER_CFLAGS="-I$includedir" ++ break ++ fi ++done ++ ++# try to find shared library ++for libname in $libnames ++do ++ for libdir in $libdirs ++ do ++ if test [ -f $libdir/lib${libname}.so ]; then ++ LIBSTEMMER_LIBS="-L$libdir -l$libname" ++ break 2 ++ fi ++ done ++done ++ ++# if not found, check static libs ++if test [ -z "$LIBSTEMMER_LIBS" ]; then ++ for libname in $libnames ++ do ++ for libdir in $libdirs ++ do ++ if test [ -f $libdir/lib${libname}.a ]; then ++ LIBSTEMMER_LIBS="$libdir/lib${libname}.a" ++ break 2 ++ fi ++ done ++ done ++fi ++ ++# if LIBSTEMMER_LIBS is not set at this moment, ++# our last chanceis to check for existance of internal copy of libstemmer_c ++# in case it doesn't exist -- we lost ++if test [ -z "$LIBSTEMMER_LIBS" ]; then ++ if test [ -d ./libstemmer_c ]; then ++ ac_cv_use_internal_libstemmer=1 ++ LIBSTEMMER_LIBS="\$(top_srcdir)/libstemmer_c/libstemmer.a" ++ LIBSTEMMER_CFLAGS="-I\$(top_srcdir)/libstemmer_c/include" ++ else ++ AC_MSG_ERROR([not found]) ++ fi ++fi ++ ++]) ++ ++dnl --------------------------------------------------------------------------- + dnl Macro: SPHINX_CONFIGURE_PART + dnl + dnl Tells what stage is ./configure running now, nicely formatted +--- a/configure.ac ++++ b/configure.ac +@@ -310,9 +310,6 @@ + MYSQL_CFLAGS="$MYSQL_CFLAGS -I/opt/local/include" + fi + +-# we can now set preprocessor flags for both C and C++ compilers +-CPPFLAGS="$CPPFLAGS $MYSQL_CFLAGS $PGSQL_CFLAGS" +- + dnl --- + + AC_MSG_CHECKING([whether to use 64-bit document/word IDs]) +@@ -337,22 +334,23 @@ + + AC_MSG_CHECKING([whether to compile with libstemmer support]) + if test x$ac_cv_use_libstemmer != xno; then +- if test -d libstemmer_c && test -f libstemmer_c/include/libstemmer.h; then +- AC_MSG_RESULT([yes]) +- AC_DEFINE(USE_LIBSTEMMER, 1, [libstemmer support]) +- else +- AC_MSG_ERROR([missing libstemmer sources from libstemmer_c. +- +-Please download the C version of libstemmer library from +-http://snowball.tartarus.org/ and extract its sources over libstemmer_c/ +-subdirectory in order to build Sphinx with libstemmer support. +-]) +- fi ++ ac_cv_use_internal_libstemmer=0 ++ AC_MSG_RESULT([yes]) ++ AC_CHECK_LIBSTEMMER([$ac_cv_use_listemmer]) ++ AC_DEFINE(USE_LIBSTEMMER, 1, [Define to 1 if you want to compile with libstemmer support]) ++ AC_DEFINE(USE_INTERNAL_LIBSTEMMER, $ac_cv_use_internal_libstemmer, [Define to 1 if you want to compile with internal libstemmer library]) ++ AC_SUBST([LIBSTEMMER_LIBS]) ++ AC_SUBST([LIBSTEMMER_CFLAGS]) + else + AC_MSG_RESULT([no]) +- AC_DEFINE(USE_LIBSTEMMER, 0, [libstemmer support]) + fi + AM_CONDITIONAL(USE_LIBSTEMMER, test x$ac_cv_use_libstemmer != xno) ++AM_CONDITIONAL(USE_INTERNAL_LIBSTEMMER, test x$ac_cv_use_internal_libstemmer != x0) ++ ++dnl --- ++ ++# we can now set preprocessor flags for both C and C++ compilers ++CPPFLAGS="$CPPFLAGS $MYSQL_CFLAGS $PGSQL_CFLAGS $LIBSTEMMER_CFLAGS" + + dnl --- + +--- a/Makefile.am ++++ b/Makefile.am +@@ -1,4 +1,4 @@ +-if USE_LIBSTEMMER ++if USE_INTERNAL_LIBSTEMMER + SUBDIRS = libstemmer_c src test doc + else + SUBDIRS = src test doc +--- a/src/Makefile.am ++++ b/src/Makefile.am +@@ -21,13 +21,7 @@ + extract-version: + /bin/sh svnxrev.sh .. + +-if USE_LIBSTEMMER +-LIBSTEMMER_LIBS = $(top_srcdir)/libstemmer_c/libstemmer.a + AM_CPPFLAGS = -I$(top_srcdir)/libstemmer_c/include -DSYSCONFDIR="\"$(sysconfdir)\"" -DDATADIR="\"$(localstatedir)/data\"" +-else +-LIBSTEMMER_LIBS = +-AM_CPPFLAGS = -DSYSCONFDIR="\"$(sysconfdir)\"" -DDATADIR="\"$(localstatedir)/data\"" +-endif + + COMMON_LIBS = libsphinx.a $(LIBSTEMMER_LIBS) $(MYSQL_LIBS) $(PGSQL_LIBS) + LDADD = $(COMMON_LIBS) +--- a/src/sphinx.cpp ++++ b/src/sphinx.cpp +@@ -39,7 +39,7 @@ + #define SPH_READ_NOPROGRESS_CHUNK (32768*1024) + + #if USE_LIBSTEMMER +-#include "libstemmer.h" ++#include + #endif + + #if USE_LIBEXPAT diff -Nru sphinxsearch-0.9.9+2.0.2beta/debian/patches/series sphinxsearch-2.0.4/debian/patches/series --- sphinxsearch-0.9.9+2.0.2beta/debian/patches/series 1970-01-01 00:00:00.000000000 +0000 +++ sphinxsearch-2.0.4/debian/patches/series 2012-01-10 09:04:16.000000000 +0000 @@ -0,0 +1,4 @@ +01_Makefile_am.patch +02_sphinx.conf.patch +03_alpha.patch +04_libstemmer.patch diff -Nru sphinxsearch-0.9.9+2.0.2beta/debian/rules sphinxsearch-2.0.4/debian/rules --- sphinxsearch-0.9.9+2.0.2beta/debian/rules 2012-04-05 17:12:37.000000000 +0000 +++ sphinxsearch-2.0.4/debian/rules 2012-01-10 09:08:54.000000000 +0000 @@ -23,9 +23,6 @@ CFLAGS += -O2 endif -# Include dpatch stuff. -include /usr/share/dpatch/dpatch.make - config.status: dh_testdir @@ -34,7 +31,7 @@ # Add here commands to configure the package. ./configure --host=$(DEB_HOST_GNU_TYPE) --build=$(DEB_BUILD_GNU_TYPE) --prefix=/usr --mandir=\$${prefix}/share/man --infodir=\$${prefix}/share/info --localstatedir=/var/lib/sphinxsearch --sysconfdir=/etc/sphinxsearch --with-libstemmer --with-pgsql CFLAGS="$(CFLAGS)" LDFLAGS="-Wl,-z,defs" -build: patch build-arch build-indep +build: build-arch build-indep build-arch: build-stamp build-indep: build-stamp @@ -45,8 +42,7 @@ docbook-to-man debian/searchd.1.sgml > searchd.1 touch build-stamp -clean: clean1 unpatch -clean1: +clean: dh_testdir dh_testroot rm -f build-stamp @@ -59,7 +55,7 @@ cp -f /usr/share/misc/config.guess config.guess endif - $(RM) config.log config.status + $(RM) config.log config.status config.guess config.sub $(RM) -f indexer.1 searchd.1 dh_autoreconf_clean @@ -107,4 +103,4 @@ dh_builddeb binary: binary-indep binary-arch -.PHONY: build clean binary-indep binary-arch binary install patch unpatch +.PHONY: build clean binary-indep binary-arch binary install diff -Nru sphinxsearch-0.9.9+2.0.2beta/debian/source/format sphinxsearch-2.0.4/debian/source/format --- sphinxsearch-0.9.9+2.0.2beta/debian/source/format 1970-01-01 00:00:00.000000000 +0000 +++ sphinxsearch-2.0.4/debian/source/format 2012-04-05 17:12:37.000000000 +0000 @@ -0,0 +1 @@ +3.0 (quilt) diff -Nru sphinxsearch-0.9.9+2.0.2beta/doc/indexer.1 sphinxsearch-2.0.4/doc/indexer.1 --- sphinxsearch-0.9.9+2.0.2beta/doc/indexer.1 2011-06-11 14:19:49.000000000 +0000 +++ sphinxsearch-2.0.4/doc/indexer.1 2012-03-02 06:17:50.000000000 +0000 @@ -2,12 +2,12 @@ .\" Title: indexer .\" Author: [see the "Author" section] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 06/11/2011 +.\" Date: 03/02/2012 .\" Manual: Sphinxsearch -.\" Source: 2.0.2 +.\" Source: 2.0.4 .\" Language: English .\" -.TH "INDEXER" "1" "06/11/2011" "2\&.0\&.2" "Sphinxsearch" +.TH "INDEXER" "1" "03/02/2012" "2\&.0\&.4" "Sphinxsearch" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff -Nru sphinxsearch-0.9.9+2.0.2beta/doc/indextool.1 sphinxsearch-2.0.4/doc/indextool.1 --- sphinxsearch-0.9.9+2.0.2beta/doc/indextool.1 2011-06-11 14:19:49.000000000 +0000 +++ sphinxsearch-2.0.4/doc/indextool.1 2012-03-02 06:17:50.000000000 +0000 @@ -2,12 +2,12 @@ .\" Title: indextool .\" Author: [see the "Author" section] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 06/11/2011 +.\" Date: 03/02/2012 .\" Manual: Sphinxsearch -.\" Source: 2.0.2 +.\" Source: 2.0.4 .\" Language: English .\" -.TH "INDEXTOOL" "1" "06/11/2011" "2\&.0\&.2" "Sphinxsearch" +.TH "INDEXTOOL" "1" "03/02/2012" "2\&.0\&.4" "Sphinxsearch" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff -Nru sphinxsearch-0.9.9+2.0.2beta/doc/manpages.xml sphinxsearch-2.0.4/doc/manpages.xml --- sphinxsearch-0.9.9+2.0.2beta/doc/manpages.xml 2011-11-03 13:22:15.000000000 +0000 +++ sphinxsearch-2.0.4/doc/manpages.xml 2012-03-01 09:04:19.000000000 +0000 @@ -12,7 +12,7 @@ Sphinxsearch - 2.0.2 + 2.0.4 @@ -467,7 +467,7 @@ Sphinxsearch - 2.0.2 + 2.0.4 @@ -922,7 +922,7 @@ Sphinxsearch - 2.0.2 + 2.0.4 @@ -1311,7 +1311,7 @@ Sphinxsearch - 2.0.2 + 2.0.4 @@ -1430,7 +1430,7 @@ Sphinxsearch - 2.0.2 + 2.0.4 diff -Nru sphinxsearch-0.9.9+2.0.2beta/doc/search.1 sphinxsearch-2.0.4/doc/search.1 --- sphinxsearch-0.9.9+2.0.2beta/doc/search.1 2011-06-11 14:19:49.000000000 +0000 +++ sphinxsearch-2.0.4/doc/search.1 2012-03-02 06:17:50.000000000 +0000 @@ -2,12 +2,12 @@ .\" Title: search .\" Author: [see the "Author" section] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 06/11/2011 +.\" Date: 03/02/2012 .\" Manual: Sphinxsearch -.\" Source: 2.0.2 +.\" Source: 2.0.4 .\" Language: English .\" -.TH "SEARCH" "1" "06/11/2011" "2\&.0\&.2" "Sphinxsearch" +.TH "SEARCH" "1" "03/02/2012" "2\&.0\&.4" "Sphinxsearch" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff -Nru sphinxsearch-0.9.9+2.0.2beta/doc/searchd.1 sphinxsearch-2.0.4/doc/searchd.1 --- sphinxsearch-0.9.9+2.0.2beta/doc/searchd.1 2011-06-11 14:19:49.000000000 +0000 +++ sphinxsearch-2.0.4/doc/searchd.1 2012-03-02 06:17:50.000000000 +0000 @@ -2,12 +2,12 @@ .\" Title: searchd .\" Author: [see the "Author" section] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 06/11/2011 +.\" Date: 03/02/2012 .\" Manual: Sphinxsearch -.\" Source: 2.0.2 +.\" Source: 2.0.4 .\" Language: English .\" -.TH "SEARCHD" "1" "06/11/2011" "2\&.0\&.2" "Sphinxsearch" +.TH "SEARCHD" "1" "03/02/2012" "2\&.0\&.4" "Sphinxsearch" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- @@ -56,7 +56,7 @@ .PP The options available to searchd on all builds are: .PP -\fB\-\-config\fR \fICONFIGFILE\fR, \fB\-c\fR \fICONFIGFILE\fR +\fB\-\-config\fR\fICONFIGFILE\fR, \fB\-c\fR\fICONFIGFILE\fR .RS 4 Tell \fBsearchd\fR @@ -166,6 +166,11 @@ points to \*(Aqverbose\*(Aq and \*(Aqvery verbose\*(Aq debug info\&. The last could really flood your logfile\&. .RE .PP +\fB\-\-nodetach\fR +.RS 4 +Do not \*(Aqdaemonize\*(Aq, or, do not detach into background\&. Apart debug purposes, this switch is useful when you manage sphinx with upstart init daemon\&. In this case actual \*(Aqdaemonizing\*(Aq will be done by upstart itself, and also all tasks like starting, stopping, reloading the config and respawning on crash will be done by the system, not the sphinx\&. +.RE +.PP \fB\-\-pidfile\fR \fIPIDFILE\fR .RS 4 Explicitly state a PID file, where the process information is stored regarding @@ -191,6 +196,34 @@ .\} .RE .PP +\fB\-\-replay\-flags\fR\ \&\fIOPTIONS\fR +.RS 4 +Specify a list of extra binary log replay options\&. The supported options are: +.sp +.RS 4 +.ie n \{\ +\h'-04'\(bu\h'+03'\c +.\} +.el \{\ +.sp -1 +.IP \(bu 2.3 +.\} +\fBaccept\-desc\-timestamp\fR, ignore descending transaction timestamps and replay such transactions anyway (the default behavior is to exit with an error)\&. +.RE +.sp +Example: +.sp +.if n \{\ +.RS 4 +.\} +.nf +$ searchd \-\-replay\-flags=accept\-desc\-timestamp +.fi +.if n \{\ +.RE +.\} +.RE +.PP \fB\-\-port\fR\ \&\fIPORT\fR, \fB\-p\fR\ \&\fIPORT\fR .RS 4 Specify the diff -Nru sphinxsearch-0.9.9+2.0.2beta/doc/spelldump.1 sphinxsearch-2.0.4/doc/spelldump.1 --- sphinxsearch-0.9.9+2.0.2beta/doc/spelldump.1 2011-06-11 14:19:49.000000000 +0000 +++ sphinxsearch-2.0.4/doc/spelldump.1 2012-03-02 06:17:50.000000000 +0000 @@ -2,12 +2,12 @@ .\" Title: spelldump .\" Author: [see the "Author" section] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 06/11/2011 +.\" Date: 03/02/2012 .\" Manual: Sphinxsearch -.\" Source: 2.0.2 +.\" Source: 2.0.4 .\" Language: English .\" -.TH "SPELLDUMP" "1" "06/11/2011" "2\&.0\&.2" "Sphinxsearch" +.TH "SPELLDUMP" "1" "03/02/2012" "2\&.0\&.4" "Sphinxsearch" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff -Nru sphinxsearch-0.9.9+2.0.2beta/doc/sphinx.html sphinxsearch-2.0.4/doc/sphinx.html --- sphinxsearch-0.9.9+2.0.2beta/doc/sphinx.html 2011-11-15 22:35:53.000000000 +0000 +++ sphinxsearch-2.0.4/doc/sphinx.html 2012-03-02 06:17:50.000000000 +0000 @@ -1,10 +1,10 @@ -Sphinx 2.0.2-beta reference manual +Sphinx 2.0.4-release reference manual -

Sphinx 2.0.2-beta reference manual

+

Sphinx 2.0.4-release reference manual

Free open-source SQL full-text search engine

-
-
+
+

Table of Contents

1. Introduction
1.1. About
@@ -187,19 +187,20 @@
11.1.36. xmlpipe_field_string
11.1.37. xmlpipe_field_wordcount
11.1.38. xmlpipe_attr_uint
-
11.1.39. xmlpipe_attr_bool
-
11.1.40. xmlpipe_attr_timestamp
-
11.1.41. xmlpipe_attr_str2ordinal
-
11.1.42. xmlpipe_attr_float
-
11.1.43. xmlpipe_attr_multi
-
11.1.44. xmlpipe_attr_multi_64
-
11.1.45. xmlpipe_attr_string
-
11.1.46. xmlpipe_fixup_utf8
-
11.1.47. mssql_winauth
-
11.1.48. mssql_unicode
-
11.1.49. unpack_zlib
-
11.1.50. unpack_mysqlcompress
-
11.1.51. unpack_mysqlcompress_maxsize
+
11.1.39. xmlpipe_attr_bigint
+
11.1.40. xmlpipe_attr_bool
+
11.1.41. xmlpipe_attr_timestamp
+
11.1.42. xmlpipe_attr_str2ordinal
+
11.1.43. xmlpipe_attr_float
+
11.1.44. xmlpipe_attr_multi
+
11.1.45. xmlpipe_attr_multi_64
+
11.1.46. xmlpipe_attr_string
+
11.1.47. xmlpipe_fixup_utf8
+
11.1.48. mssql_winauth
+
11.1.49. mssql_unicode
+
11.1.50. unpack_zlib
+
11.1.51. unpack_mysqlcompress
+
11.1.52. unpack_mysqlcompress_maxsize
11.2. Index configuration options
11.2.1. type
11.2.2. source
@@ -310,19 +311,21 @@
11.4.41. watchdog
11.4.42. prefork_rotation_throttle
A. Sphinx revision history
-
A.1. Version 2.0.2-beta, 15 nov 2011
-
A.2. Version 2.0.1-beta, 22 apr 2011
-
A.3. Version 1.10-beta, 19 jul 2010
-
A.4. Version 0.9.9-release, 02 dec 2009
-
A.5. Version 0.9.9-rc2, 08 apr 2009
-
A.6. Version 0.9.9-rc1, 17 nov 2008
-
A.7. Version 0.9.8.1, 30 oct 2008
-
A.8. Version 0.9.8, 14 jul 2008
-
A.9. Version 0.9.7, 02 apr 2007
-
A.10. Version 0.9.7-rc2, 15 dec 2006
-
A.11. Version 0.9.7-rc1, 26 oct 2006
-
A.12. Version 0.9.6, 24 jul 2006
-
A.13. Version 0.9.6-rc1, 26 jun 2006
+
A.1. Version 2.0.4-release, 02 mar 2012
+
A.2. Version 2.0.3-release, 23 dec 2011
+
A.3. Version 2.0.2-beta, 15 nov 2011
+
A.4. Version 2.0.1-beta, 22 apr 2011
+
A.5. Version 1.10-beta, 19 jul 2010
+
A.6. Version 0.9.9-release, 02 dec 2009
+
A.7. Version 0.9.9-rc2, 08 apr 2009
+
A.8. Version 0.9.9-rc1, 17 nov 2008
+
A.9. Version 0.9.8.1, 30 oct 2008
+
A.10. Version 0.9.8, 14 jul 2008
+
A.11. Version 0.9.7, 02 apr 2007
+
A.12. Version 0.9.7-rc2, 15 dec 2006
+
A.13. Version 0.9.7-rc1, 26 oct 2006
+
A.14. Version 0.9.6, 24 jul 2006
+
A.15. Version 0.9.6-rc1, 26 jun 2006
-

Chapter 1. Introduction

+

Chapter 1. Introduction

-

1.1. About

+

1.1. About

Sphinx is a full-text search engine, publicly distributed under GPL version 2. Commercial licensing (eg. for embedded use) is available upon request. @@ -380,56 +383,56 @@ As for the name, Sphinx is an acronym which is officially decoded as SQL Phrase Index. Yes, I know about CMU's Sphinx project.

-

1.2. Sphinx features

+

1.2. Sphinx features

Key Sphinx features are: -

  • high indexing and searching performance;
  • -
  • advanced indexing and querying tools (flexible and feature-rich text tokenizer, querying language, several different ranking modes, etc);
  • -
  • advanced result set post-processing (SELECT with expressions, WHERE, ORDER BY, GROUP BY etc over text search results);
  • -
  • proven scalability up to billions of documents, terabytes of data, and thousands of queries per second;
  • -
  • easy integration with SQL and XML data sources, and SphinxAPI, SphinxQL, or SphinxSE search interfaces;
  • -
  • easy scaling with distributed searches.
  • +

    • high indexing and searching performance;

    • +
    • advanced indexing and querying tools (flexible and feature-rich text tokenizer, querying language, several different ranking modes, etc);

    • +
    • advanced result set post-processing (SELECT with expressions, WHERE, ORDER BY, GROUP BY etc over text search results);

    • +
    • proven scalability up to billions of documents, terabytes of data, and thousands of queries per second;

    • +
    • easy integration with SQL and XML data sources, and SphinxAPI, SphinxQL, or SphinxSE search interfaces;

    • +
    • easy scaling with distributed searches.

    To expand a bit, Sphinx: -

    • has high indexing speed (upto 10-15 MB/sec per core on an internal benchmark);
    • -
    • has high search speed (upto 150-250 queries/sec per core against 1,000,000 documents, 1.2 GB of data on an internal benchmark);
    • -
    • has high scalability (biggest known cluster indexes over 3,000,000,000 documents, and busiest one peaks over 50,000,000 queries/day);
    • -
    • provides good relevance ranking through combination of phrase proximity ranking and statistical (BM25) ranking;
    • -
    • provides distributed searching capabilities;
    • -
    • provides document excerpts (snippets) generation;
    • -
    • provides searching from within application with SphinxAPI or SphinxQL interfaces, and from within MySQL with pluggable SphinxSE storage engine;
    • -
    • supports boolean, phrase, word proximity and other types of queries;
    • -
    • supports multiple full-text fields per document (upto 32 by default);
    • -
    • supports multiple additional attributes per document (ie. groups, timestamps, etc);
    • -
    • supports stopwords;
    • -
    • supports morphological word forms dictionaries;
    • -
    • supports tokenizing exceptions;
    • -
    • supports both single-byte encodings and UTF-8;
    • -
    • supports stemming (stemmers for English, Russian and Czech are built-in; and stemmers for +

      • has high indexing speed (upto 10-15 MB/sec per core on an internal benchmark);

      • +
      • has high search speed (upto 150-250 queries/sec per core against 1,000,000 documents, 1.2 GB of data on an internal benchmark);

      • +
      • has high scalability (biggest known cluster indexes over 3,000,000,000 documents, and busiest one peaks over 50,000,000 queries/day);

      • +
      • provides good relevance ranking through combination of phrase proximity ranking and statistical (BM25) ranking;

      • +
      • provides distributed searching capabilities;

      • +
      • provides document excerpts (snippets) generation;

      • +
      • provides searching from within application with SphinxAPI or SphinxQL interfaces, and from within MySQL with pluggable SphinxSE storage engine;

      • +
      • supports boolean, phrase, word proximity and other types of queries;

      • +
      • supports multiple full-text fields per document (upto 32 by default);

      • +
      • supports multiple additional attributes per document (ie. groups, timestamps, etc);

      • +
      • supports stopwords;

      • +
      • supports morphological word forms dictionaries;

      • +
      • supports tokenizing exceptions;

      • +
      • supports both single-byte encodings and UTF-8;

      • +
      • supports stemming (stemmers for English, Russian and Czech are built-in; and stemmers for French, Spanish, Portuguese, Italian, Romanian, German, Dutch, Swedish, Norwegian, Danish, Finnish, Hungarian, -are available by building third party libstemmer library);

      • -
      • supports MySQL natively (all types of tables, including MyISAM, InnoDB, NDB, Archive, etc are supported);
      • -
      • supports PostgreSQL natively;
      • -
      • supports ODBC compliant databases (MS SQL, Oracle, etc) natively;
      • -
      • ...has 50+ other features not listed here, refer to API and configuration manual!
      • +are available by building third party libstemmer library);

        +
      • supports MySQL natively (all types of tables, including MyISAM, InnoDB, NDB, Archive, etc are supported);

      • +
      • supports PostgreSQL natively;

      • +
      • supports ODBC compliant databases (MS SQL, Oracle, etc) natively;

      • +
      • ...has 50+ other features not listed here, refer to API and configuration manual!

    -

    1.3. Where to get Sphinx

    -

    Sphinx is available through its official Web site at http://sphinxsearch.com/. +

    1.3. Where to get Sphinx

    +

    Sphinx is available through its official Web site at http://sphinxsearch.com/.

    Currently, Sphinx distribution tarball includes the following software: -

    • indexer: an utility which creates fulltext indexes;
    • -
    • search: a simple command-line (CLI) test utility which searches through fulltext indexes;
    • -
    • searchd: a daemon which enables external software (eg. Web applications) to search through fulltext indexes;
    • -
    • sphinxapi: a set of searchd client API libraries for popular Web scripting languages (PHP, Python, Perl, Ruby).
    • -
    • spelldump: a simple command-line tool to extract the items from an ispell or MySpell -(as bundled with OpenOffice) format dictionary to help customize your index, for use with wordforms.
    • -
    • indextool: an utility to dump miscellaneous debug information about the index, added in version 0.9.9-rc2.
    • +

      • indexer: an utility which creates fulltext indexes;

      • +
      • search: a simple command-line (CLI) test utility which searches through fulltext indexes;

      • +
      • searchd: a daemon which enables external software (eg. Web applications) to search through fulltext indexes;

      • +
      • sphinxapi: a set of searchd client API libraries for popular Web scripting languages (PHP, Python, Perl, Ruby).

      • +
      • spelldump: a simple command-line tool to extract the items from an ispell or MySpell +(as bundled with OpenOffice) format dictionary to help customize your index, for use with wordforms.

      • +
      • indextool: an utility to dump miscellaneous debug information about the index, added in version 0.9.9-rc2.

    -

    1.4. License

    +

    1.4. 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 @@ -446,52 +449,52 @@ 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA

    Non-GPL licensing (for OEM/ISV embedded use) can also be arranged, please -contact us to discuss +contact us to discuss commercial licensing possibilities.

    -

    1.5. Credits

    +

    1.5. Credits

    Author

    Sphinx initial author (and a benevolent dictator ever since): -

    • Andrew Aksyonoff, http://shodan.ru
    • +

      Team

      Past and present employees of Sphinx Technologies Inc who should be noted on their work on Sphinx (in alphabetical order): -

      • Alexander Klimenko
      • -
      • Alexey Dvoichenkov
      • -
      • Alexey Vinogradov
      • -
      • Ilya Kuznetsov
      • -
      • Stanislav Klinov
      • +

        • Alexander Klimenko

        • +
        • Alexey Dvoichenkov

        • +
        • Alexey Vinogradov

        • +
        • Ilya Kuznetsov

        • +
        • Stanislav Klinov

        Contributors

        People who contributed to Sphinx and their contributions (in no particular order): -

        • Robert "coredev" Bengtsson (Sweden), initial version of PostgreSQL data source
        • -
        • Len Kranendonk, Perl API
        • -
        • Dmytro Shteflyuk, Ruby API
        • +

          • Robert "coredev" Bengtsson (Sweden), initial version of PostgreSQL data source

          • +
          • Len Kranendonk, Perl API

          • +
          • Dmytro Shteflyuk, Ruby API

          Many other people have contributed ideas, bug reports, fixes, etc. Thank you!

        -

        1.6. History

        +

        1.6. History

        Sphinx development was started back in 2001, because I didn't manage to find an acceptable search solution (for a database driven Web site) which would meet my requirements. Actually, each and every important aspect was a problem: -

        • search quality (ie. good relevance) -

          • statistical ranking methods performed rather bad, especially on large collections of small documents (forums, blogs, etc)
          • +

            • search quality (ie. good relevance) +

              • statistical ranking methods performed rather bad, especially on large collections of small documents (forums, blogs, etc)

            • -
            • search speed -

              • especially if searching for phrases which contain stopwords, as in "to be or not to be"
              • +
              • search speed +

                • especially if searching for phrases which contain stopwords, as in "to be or not to be"

              • -
              • moderate disk and CPU requirements when indexing -

                • important in shared hosting enivronment, not to mention the indexing speed.
                • +
                • moderate disk and CPU requirements when indexing +

                  • important in shared hosting enivronment, not to mention the indexing speed.

                • @@ -506,7 +509,7 @@ during last years, the obvious decision is to continue developing Sphinx (and, eventually, to take over the world).

              -

              Chapter 2. Installation

              +

              Chapter 2. Installation

              -

              2.1. Supported systems

              +

              2.1. Supported systems

              Most modern UNIX systems with a C++ compiler should be able to compile and run Sphinx without any modifications.

              Currently known systems Sphinx has been successfully running on are: -

              • Linux 2.4.x, 2.6.x (many various distributions)
              • -
              • Windows 2000, XP, 7
              • -
              • FreeBSD 4.x, 5.x, 6.x, 7.x, 8.x
              • -
              • NetBSD 1.6, 3.0
              • -
              • Solaris 9, 11
              • -
              • Mac OS X
              • +

                • Linux 2.4.x, 2.6.x (many various distributions)

                • +
                • Windows 2000, XP, 7

                • +
                • FreeBSD 4.x, 5.x, 6.x, 7.x, 8.x

                • +
                • NetBSD 1.6, 3.0

                • +
                • Solaris 9, 11

                • +
                • Mac OS X

                CPU architectures known to work include i386 (aka x86), amd64 (aka x86_64), SPARC64, and ARM.

                -Chance are good that Sphinx should work on other Unix platforms and/or +Chances are good that Sphinx should work on other Unix platforms and/or CPU architectures just as well. Please report any other platforms that worked for you!

                All platforms are production quality. There are no principal functional limitations on any platform.

              -

              2.2. Required tools

              +

              2.2. Required tools

              On UNIX, you will need the following tools to build and install Sphinx: -

              • a working C++ compiler. GNU gcc is known to work.
              • -
              • a good make program. GNU make is known to work.
              • +

                • a working C++ compiler. GNU gcc is known to work.

                • +
                • a good make program. GNU make is known to work.

                @@ -553,8 +556,8 @@ time being, you will have to build makefile (or other environment specific project files) manually.

              -

              2.3. Installing Sphinx on Linux

              -
              1. +

                2.3. Installing Sphinx on Linux

                +
                1. Extract everything from the distribution tarball (haven't you already?) and go to the sphinx subdirectory. (We are using version 2.0.1-beta here for the sake of example only; be sure to change this @@ -562,27 +565,27 @@

                  $ tar xzvf sphinx-2.0.1-beta.tar.gz
                  $ cd sphinx

                2. -
                3. Run the configuration program:

                  $ ./configure

                  +
                4. Run the configuration program:

                  $ ./configure

                  There's a number of options to configure. The complete listing may be obtained by using --help switch. The most important ones are: -

                  • --prefix, which specifies where to install Sphinx; such as --prefix=/usr/local/sphinx (all of the examples use this prefix)
                  • -
                  • --with-mysql, which specifies where to look for MySQL - include and library files, if auto-detection fails;
                  • -
                  • --with-pgsql, which specifies where to look for PostgreSQL - include and library files.
                  • +

                    • --prefix, which specifies where to install Sphinx; such as --prefix=/usr/local/sphinx (all of the examples use this prefix)

                    • +
                    • --with-mysql, which specifies where to look for MySQL + include and library files, if auto-detection fails;

                    • +
                    • --with-pgsql, which specifies where to look for PostgreSQL + include and library files.

                    -
                  • Build the binaries:

                    $ make

                  • -
                  • Install the binaries in the directory of your choice: +

                  • Build the binaries:

                    $ make

                  • +
                  • Install the binaries in the directory of your choice: (defaults to /usr/local/bin/ on *nix systems, but is overridden with configure --prefix)

                    $ make install

                -

                2.4. Installing Sphinx on Windows

                +

                2.4. Installing Sphinx on Windows

                Installing Sphinx on a Windows server is often easier than installing on a Linux environment; unless you are preparing code patches, you can use the pre-compiled binary files from the Downloads -area on the website.

                1. Extract everything from the .zip file you have downloaded - +area on the website.

                  1. Extract everything from the .zip file you have downloaded - sphinx-2.0.1-beta-win32.zip, or sphinx-2.0.1-beta-win32-pgsql.zip if you need PostgresSQL support as well. (We are using version 2.0.1-beta here for the sake of example only; @@ -591,19 +594,19 @@ or a freeware package like 7Zip to open the archive.

                    For the remainder of this guide, we will assume that the folders are unzipped into C:\Sphinx, such that searchd.exe can be found in C:\Sphinx\bin\searchd.exe. If you decide to use any different location for the folders or configuration file, please change it accordingly.

                  2. -
                  3. Edit the contents of sphinx.conf.in - specifically entries relating to @CONFDIR@ - to paths suitable for your system.
                  4. -
                  5. Install the searchd system as a Windows service:

                    C:\Sphinx\bin> C:\Sphinx\bin\searchd --install --config C:\Sphinx\sphinx.conf.in --servicename SphinxSearch

                  6. -
                  7. The searchd service will now be listed in the Services panel +

                  8. Edit the contents of sphinx.conf.in - specifically entries relating to @CONFDIR@ - to paths suitable for your system.

                  9. +
                  10. Install the searchd system as a Windows service:

                    C:\Sphinx\bin> C:\Sphinx\bin\searchd --install --config C:\Sphinx\sphinx.conf.in --servicename SphinxSearch

                  11. +
                  12. The searchd service will now be listed in the Services panel within the Management Console, available from Administrative Tools. It will not have been started, as you will need to configure it and build your indexes with indexer before starting the service. A guide to do this can be found under - Quick tour.

                    During the next steps of the install (which involve running indexer pretty much as + Quick tour.

                    During the next steps of the install (which involve running indexer pretty much as you would on Linux) you may find that you get an error relating to libmysql.dll not being found. If you have MySQL installed, you should find a copy of this library in your Windows directory, or sometimes in Windows\System32, or failing that in the MySQL core directories. If you do receive an error please copy libmysql.dll into the bin directory.

                -

                2.5. Known installation issues

                +

                2.5. Known installation issues

                If configure fails to locate MySQL headers and/or libraries, try checking for and installing mysql-devel package. On some systems, @@ -632,14 +635,14 @@ If you keep getting any other error, or the suggestions above do not seem to help you, please don't hesitate to contact me.

                -

                2.6. Quick Sphinx usage tour

                +

                2.6. Quick Sphinx usage tour

                All the example commands below assume that you installed Sphinx in /usr/local/sphinx, so searchd can be found in /usr/local/sphinx/bin/searchd.

                To use Sphinx, you will need to: -

                1. Create a configuration file.

                  +

                  1. Create a configuration file.

                    Default configuration file name is sphinx.conf. All Sphinx programs look for this file in current working directory by default. @@ -655,9 +658,9 @@ table from MySQL database test; so there's example.sql sample data file to populate that table with a few documents for testing purposes:

                    $ mysql -u test < /usr/local/sphinx/etc/example.sql

                  2. -
                  3. Run the indexer to create full-text index from your data:

                    $ cd /usr/local/sphinx/etc
                    +

                  4. Run the indexer to create full-text index from your data:

                    $ cd /usr/local/sphinx/etc
                    $ /usr/local/sphinx/bin/indexer --all

                  5. -
                  6. Query your newly created index!
                  7. +
                  8. Query your newly created index!

                  To query the index from command line, use search utility: @@ -665,26 +668,26 @@ $ /usr/local/sphinx/bin/search test

                To query the index from your PHP scripts, you need to: -

                1. Run the search daemon which your script will talk to:

                  $ cd /usr/local/sphinx/etc
                  +

                  1. Run the search daemon which your script will talk to:

                    $ cd /usr/local/sphinx/etc
                    $ /usr/local/sphinx/bin/searchd

                  2. -
                  3. +

                  4. Run the attached PHP API test script (to ensure that the daemon was succesfully started and is ready to serve the queries):

                    $ cd sphinx/api
                    $ php test.php test

                  5. -
                  6. +
                  7. Include the API (it's located in api/sphinxapi.php) into your own scripts and use it. -

                  8. +

                  Happy searching!

                -

                Chapter 3. Indexing

                +

                Chapter 3. Indexing

                -

                3.1. Data sources

                +

                3.1. Data sources

                The data to be indexed can generally come from very different sources: SQL databases, plain text files, HTML files, mailboxes, @@ -718,14 +721,14 @@ MySQL, PostgreSQL, MS SQL (on Windows), and ODBC. There is also a generic driver called xmlpipe, which runs a specified command and reads the data from its stdout. -See Section 3.9, “xmlpipe data source” section for the format description. +See Section 3.9, “xmlpipe data source” section for the format description.

                There can be as many sources per index as necessary. They will be sequentially processed in the very same order which was specifed in index definition. All the documents coming from those sources will be merged as if they were coming from a single source.

                -

                3.2. Full-text fields

                +

                3.2. Full-text fields

                Full-text fields (or just fields for brevity) are the textual document contents that get indexed by Sphinx, and can be @@ -751,11 +754,11 @@ punctuation, etc will all be lost during indexing. It is theoretically possible to partially reconstruct a given document from the Sphinx full-text index, but that would be a slow process (especially if -the CRC dictionary is used, +the CRC dictionary is used, which does not even store the original keywords and works with their hashes instead).

                -

                3.3. Attributes

                +

                3.3. Attributes

                Attributes are additional values associated with each document that can be used to perform additional filtering and sorting during search. @@ -776,7 +779,7 @@ and attempting to do so results in an error.

                For example, it is impossible to use the extended matching mode expression @column 1 to match documents where column is 1, if column is an attribute, and this is still true even if the numeric digits are normally indexed.

                Attributes can be used for filtering, though, to restrict returned -rows, as well as sorting or result grouping; +rows, as well as sorting or result grouping; it is entirely possible to sort results purely based on attributes, and ignore the search relevance tools. Additionally, attributes are returned from the search daemon, while the indexed text is not.

                @@ -813,19 +816,19 @@ Attributes are named. Attribute names are case insensitive. Attributes are not full-text indexed; they are stored in the index as is. Currently supported attribute types are: -

                • unsigned integers (1-bit to 32-bit wide);
                • -
                • UNIX timestamps;
                • -
                • floating point values (32-bit, IEEE 754 single precision);
                • -
                • string ordinals (specially computed integers);
                • -
                • strings (since 1.10-beta);
                • -
                • MVA, multi-value attributes (variable-length lists of 32-bit unsigned integers).
                • +

                  • unsigned integers (1-bit to 32-bit wide);

                  • +
                  • UNIX timestamps;

                  • +
                  • floating point values (32-bit, IEEE 754 single precision);

                  • +
                  • string ordinals (specially computed integers);

                  • +
                  • strings (since 1.10-beta);

                  • +
                  • MVA, multi-value attributes (variable-length lists of 32-bit unsigned integers).

                  The complete set of per-document attribute values is sometimes referred to as docinfo. Docinfos can either be -

                  • stored separately from the main full-text index data ("extern" storage, in .spa file), or
                  • -
                  • attached to each occurence of document ID in full-text index data ("inline" storage, in .spd file).
                  • +

                    • stored separately from the main full-text index data ("extern" storage, in .spa file), or

                    • +
                    • attached to each occurence of document ID in full-text index data ("inline" storage, in .spd file).

                    @@ -850,7 +853,7 @@ The children will NOT allocate any additional copies of this data.

                  -

                  3.4. MVA (multi-valued attributes)

                  +

                  3.4. MVA (multi-valued attributes)

                  MVAs, or multi-valued attributes, are an important special type of per-document attributes in Sphinx. MVAs let you attach sets of numeric values to every document. @@ -865,7 +868,7 @@ attached to each document as long as RAM permits (.spm file that contains the MVA values will be precached in RAM by searchd). The source data can be taken either from a separate query, or from a document field; -see source type in sql_attr_multi. +see source type in sql_attr_multi. In the first case the query will have to return pairs of document ID and MVA values, in the second one the field will be parsed for integer values. There are absolutely no requirements as to incoming data order; the values will be @@ -885,10 +888,10 @@ because each document can participate in many groups, it can be chosen as the best one in in more than one group, leading to duplicate IDs. PHP API historically uses ordered hash on the document ID for the resulting rows; so you'll also need to use -SetArrayResult() in order +SetArrayResult() in order to employ group-by on MVA with PHP API.

                  -

                  3.5. Indexes

                  +

                  3.5. Indexes

                  To be able to answer full-text search queries fast, Sphinx needs to build a special data structure optimized for such queries from @@ -906,7 +909,7 @@ of updates being really slow; theoretically, it might be slower to update this type of index than than to reindex it from scratch. However, this very frequently could be worked around with -muiltiple indexes, see Section 3.11, “Live index updates” for details. +muiltiple indexes, see Section 3.11, “Live index updates” for details.

                  It is planned to implement more index types, including the type which would be updateable in real time. @@ -918,7 +921,7 @@ the specified indexes, and the clients can specify what indexes to search in run time.

                  -

                  3.6. Restrictions on the source data

                  +

                  3.6. Restrictions on the source data

                  There are a few different restrictions imposed on the source data which is going to be indexed by Sphinx, of which the single most @@ -932,7 +935,7 @@ Also, a 1000-pound gorilla might eventually come out of your display and start throwing barrels at you. You've been warned.

                  -

                  3.7. Charsets, case folding, and translation tables

                  +

                  3.7. Charsets, case folding, and translation tables

                  When indexing some index, Sphinx fetches documents from the specified sources, splits the text into words, and does @@ -940,17 +943,17 @@ as the same word (or, to be pedantic, term).

                  To do that properly, Sphinx needs to know -

                  • what encoding is the source text in;
                  • -
                  • what characters are letters and what are not;
                  • -
                  • what letters should be folded to what letters.
                  • +

                    • what encoding is the source text in;

                    • +
                    • what characters are letters and what are not;

                    • +
                    • what letters should be folded to what letters.

                    This should be configured on a per-index basis using -charset_type and -charset_table options. -charset_type +charset_type and +charset_table options. +charset_type specifies whether the document encoding is single-byte (SBCS) or UTF-8. -charset_table +charset_table specifies the table that maps letter characters to their case folded versions. The characters that are not in the table are considered to be non-letters and will be treated as word separators when indexing @@ -965,21 +968,21 @@ Default tables currently include English and Russian characters. Please do submit your tables for other languages!

                  -

                  3.8. SQL data sources (MySQL, PostgreSQL)

                  +

                  3.8. SQL data sources (MySQL, PostgreSQL)

                  With all the SQL drivers, indexing generally works as follows. -

                  • connection to the database is established;
                  • -
                  • pre-query (see Section 11.1.11, “sql_query_pre”) is executed - to perform any necessary initial setup, such as setting per-connection encoding with MySQL;
                  • -
                  • main query (see Section 11.1.12, “sql_query”) is executed and the rows it returns are indexed;
                  • -
                  • post-query (see Section 11.1.30, “sql_query_post”) is executed - to perform any necessary cleanup;
                  • -
                  • connection to the database is closed;
                  • -
                  • indexer does the sorting phase (to be pedantic, index-type specific post-processing);
                  • -
                  • connection to the database is established again;
                  • -
                  • post-index query (see Section 11.1.31, “sql_query_post_index”) is executed - to perform any necessary final cleanup;
                  • -
                  • connection to the database is closed again.
                  • +

                    Most options, such as database user/host/password, are straightforward. @@ -1003,9 +1006,9 @@

                    If the table contains document IDs from 1 to, say, 2345, then sql_query would be run three times: -

                    1. with $start replaced with 1 and $end replaced with 1000;
                    2. -
                    3. with $start replaced with 1001 and $end replaced with 2000;
                    4. -
                    5. with $start replaced with 2000 and $end replaced with 2345.
                    6. +

                      1. with $start replaced with 1 and $end replaced with 1000;

                      2. +
                      3. with $start replaced with 1001 and $end replaced with 2000;

                      4. +
                      5. with $start replaced with 2000 and $end replaced with 2345.

                      Obviously, that's not much of a difference for 2000-row table, @@ -1019,12 +1022,12 @@ that the indexing was succesful. Database connection is dropped and re-established because sorting phase can be very lengthy and would just timeout otherwise.

                    -

                    3.9. xmlpipe data source

                    +

                    3.9. xmlpipe data source

                    xmlpipe data source was designed to enable users to plug data into Sphinx without having to implement new data sources drivers themselves. It is limited to 2 fixed fields and 2 fixed attributes, and is deprecated -in favor of Section 3.10, “xmlpipe2 data source” now. For new streams, use xmlpipe2. +in favor of Section 3.10, “xmlpipe2 data source” now. For new streams, use xmlpipe2.

                    To use xmlpipe, configure the data source in your configuration file as follows: @@ -1036,7 +1039,7 @@ }

                    The indexer will run the command specified -in xmlpipe_command, +in xmlpipe_command, and then read, parse and index the data it prints to stdout. More formally, it opens a pipe to given command and then reads from that pipe. @@ -1073,7 +1076,7 @@ occur exactly in the same order. The only optional field is timestamp; it defaults to 1.

                    -

                    3.10. xmlpipe2 data source

                    +

                    3.10. xmlpipe2 data source

                    xmlpipe2 lets you pass arbitrary full-text and attribute data to Sphinx in yet another custom XML format. It also allows to specify the schema @@ -1159,17 +1162,17 @@

                    sphinx:field

                    Optional element, child of sphinx:schema. Declares a full-text field. Known attributes are: -

                    • "name", specifies the XML element name that will be treated as a full-text field in the subsequent documents.
                    • -
                    • "attr", specifies whether to also index this field as a string or word count attribute. Possible values are "string" and "wordcount". Introduced in version 1.10-beta.
                    • +

                      • "name", specifies the XML element name that will be treated as a full-text field in the subsequent documents.

                      • +
                      • "attr", specifies whether to also index this field as a string or word count attribute. Possible values are "string" and "wordcount". Introduced in version 1.10-beta.

                    sphinx:attr

                    Optional element, child of sphinx:schema. Declares an attribute. Known attributes are: -

                    • "name", specifies the element name that should be treated as an attribute in the subsequent documents.
                    • -
                    • "type", specifies the attribute type. Possible values are "int", "timestamp", "str2ordinal", "bool", "float" and "multi".
                    • -
                    • "bits", specifies the bit size for "int" attribute type. Valid values are 1 to 32.
                    • -
                    • "default", specifies the default value for this attribute that should be used if the attribute's element is not present in the document.
                    • +

                      • "name", specifies the element name that should be treated as an attribute in the subsequent documents.

                      • +
                      • "type", specifies the attribute type. Possible values are "int", "timestamp", "str2ordinal", "bool", "float" and "multi".

                      • +
                      • "bits", specifies the bit size for "int" attribute type. Valid values are 1 to 32.

                      • +
                      • "default", specifies the default value for this attribute that should be used if the attribute's element is not present in the document.

                    sphinx:document
                    @@ -1181,17 +1184,17 @@

                    sphinx:killlist

                    Optional element, child of sphinx:docset. Contains a number of "id" elements whose contents are document IDs - to be put into a kill-list for this index. + to be put into a kill-list for this index.

                    -

                    3.11. Live index updates

                    +

                    3.11. Live index updates

                    There are two major approaches to maintaining the full-text index contents up to date. Note, however, that both these approaches deal with the task of full-text data updates, and not attribute updates. Instant attribute updates are supported since -version 0.9.8. Refer to UpdateAttributes() +version 0.9.8. Refer to UpdateAttributes() API call description for details.

                    First, you can use disk-based indexes, partition them manually, @@ -1199,7 +1202,7 @@ By minimizing the rebuild size, you can reduce the average indexing lag to something as low as 30-60 seconds. This approach was the the only one available in versions 0.9.x. On huge collections it actually might be -the most efficient one. Refer to Section 3.12, “Delta index updates” +the most efficient one. Refer to Section 3.12, “Delta index updates” for details.

                    Second, versions 1.x (starting with 1.10-beta) add support for so-called @@ -1207,9 +1210,9 @@ full-text data. Updates on a RT index can appear in the search results in 1-2 milliseconds, ie. 0.001-0.002 seconds. However, RT index are less efficient for bulk indexing huge amounts of data. Refer to -Chapter 4, Real-time indexes for details. +Chapter 4, Real-time indexes for details.

                    -

                    3.12. Delta index updates

                    +

                    3.12. Delta index updates

                    There's a frequent situation when the total dataset is too big to be reindexed from scratch often, but the amount of new records @@ -1228,7 +1231,7 @@ be made available to search in a matter of minutes.

                    Specifying which documents should go to what index and -reindexing main index could also be made fully automatical. +reindexing main index could also be made fully automatic. One option would be to make a counter table which would track the ID which would split the documents, and update it whenever the main index is reindexed. @@ -1282,7 +1285,7 @@ So sql_query_pre in the delta can not just be empty; and we need to issue the encoding setup query explicitly once again.

                    -

                    3.13. Index merging

                    +

                    3.13. Index merging

                    Merging two existing indexes can be more efficient that indexing the data from scratch, and desired in some cases (such as merging 'main' and 'delta' @@ -1316,9 +1319,9 @@ to include the document in the resulting mergid index. In the example above, the filter passes only those records where 'deleted' is 0, eliminating all records that were flagged as deleted (for instance, using -UpdateAttributes() call). +UpdateAttributes() call).

                    -

                    Chapter 4. Real-time indexes

                    +

                    Chapter 4. Real-time indexes

                    Table of Contents

                    4.1. RT indexes overview
                    4.2. Known caveats with RT indexes
                    4.3. RT index internals
                    @@ -1330,8 +1333,8 @@ RT indexes were added in version 1.10-beta. While querying of RT indexes is possible using any of the SphinxAPI, SphinxQL, or SphinxSE, updating them is only possible via SphinxQL at the moment. Full SphinxQL -reference is available in Chapter 7, SphinxQL reference. -

                    4.1. RT indexes overview

                    +reference is available in Chapter 7, SphinxQL reference. +

                    4.1. RT indexes overview

                    RT indexes should be declared in sphinx.conf, just as every other index type. Notable differences from the regular, @@ -1439,41 +1442,41 @@ is enabled, it should also survive crash and/or dirty shutdown, and recover on subsequent startup.

                    -

                    4.2. Known caveats with RT indexes

                    +

                    4.2. Known caveats with RT indexes

                    As of 1.10-beta, RT indexes are a beta quality feature: while no major, showstopper-class issues are known, there still are a few known usage quirks. Those quirks are listed in this section. -

                    • Prefix and infix indexing are not supported yet.
                    • -
                    • MVAs are not supported yet.
                    • -
                    • Disk chunks optimization routine is not implemented yet.
                    • -
                    • On initial index creation, attributes are reordered by type, +

                      • Prefix and infix indexing are not supported yet.

                      • +
                      • MVAs are not supported yet.

                      • +
                      • Disk chunks optimization routine is not implemented yet.

                      • +
                      • On initial index creation, attributes are reordered by type, in the following order: uint, bigint, float, timestamp, string. So when using INSERT without an explicit column names list, specify all uint -column values first, then bigint, etc.

                      • -
                      • Default conservative RAM chunk limit (rt_mem_limit) +column values first, then bigint, etc.

                      • +
                      • Default conservative RAM chunk limit (rt_mem_limit) of 32M can lead to poor performance on bigger indexes, you should raise it to -256..1024M if you're planning to index gigabytes.

                      • -
                      • High DELETE/REPLACE rate can lead to kill-list fragmentation -and impact searching performance.
                      • -
                      • No transaction size limits are currently imposed; +256..1024M if you're planning to index gigabytes.

                      • +
                      • High DELETE/REPLACE rate can lead to kill-list fragmentation +and impact searching performance.

                      • +
                      • No transaction size limits are currently imposed; too many concurrent INSERT/REPLACE transactions might therefore -consume a lot of RAM.

                      • -
                      • In case of a damaged binlog, recovery will stop on the +consume a lot of RAM.

                      • +
                      • In case of a damaged binlog, recovery will stop on the first damaged transaction, even though it's technically possible to keep looking further for subsequent undamaged transactions, and recover those. This mid-file damage case (due to flaky HDD/CDD/tape?) -is supposed to be extremely rare, though.

                      • -
                      • Multiple INSERTs grouped in a single transaction perform +is supposed to be extremely rare, though.

                      • +
                      • Multiple INSERTs grouped in a single transaction perform better than equivalent single-row transactions and are recommended for -batch loading of data.

                      • +batch loading of data.

                    -

                    4.3. RT index internals

                    +

                    4.3. RT index internals

                    RT index is internally chunked. It keeps a so-called RAM chunk that stores all the most recent changes. RAM chunk memory usage is rather strictly limited with per-index -rt_mem_limit directive. +rt_mem_limit directive. Once RAM chunk grows over this limit, a new disk chunk is created from its data, and RAM chunk is reset. Thus, while most changes on the RT index will be performed in RAM only and complete instantly @@ -1507,13 +1510,13 @@ Data in RAM chunk gets saved to disk on clean daemon shutdown, and then loaded back on startup. However, on daemon or server crash, updates from RAM chunk might be lost. To prevent that, binary logging -of transactions can be used; see Section 4.4, “Binary logging” for details. +of transactions can be used; see Section 4.4, “Binary logging” for details.

                    Full-text changes in RT index are transactional. They are stored in a per-thread accumulator until COMMIT, then applied at once. Bigger batches per single COMMIT should result in faster indexing.

                    -

                    4.4. Binary logging

                    +

                    4.4. Binary logging

                    Binary logs are essentially a recovery mechanism. With binary logs enabled, searchd writes every given transaction @@ -1522,15 +1525,16 @@ files are unlinked.

                    During normal operation, a new binlog file will be opened every time -when binlog_max_log_size limit (which defaults to 128M) +when binlog_max_log_size limit is reached. Older, already closed binlog files are kept until all of the transactions stored in them (from all indexes) are flushed as a disk chunk. Setting the limit to 0 pretty much prevents binlog from being unlinked at all while searchd is running; however, it will -still be unlinked on clean shutdown. +still be unlinked on clean shutdown. (This is the default case as of +2.0.3-release, binlog_max_log_size defaults to 0.)

                    There are 3 different binlog flushing strategies, controlled by -binlog_flush directive +binlog_flush directive which takes the values of 0, 1, or 2. 0 means to flush the log to OS and sync it to disk every second; 1 means flush and sync every transaction; and 2 (the default mode) means flush every @@ -1562,7 +1566,7 @@ is not very good for disk use and crash recovery time. Starting with 2.0.1-beta you can configure searchd to perform a periodic RAM chunk flush to fix that problem -using a rt_flush_period +using a rt_flush_period directive. With periodic flushes enabled, searchd will keep a separate thread, checking whether RT indexes RAM chunks need to be written back to disk. Once that happens, @@ -1577,7 +1581,7 @@ determine whether to actually perform the flush with a few heuristics.

                    -

                    Chapter 5. Searching

                    +

                    Chapter 5. Searching

                    -

                    5.1. Matching modes

                    +

                    5.1. Matching modes

                    So-called matching modes are a legacy feature that used to provide (very) limited query syntax and ranking support. Currently, they are -deprecated in favor of full-text query -language and so-called rankers. +deprecated in favor of full-text query +language and so-called rankers. Starting with version 0.9.9-release, it is thus strongly recommended to use SPH_MATCH_EXTENDED and proper query syntax rather than any other legacy mode. All those other modes are actually internally converted @@ -1613,16 +1617,16 @@ but that is for compatibility reasons only.

                    There are the following matching modes available: -

                    • SPH_MATCH_ALL, matches all query words (default mode);
                    • -
                    • SPH_MATCH_ANY, matches any of the query words;
                    • -
                    • SPH_MATCH_PHRASE, matches query as a phrase, requiring perfect match;
                    • -
                    • SPH_MATCH_BOOLEAN, matches query as a boolean expression (see Section 5.2, “Boolean query syntax”);
                    • -
                    • SPH_MATCH_EXTENDED, matches query as an expression in Sphinx internal query language - (see Section 5.3, “Extended query syntax”);
                    • -
                    • SPH_MATCH_EXTENDED2, an alias for SPH_MATCH_EXTENDED;
                    • -
                    • SPH_MATCH_FULLSCAN, matches query, forcibly using the "full scan" mode as below. +

                      • SPH_MATCH_ALL, matches all query words (default mode);

                      • +
                      • SPH_MATCH_ANY, matches any of the query words;

                      • +
                      • SPH_MATCH_PHRASE, matches query as a phrase, requiring perfect match;

                      • +
                      • SPH_MATCH_BOOLEAN, matches query as a boolean expression (see Section 5.2, “Boolean query syntax”);

                      • +
                      • SPH_MATCH_EXTENDED, matches query as an expression in Sphinx internal query language + (see Section 5.3, “Extended query syntax”);

                      • +
                      • SPH_MATCH_EXTENDED2, an alias for SPH_MATCH_EXTENDED;

                      • +
                      • SPH_MATCH_FULLSCAN, matches query, forcibly using the "full scan" mode as below. NB, any query terms will be ignored, such that filters, filter-ranges and grouping - will still be applied, but no text-matching.

                      • + will still be applied, but no text-matching.

                      @@ -1633,8 +1637,8 @@ are now just aliases.

                      The SPH_MATCH_FULLSCAN mode will be automatically activated in place of the specified matching mode when the following conditions are met: -

                      1. The query string is empty (ie. its length is zero).
                      2. -
                      3. docinfo storage is set to extern.
                      4. +

                        1. The query string is empty (ie. its length is zero).

                        2. +
                        3. docinfo storage is set to extern.

                        In full scan mode, all the indexed documents will be considered as matching. @@ -1647,18 +1651,18 @@ in this case providing every post from that user. By default this will be ordered by relevancy, followed by Sphinx document ID in ascending order (earliest first).

                      -

                      5.2. Boolean query syntax

                      +

                      5.2. Boolean query syntax

                      Boolean queries allow the following special operators to be used: -

                      • explicit operator AND:

                        hello & world
                      • -
                      • operator OR:

                        hello | world
                      • -
                      • operator NOT: +

                        • explicit operator AND:

                          hello & world
                        • +
                        • operator OR:

                          hello | world
                        • +
                        • operator NOT:

                           hello -world
                           hello !world
                           

                        • -
                        • grouping:

                          ( hello world )
                        • +
                        • grouping:

                          ( hello world )

                        Here's an example query which uses all these operators: @@ -1680,30 +1684,30 @@ Performance-wise, when the collection is huge (ie. 10-100M documents), evaluating such queries could take very long.

                      -

                      5.3. Extended query syntax

                      +

                      5.3. Extended query syntax

                      The following special operators and modifiers can be used when using the extended matching mode: -

                      • operator OR:

                        hello | world
                      • -
                      • operator NOT: +

                        • operator OR:

                          hello | world
                        • +
                        • operator NOT:

                           hello -world
                           hello !world
                           

                        • -
                        • field search operator:

                          @title hello @body world
                        • -
                        • field position limit modifier (introduced in version 0.9.9-rc1):

                          @body[50] hello
                        • -
                        • multiple-field search operator:

                          @(title,body) hello world
                        • -
                        • all-field search operator:

                          @* hello
                        • -
                        • phrase search operator:

                          "hello world"
                        • -
                        • proximity search operator:

                          "hello world"~10
                        • -
                        • quorum matching operator:

                          "the world is a wonderful place"/3
                        • -
                        • strict order operator (aka operator "before"):

                          aaa << bbb << ccc
                        • -
                        • exact form modifier (introduced in version 0.9.9-rc1):

                          raining =cats and =dogs
                        • -
                        • field-start and field-end modifier (introduced in version 0.9.9-rc2):

                          ^hello world$
                        • -
                        • NEAR, generalized proximity operator (introduced in version 2.0.1-beta):

                          hello NEAR/3 world NEAR/4 "my test"
                        • -
                        • SENTENCE operator (introduced in version 2.0.1-beta):

                          all SENTENCE words SENTENCE "in one sentence"
                        • -
                        • PARAGRAPH operator (introduced in version 2.0.1-beta):

                          "Bill Gates" PARAGRAPH "Steve Jobs"
                        • -
                        • zone limit operator:

                          ZONE:(h3,h4) only in these titles
                        • +
                        • field search operator:

                          @title hello @body world
                        • +
                        • field position limit modifier (introduced in version 0.9.9-rc1):

                          @body[50] hello
                        • +
                        • multiple-field search operator:

                          @(title,body) hello world
                        • +
                        • all-field search operator:

                          @* hello
                        • +
                        • phrase search operator:

                          "hello world"
                        • +
                        • proximity search operator:

                          "hello world"~10
                        • +
                        • quorum matching operator:

                          "the world is a wonderful place"/3
                        • +
                        • strict order operator (aka operator "before"):

                          aaa << bbb << ccc
                        • +
                        • exact form modifier (introduced in version 0.9.9-rc1):

                          raining =cats and =dogs
                        • +
                        • field-start and field-end modifier (introduced in version 0.9.9-rc2):

                          ^hello world$
                        • +
                        • NEAR, generalized proximity operator (introduced in version 2.0.1-beta):

                          hello NEAR/3 world NEAR/4 "my test"
                        • +
                        • SENTENCE operator (introduced in version 2.0.1-beta):

                          all SENTENCE words SENTENCE "in one sentence"
                        • +
                        • PARAGRAPH operator (introduced in version 2.0.1-beta):

                          "Bill Gates" PARAGRAPH "Steve Jobs"
                        • +
                        • zone limit operator:

                          ZONE:(h3,h4) only in these titles

                        @@ -1714,13 +1718,13 @@


                        The full meaning of this search is: -

                        • Find the words 'hello' and 'world' adjacently in any field in a document;
                        • -
                        • Additionally, the same document must also contain the words 'example' and 'program' - in the title field, with up to, but not including, 10 words between the words in question; +

                          • Find the words 'hello' and 'world' adjacently in any field in a document;

                          • +
                          • Additionally, the same document must also contain the words 'example' and 'program' + in the title field, with up to, but not including, 5 words between the words in question; (E.g. "example PHP program" would be matched however "example script to introduce outside data - into the correct context for your program" would not because two terms have 10 or more words between them)

                          • -
                          • Additionally, the same document must contain the word 'python' in the body field, but not contain either 'php' or 'perl';
                          • -
                          • Additionally, the same document must contain the word 'code' in any field.
                          • + into the correct context for your program" would not because two terms have 5 or more words between them)

                            +
                          • Additionally, the same document must contain the word 'python' in the body field, but not contain either 'php' or 'perl';

                          • +
                          • Additionally, the same document must contain the word 'code' in any field.

                          @@ -1774,7 +1778,7 @@ the document that contains "runs" and the document that contains "running", because both forms stem to just "run" - while "=runs" query will only match the first document. Exact form operator requires -index_exact_words option to be enabled. +index_exact_words option to be enabled. This is a modifier that affects the keyword and thus can be used within operators such as phrase, proximity, and quorum operators.

                          @@ -1830,7 +1834,7 @@

                          The order of the arguments within the sentence or paragraph does not matter. These operators only work on indexes built -with index_sp (sentence +with index_sp (sentence and paragraph indexing feature) enabled, and revert to a mere AND otherwise. Refer to the index_sp directive documentation for the notes on what's considered a sentence @@ -1851,10 +1855,10 @@ ZONE operator affects the query until the next field or ZONE limit operator, or the closing parenthesis. It only works on the indexes built with zones support -(see Section 11.2.9, “index_zones”) and will be ignored +(see Section 11.2.9, “index_zones”) and will be ignored otherwise.

                        -

                        5.4. Search results ranking

                        +

                        5.4. Search results ranking

                        Ranking overview

                        Ranking (aka weighting) of the search results can be defined as a process of computing a so-called relevance (aka weight) @@ -1885,8 +1889,8 @@ You can only do that in the SPH_MATCH_EXTENDED mode. (Which is the only mode in SphinxQL and the suggested mode in SphinxAPI anyway.) To choose a non-default ranker you can either use -SetRankingMode() -with SphinxAPI, or OPTION ranker +SetRankingMode() +with SphinxAPI, or OPTION ranker clause in SELECT statement when using SphinxQL.

                        As a sidenote, legacy matching modes are internally implemented via @@ -1905,39 +1909,39 @@ discussion for later.

                        Currently implemented rankers are: -

                        • +

                          • SPH_RANK_PROXIMITY_BM25, the default ranking mode that uses and combines both phrase proximity and BM25 ranking. -

                          • -
                          • +

                          • +
                          • SPH_RANK_BM25, statistical ranking mode which uses BM25 ranking only (similar to most other full-text engines). This mode is faster but may result in worse quality on queries which contain more than 1 keyword. -

                          • -
                          • +

                          • +
                          • SPH_RANK_NONE, no ranking mode. This mode is obviously the fastest. A weight of 1 is assigned to all matches. This is sometimes called boolean searching that just matches the documents but does not rank them. -

                          • -
                          • SPH_RANK_WORDCOUNT, ranking by the keyword occurrences count. +

                          • +
                          • SPH_RANK_WORDCOUNT, ranking by the keyword occurrences count. This ranker computes the per-field keyword occurrence counts, then multiplies them by field weights, and sums the resulting values. -

                          • -
                          • +

                          • +
                          • SPH_RANK_PROXIMITY, added in version 0.9.9-rc1, returns raw phrase proximity value as a result. This mode is internally used to emulate SPH_MATCH_ALL queries. -

                          • -
                          • +

                          • +
                          • SPH_RANK_MATCHANY, added in version 0.9.9-rc1, returns rank as it was computed in SPH_MATCH_ANY mode ealier, and is internally used to emulate SPH_MATCH_ANY queries. -

                          • -
                          • +

                          • +
                          • SPH_RANK_FIELDMASK, added in version 0.9.9-rc2, returns a 32-bit mask with N-th bit corresponding to N-th fulltext field, numbering from 0. The bit will only be set when the respective field has any keyword occurences satisfiying the query. -

                          • -
                          • +

                          • +
                          • SPH_RANK_SPH04, added in version 1.10-beta, is generally based on the default SPH_RANK_PROXIMITY_BM25 ranker, but additionally boosts the matches when they occur in the very beginning or the very end of a text field. Thus, @@ -1945,19 +1949,19 @@ that contains the exact query but is not equal to it. (For instance, when the query is "Hyde Park", a document entitled "Hyde Park" should be ranked higher than a one entitled "Hyde Park, London" or "The Hyde Park Cafe".) -

                          • -
                          • +

                          • +
                          • SPH_RANK_EXPR, added in version 2.0.2-beta, lets you specify the ranking formula in run time. It exposes a number of internal text factors and lets you define how the final weight should be computed from those factors. You can find more details about its syntax and a reference available factors in a subsection below. -

                          • +

                          You should specify the SPH_RANK_ prefix and use capital letters only -when using the SetRankingMode() +when using the SetRankingMode() call from the SphinxAPI. The API ports expose these as global constants. Using SphinxQL syntax, the prefix should be omitted and the ranker name is case insensitive. Example: @@ -1970,10 +1974,10 @@

                          Legacy matching modes rankers

                          Legacy matching modes automatically select a ranker as follows: -

                          • SPH_MATCH_ALL uses SPH_RANK_PROXIMITY ranker;
                          • -
                          • SPH_MATCH_ANY uses SPH_RANK_MATCHANY ranker;
                          • -
                          • SPH_MATCH_PHRASE uses SPH_RANK_PROXIMITY ranker;
                          • -
                          • SPH_MATCH_BOOLEAN uses SPH_RANK_NONE ranker.
                          • +

                            • SPH_MATCH_ALL uses SPH_RANK_PROXIMITY ranker;

                            • +
                            • SPH_MATCH_ANY uses SPH_RANK_MATCHANY ranker;

                            • +
                            • SPH_MATCH_PHRASE uses SPH_RANK_PROXIMITY ranker;

                            • +
                            • SPH_MATCH_BOOLEAN uses SPH_RANK_NONE ranker.

                            Expression based ranker (SPH_RANK_EXPR)

                            @@ -1991,7 +1995,7 @@

                            The ranking formula is an arbitrary arithmetic expression that can use constants, document attributes, built-in functions and operators (described -in Section 5.5, “Expressions, functions, and operators”), and also a few ranking-specific things +in Section 5.5, “Expressions, functions, and operators”), and also a few ranking-specific things that are only accessible in a ranking formula. Namely, those are field aggregation functions, field-level, and document-level ranking factors.

                            @@ -2001,33 +2005,33 @@ do not depend on the full text query, while factors might.) Those factors can be used anywhere in the ranking expression. Currently implemented document-level factors are: -

                            • +

                              • bm25 (integer), a document-level BM25 estimate (computed without keyword occurrence filtering). -

                              • -
                              • +

                              • +
                              • max_lcs (integer), a query-level maximum possible value that the sum(lcs*user_weight) expression can ever take. This can be useful for weight boost scaling. For instance, MATCHANY ranker formula uses this to guarantee that a full phrase match in any field rankes higher than any combination of partial matches in all fields. -

                              • -
                              • +

                              • +
                              • field_mask (integer), a document-level 32-bit mask of matched fields. -

                              • -
                              • +

                              • +
                              • query_word_count (integer), the number of unique keywords in a query, adjusted for a number of excluded keywords. For instance, both (one one one one) and (one !two) queries should assign a value of 1 to this factor, because there is just one unique non-excluded keyword. -

                              • -
                              • +

                              • +
                              • doc_word_count (integer), the number of unique keywords matched in the entire document. -

                              • +

                              @@ -2044,7 +2048,7 @@ instead, that expression sums lcs over all matching fields, and then adds bm25 to that per-field sum. Currently implemented field-level factors are: -

                              • +

                                • lcs (integer), the length of a maximum verbatim match between the document and the query, coutned in words. LCS stands for Longest Common Subsequence (or Subset). Takes a minimum value of 1 when only stray keywords @@ -2062,27 +2066,27 @@ respective positions as they were in the query. Finally, if the query is 'hello world program' and the field contains 'hello world program', lcs will be 3. (Hopefully that is unsurpising at this point.) -

                                • -
                                • +

                                • +
                                • user_weight (integer), the user specified per-field weight -(refer to SetFieldWeights() -in SphinxAPI and OPTION field_weights +(refer to SetFieldWeights() +in SphinxAPI and OPTION field_weights in SphinxQL respectively). The weights default to 1 if not specified explicitly. -

                                • -
                                • +

                                • +
                                • hit_count (integer), the number of keyword occurrences that matched in the field. Note that a single keyword may occur multiple times. For example, if 'hello' occurs 3 times in a field and 'world' occurs 5 times, hit_count will be 8. -

                                • -
                                • +

                                • +
                                • word_count (integer), the number of unique keywords matched in the field. For example, if 'hello' and 'world' occur anywhere in a field, word_count will be 2, irregardless of how many times do both keywords occur. -

                                • -
                                • +

                                • +
                                • tf_idf (float), the sum of TF*IDF over all the keywords matched in the field. IDF is the Inverse Document Frequency, a floating point value between 0 and 1 that describes how frequent is the keywords (basically, @@ -2092,12 +2096,12 @@ tf_idf is actually computed by summing IDF over all matched occurences. That's by construction equivalent to summing TF*IDF over all matched keywords. -

                                • -
                                • +

                                • +
                                • min_hit_pos (integer), the position of the first matched keyword occurrence, counted in words. Indexing begins from position 1. -

                                • -
                                • +

                                • +
                                • min_best_span_pos (integer), the position of the first maximum LCS occurrences span. For example, assume that our query was 'hello world program' and 'hello world' subphrase was matched twice in the field, @@ -2106,11 +2110,11 @@ never as a subphrase match. In that case, min_best_span_pos will be 13. Note how for the single keyword queries min_best_span_pos will always equal min_hit_pos. -

                                • -
                                • +

                                • +
                                • exact_hit (boolean), whether a query was an exact match of the entire current field. Used in the SPH04 ranker. -

                                • +

                                @@ -2118,11 +2122,11 @@ that takes an expression with field-level factors, iterates it over all the matched fields, and computes the final results. Currently implemented field aggregation functions are: -

                                • +

                                  • sum, sums the argument expression over all matched fields. For instance, sum(1) should return a number of matched fields. -

                                  • +

                                  Expressions for the built-in rankers

                                  @@ -2132,32 +2136,32 @@ still might be of interest if you want to fine-tune your ranking formula starting with one of the existing ones. Also, the formulas define the nitty gritty ranker details in a nicely readable fashion. -

                                  • +

                                    • SPH_RANK_PROXIMITY_BM25 = sum(lcs*user_weight)*1000+bm25 -

                                    • -
                                    • +

                                    • +
                                    • SPH_RANK_BM25 = bm25 -

                                    • -
                                    • +

                                    • +
                                    • SPH_RANK_NONE = 1 -

                                    • -
                                    • +

                                    • +
                                    • SPH_RANK_WORDCOUNT = sum(hit_count*user_weight) -

                                    • -
                                    • +

                                    • +
                                    • SPH_RANK_PROXIMITY = sum(lcs*user_weight) -

                                    • -
                                    • +

                                    • +
                                    • SPH_RANK_MATCHANY = sum((word_count+(lcs-1)*max_lcs)*user_weight) -

                                    • -
                                    • +

                                    • +
                                    • SPH_RANK_FIELDMASK = field_mask -

                                    • -
                                    • +

                                    • +
                                    • SPH_RANK_SPH04 = sum((4*lcs+2*(min_hit_pos==1)+exact_hit)*user_weight)*1000+bm25 -

                                    • +

                                  -

                                  5.5. Expressions, functions, and operators

                                  +

                                  5.5. Expressions, functions, and operators

                                  Sphinx lets you use arbitrary arithmetic expressions both via SphinxQL and SphinxAPI, involving attribute values, internal attributes (document ID @@ -2165,41 +2169,41 @@ and user-defined functions. This section documents the supported operators and functions. Here's the complete reference list for quick access. -

                                  • Arithmetic operators: +, -, *, /, %, DIV, MOD
                                  • -
                                  • Comparison operators: <, > <=, >=, =, <>
                                  • -
                                  • Boolean operators: AND, OR, NOT
                                  • -
                                  • Bitwise operators: &, |
                                  • -
                                  • ABS()
                                  • -
                                  • BIGINT()
                                  • -
                                  • CEIL()
                                  • -
                                  • COS()
                                  • -
                                  • CRC32()
                                  • -
                                  • DAY()
                                  • -
                                  • EXP()
                                  • -
                                  • FIBONACCI()
                                  • -
                                  • FLOOR()
                                  • -
                                  • GEODIST()
                                  • -
                                  • IDIV()
                                  • -
                                  • IF()
                                  • -
                                  • IN()
                                  • -
                                  • INTERVAL()
                                  • -
                                  • LN()
                                  • -
                                  • LOG10()
                                  • -
                                  • LOG2()
                                  • -
                                  • MAX()
                                  • -
                                  • MIN()
                                  • -
                                  • MONTH()
                                  • -
                                  • NOW()
                                  • -
                                  • POW()
                                  • -
                                  • SIN()
                                  • -
                                  • SINT()
                                  • -
                                  • SQRT()
                                  • -
                                  • YEAR()
                                  • -
                                  • YEARMONTH()
                                  • -
                                  • YEARMONTHDAY()
                                  • +

                                    -

                                    5.5.1. Operators

                                    +

                                    5.5.1. Operators

                                    Arithmetic operators: +, -, *, /, %, DIV, MOD

                                    The standard arithmetic operators. Arithmetic calculations involving those @@ -2235,7 +2239,7 @@ These operators perform bitwise AND and OR respectively. The operands must be of an integer types. Introduced in version 1.10-beta.

                                    -

                                    5.5.2. Numeric functions

                                    +

                                    5.5.2. Numeric functions

                                    ABS()

                                    Returns the absolute value of the argument.

                                    CEIL()

                                    Returns the smallest integer value greater or equal to the argument.

                                    COS()
                                    @@ -2260,7 +2264,7 @@

                                    Returns the first argument raised to the power of the second argument.

                                    SIN()

                                    Returns the sine of the argument.

                                    SQRT()

                                    Returns the square root of the argument.

                                    -

                                    5.5.3. Date and time functions

                                    +

                                    5.5.3. Date and time functions

                                    DAY()

                                    Returns the integer day of month (in 1..31 range) from a timestamp argument, according to the current timezone. Introduced in version 2.0.1-beta.

                                    MONTH()

                                    Returns the integer month (in 1..12 range) from a timestamp argument, according to the current timezone. Introduced in version 2.0.1-beta.

                                    NOW()
                                    @@ -2268,7 +2272,7 @@

                                    Returns the integer year (in 1969..2038 range) from a timestamp argument, according to the current timezone. Introduced in version 2.0.1-beta.

                                    YEARMONTH()

                                    Returns the integer year and month code (in 196912..203801 range) from a timestamp argument, according to the current timezone. Introduced in version 2.0.1-beta.

                                    YEARMONTHDAY()

                                    Returns the integer year, month, and date code (in 19691231..20380119 range) from a timestamp argument, according to the current timezone. Introduced in version 2.0.1-beta.

                                    -

                                    5.5.4. Type conversion functions

                                    +

                                    5.5.4. Type conversion functions

                                    BIGINT()

                                    Forcibly promotes the integer argument to 64-bit type, @@ -2284,7 +2288,7 @@ example: 1-2 normally evaluates to 4294967295, but SINT(1-2) evaluates to -1. Introduced in version 1.10-beta.

                                    -

                                    5.5.5. Comparison functions

                                    +

                                    5.5.5. Comparison functions

                                    IF()

                                    IF() behavior is slightly different that that of its MySQL counterpart. @@ -2324,7 +2328,7 @@ It is required that point1<point2<...<pointN for this function to work correctly.

                                    -

                                    5.5.6. Miscellaneous functions

                                    +

                                    5.5.6. Miscellaneous functions

                                    CRC32()

                                    Returns the CRC32 value of a string argument. Introduced in version 2.0.1-beta. @@ -2338,15 +2342,15 @@ of the arguments refers directly to a pair attributes and the other one is constant.

                                    -

                                    5.6. Sorting modes

                                    +

                                    5.6. Sorting modes

                                    There are the following result sorting modes available: -

                                    • SPH_SORT_RELEVANCE mode, that sorts by relevance in descending order (best matches first);
                                    • -
                                    • SPH_SORT_ATTR_DESC mode, that sorts by an attribute in descending order (bigger attribute values first);
                                    • -
                                    • SPH_SORT_ATTR_ASC mode, that sorts by an attribute in ascending order (smaller attribute values first);
                                    • -
                                    • SPH_SORT_TIME_SEGMENTS mode, that sorts by time segments (last hour/day/week/month) in descending order, and then by relevance in descending order;
                                    • -
                                    • SPH_SORT_EXTENDED mode, that sorts by SQL-like combination of columns in ASC/DESC order;
                                    • -
                                    • SPH_SORT_EXPR mode, that sorts by an arithmetic expression.
                                    • +

                                      • SPH_SORT_RELEVANCE mode, that sorts by relevance in descending order (best matches first);

                                      • +
                                      • SPH_SORT_ATTR_DESC mode, that sorts by an attribute in descending order (bigger attribute values first);

                                      • +
                                      • SPH_SORT_ATTR_ASC mode, that sorts by an attribute in ascending order (smaller attribute values first);

                                      • +
                                      • SPH_SORT_TIME_SEGMENTS mode, that sorts by time segments (last hour/day/week/month) in descending order, and then by relevance in descending order;

                                      • +
                                      • SPH_SORT_EXTENDED mode, that sorts by SQL-like combination of columns in ASC/DESC order;

                                      • +
                                      • SPH_SORT_EXPR mode, that sorts by an arithmetic expression.

                                      @@ -2365,12 +2369,12 @@ The segments are calculated according to the current timestamp at the time when the search is performed, so the results would change over time. The segments are as follows: -

                                      • last hour,
                                      • -
                                      • last day,
                                      • -
                                      • last week,
                                      • -
                                      • last month,
                                      • -
                                      • last 3 months,
                                      • -
                                      • everything else.
                                      • +

                                        • last hour,

                                        • +
                                        • last day,

                                        • +
                                        • last week,

                                        • +
                                        • last month,

                                        • +
                                        • last 3 months,

                                        • +
                                        • everything else.

                                        These segments are hardcoded, but it is trivial to change them if necessary. @@ -2394,11 +2398,11 @@ and @id are internal attributes and price is user-specified.

                                        Known internal attributes are: -

                                        • @id (match ID)
                                        • -
                                        • @weight (match weight)
                                        • -
                                        • @rank (match weight)
                                        • -
                                        • @relevance (match weight)
                                        • -
                                        • @random (return results in random order)
                                        • +

                                          • @id (match ID)

                                          • +
                                          • @weight (match weight)

                                          • +
                                          • @rank (match weight)

                                          • +
                                          • @relevance (match weight)

                                          • +
                                          • @random (return results in random order)

                                          @rank and @relevance are just additional @@ -2412,9 +2416,9 @@ "@weight + ( user_karma + ln(pageviews) )*0.1" );

                                          The operators and functions supported in the expressions are discussed -in a separate section, Section 5.5, “Expressions, functions, and operators”. +in a separate section, Section 5.5, “Expressions, functions, and operators”.

                                        -

                                        5.7. Grouping (clustering) search results

                                        +

                                        5.7. Grouping (clustering) search results

                                        Sometimes it could be useful to group (or in other terms, cluster) search results and/or count per-group match counts - for instance, @@ -2431,11 +2435,11 @@ with SetGroupBy() API call. When grouping, all matches are assigned to different groups based on group-by value. This value is computed from specified attribute using one of the following built-in functions: -

                                        • SPH_GROUPBY_DAY, extracts year, month and day in YYYYMMDD format from timestamp;
                                        • -
                                        • SPH_GROUPBY_WEEK, extracts year and first day of the week number (counting from year start) in YYYYNNN format from timestamp;
                                        • -
                                        • SPH_GROUPBY_MONTH, extracts month in YYYYMM format from timestamp;
                                        • -
                                        • SPH_GROUPBY_YEAR, extracts year in YYYY format from timestamp;
                                        • -
                                        • SPH_GROUPBY_ATTR, uses attribute value itself for grouping.
                                        • +

                                          • SPH_GROUPBY_DAY, extracts year, month and day in YYYYMMDD format from timestamp;

                                          • +
                                          • SPH_GROUPBY_WEEK, extracts year and first day of the week number (counting from year start) in YYYYNNN format from timestamp;

                                          • +
                                          • SPH_GROUPBY_MONTH, extracts month in YYYYMM format from timestamp;

                                          • +
                                          • SPH_GROUPBY_YEAR, extracts year in YYYY format from timestamp;

                                          • +
                                          • SPH_GROUPBY_ATTR, uses attribute value itself for grouping.

                                          @@ -2446,11 +2450,11 @@ @count respectively.

                                          The result set is sorted by group-by sorting clause, with the syntax similar -to SPH_SORT_EXTENDED sorting clause +to SPH_SORT_EXTENDED sorting clause syntax. In addition to @id and @weight, group-by sorting clause may also include: -

                                          • @group (groupby function value),
                                          • -
                                          • @count (amount of matches in group).
                                          • +

                                            • @group (groupby function value),

                                            • +
                                            • @count (amount of matches in group).

                                            @@ -2469,18 +2473,18 @@ For example, if sorting by relevance and grouping by "published" attribute with SPH_GROUPBY_DAY function, then the result set will contain -

                                            • one most relevant match per each day when there were any -matches published,
                                            • -
                                            • with day number and per-day match count attached,
                                            • -
                                            • sorted by day number in descending order (ie. recent days first).
                                            • +

                                              • one most relevant match per each day when there were any +matches published,

                                              • +
                                              • with day number and per-day match count attached,

                                              • +
                                              • sorted by day number in descending order (ie. recent days first).

                                              Starting with version 0.9.9-rc2, aggregate functions (AVG(), MIN(), -MAX(), SUM()) are supported through SetSelect() API call +MAX(), SUM()) are supported through SetSelect() API call when using GROUP BY.

                                            -

                                            5.8. Distributed searching

                                            +

                                            5.8. Distributed searching

                                            To scale well, Sphinx has distributed searching capabilities. Distributed searching is useful to improve query latency (ie. search @@ -2493,13 +2497,13 @@ accross search nodes and then process it in parallel.

                                            Partitioning is done manually. You should -

                                            • setup several instances +

                                              • setup several instances of Sphinx programs (indexer and searchd) -on different servers;

                                              • -
                                              • make the instances index (and search) different parts of data;
                                              • -
                                              • configure a special distributed index on some of the searchd -instances;
                                              • -
                                              • and query this index.
                                              • +on different servers;

                                                +
                                              • make the instances index (and search) different parts of data;

                                              • +
                                              • configure a special distributed index on some of the searchd +instances;

                                              • +
                                              • and query this index.

                                              This index only contains references to other @@ -2508,12 +2512,12 @@

                                              When searchd receives a query against distributed index, it does the following: -

                                              1. connects to configured remote agents;
                                              2. -
                                              3. issues the query;
                                              4. -
                                              5. sequentially searches configured local indexes (while the remote agents are searching);
                                              6. -
                                              7. retrieves remote agents' search results;
                                              8. -
                                              9. merges all the results together, removing the duplicates;
                                              10. -
                                              11. sends the merged resuls to client.
                                              12. +

                                                1. connects to configured remote agents;

                                                2. +
                                                3. issues the query;

                                                4. +
                                                5. sequentially searches configured local indexes (while the remote agents are searching);

                                                6. +
                                                7. retrieves remote agents' search results;

                                                8. +
                                                9. merges all the results together, removing the duplicates;

                                                10. +
                                                11. sends the merged resuls to client.

                                                @@ -2528,15 +2532,15 @@ Any searchd instance could serve both as a master (which aggregates the results) and a slave (which only does local searching) at the same time. This has a number of uses: -

                                                1. every machine in a cluster could serve as a master which +

                                                  1. every machine in a cluster could serve as a master which searches the whole cluster, and search requests could be balanced between masters to achieve a kind of HA (high availability) in case any of the nodes fails; -

                                                  2. -
                                                  3. +

                                                  4. +
                                                  5. if running within a single multi-CPU or multi-core machine, there would be only 1 searchd instance quering itself as an agent and thus utilizing all CPUs/core. -

                                                  6. +

                                                  @@ -2544,7 +2548,7 @@ to specify which agents mirror each other, do health checks, keep track of alive agents, load-balance requests, etc.

                                                -

                                                5.9. searchd query log formats

                                                +

                                                5.9. searchd query log formats

                                                In version 2.0.1-beta and above two query log formats are supported. Previous versions only supported a custom plain text format. That format @@ -2556,7 +2560,7 @@ impossible) to replay for benchmarking purposes. The new sphinxql format alleviates that. It aims to be complete and automatable, even though at the cost of brevity and readability. -

                                                5.9.1. Plain log format

                                                +

                                                5.9.1. Plain log format

                                                By default, searchd logs all succesfully executed search queries into a query log file. Here's an example: @@ -2570,21 +2574,21 @@ total-matches (offset,limit) @groupby-attr] [index-name] query

                                                Match mode can take one of the following values: -

                                                • "all" for SPH_MATCH_ALL mode;
                                                • -
                                                • "any" for SPH_MATCH_ANY mode;
                                                • -
                                                • "phr" for SPH_MATCH_PHRASE mode;
                                                • -
                                                • "bool" for SPH_MATCH_BOOLEAN mode;
                                                • -
                                                • "ext" for SPH_MATCH_EXTENDED mode;
                                                • -
                                                • "ext2" for SPH_MATCH_EXTENDED2 mode;
                                                • -
                                                • "scan" if the full scan mode was used, either by being specified with SPH_MATCH_FULLSCAN, or if the query was empty (as documented under Matching Modes)
                                                • +

                                                  • "all" for SPH_MATCH_ALL mode;

                                                  • +
                                                  • "any" for SPH_MATCH_ANY mode;

                                                  • +
                                                  • "phr" for SPH_MATCH_PHRASE mode;

                                                  • +
                                                  • "bool" for SPH_MATCH_BOOLEAN mode;

                                                  • +
                                                  • "ext" for SPH_MATCH_EXTENDED mode;

                                                  • +
                                                  • "ext2" for SPH_MATCH_EXTENDED2 mode;

                                                  • +
                                                  • "scan" if the full scan mode was used, either by being specified with SPH_MATCH_FULLSCAN, or if the query was empty (as documented under Matching Modes)

                                                  Sort mode can take one of the following values: -

                                                  • "rel" for SPH_SORT_RELEVANCE mode;
                                                  • -
                                                  • "attr-" for SPH_SORT_ATTR_DESC mode;
                                                  • -
                                                  • "attr+" for SPH_SORT_ATTR_ASC mode;
                                                  • -
                                                  • "tsegs" for SPH_SORT_TIME_SEGMENTS mode;
                                                  • -
                                                  • "ext" for SPH_SORT_EXTENDED mode.
                                                  • +

                                                    • "rel" for SPH_SORT_RELEVANCE mode;

                                                    • +
                                                    • "attr-" for SPH_SORT_ATTR_DESC mode;

                                                    • +
                                                    • "attr+" for SPH_SORT_ATTR_ASC mode;

                                                    • +
                                                    • "tsegs" for SPH_SORT_TIME_SEGMENTS mode;

                                                    • +
                                                    • "ext" for SPH_SORT_EXTENDED mode.

                                                    Additionally, if searchd was started with --iostats, there will be a block of data after where the index(es) searched are listed.

                                                    A query log entry might take the form of:

                                                    @@ -2596,15 +2600,15 @@
                                                     the index files and time spent on I/O operations (although there is a background processing
                                                     component, the bulk of this time is the I/O operation time).
                                                     

                                                  -

                                                  5.9.2. SphinxQL log format

                                                  +

                                                  5.9.2. SphinxQL log format

                                                  This is a new log format introduced in 2.0.1-beta, with the goals begin logging everything and then some, and in a format easy to automate (for insance, automatically replay). New format can either be enabled -via the query_log_format +via the query_log_format directive in the configuration file, or switched back and forth on the fly with the -SET GLOBAL query_log_format=... +SET GLOBAL query_log_format=... statement via SphinxQL. In the new format, the example from the previous section would look as follows. (Wrapped below for readability, but with just one query per line in the actual log.) @@ -2623,11 +2627,11 @@

                                                  The features of SphinxQL log format compared to the default text one are as follows. -

                                                  • All request types should be logged. (This is still work in progress.)
                                                  • -
                                                  • Full statement data will be logged where possible.
                                                  • -
                                                  • Errors and warnings are logged.
                                                  • -
                                                  • The log should be automatically replayable via SphinxQL.
                                                  • -
                                                  • Additional performance counters (currently, per-agent distributed query times) are logged.
                                                  • +

                                                    • All request types should be logged. (This is still work in progress.)

                                                    • +
                                                    • Full statement data will be logged where possible.

                                                    • +
                                                    • Errors and warnings are logged.

                                                    • +
                                                    • The log should be automatically replayable via SphinxQL.

                                                    • +
                                                    • Additional performance counters (currently, per-agent distributed query times) are logged.

                                                    @@ -2641,7 +2645,7 @@ for performance reasons. Additional messages, counters, etc can be logged in the comments section after the request.

                                                  -

                                                  5.10. MySQL protocol support and SphinxQL

                                                  +

                                                  5.10. MySQL protocol support and SphinxQL

                                                  Starting with version 0.9.9-rc2, Sphinx searchd daemon supports MySQL binary network protocol and can be accessed with regular MySQL API. For instance, @@ -2675,7 +2679,7 @@ access methods can be used at the same time. Also, native API is still the default access method. MySQL protocol support needs to be additionally configured. This is a matter of 1-line config change, adding a new -listener with mysql41 specified +listener with mysql41 specified as a protocol:

                                                   listen = localhost:9306:mysql41
                                                  @@ -2685,26 +2689,26 @@
                                                   so Sphinx now also supports a subset of SQL that we dubbed SphinxQL.
                                                   It supports the standard querying all the index types with SELECT,
                                                   modifying RT indexes with INSERT, REPLACE, and DELETE, and much more.
                                                  -Full SphinxQL reference is available in Chapter 7, SphinxQL reference.
                                                  +Full SphinxQL reference is available in Chapter 7, SphinxQL reference.
                                                   

                                                  -

                                                  5.11. Multi-queries

                                                  +

                                                  5.11. Multi-queries

                                                  Multi-queries, or query batches, let you send multiple queries to Sphinx in one go (more formally, one network request).

                                                  Two API methods that implement multi-query mechanism are -AddQuery() and -RunQueries(). +AddQuery() and +RunQueries(). You can also run multiple queries with SphinxQL, see -Section 7.21, “Multi-statement queries”. -(In fact, regular Query() +Section 7.21, “Multi-statement queries”. +(In fact, regular Query() call is internally implemented as a single AddQuery() call immediately followed by RunQueries() call.) AddQuery() captures the current state of all the query settings set by previous API calls, and memorizes the query. RunQueries() actually sends all the memorized queries, and returns multiple result sets. There are no restrictions on the queries at all, except just a sanity check on a number of queries -in a single batch (see Section 11.4.25, “max_batch_queries”). +in a single batch (see Section 11.4.25, “max_batch_queries”).

                                                  Why use multi-queries? Generally, it all boils down to performance. First, by sending requests to searchd in a batch @@ -2763,8 +2767,8 @@ There's a common two-word part ("barack obama") that can be computed only once, then cached and shared across the queries. And common subtree optimization does just that. Per-query cache size is strictly controlled -by subtree_docs_cache -and subtree_hits_cache +by subtree_docs_cache +and subtree_hits_cache directives (so that caching all sxiteen gazillions of documents that match "i am" does not exhaust the RAM and instantly kill your server). @@ -2807,7 +2811,7 @@ even more improvements, and that's from production instances, not just synthetic tests.

                                                  -

                                                  5.12. Collations

                                                  +

                                                  5.12. Collations

                                                  Introduced to Sphinx in version 2.0.1-beta to supplement string sorting, collations essentially affect the string attribute comparisons. They specify @@ -2840,10 +2844,10 @@ Collations combine all of the above: the character set, the lanugage rules, and the case sensitivity. Sphinx currently provides the following four collations. -

                                                  1. libc_ci
                                                  2. -
                                                  3. libc_cs
                                                  4. -
                                                  5. utf8_general_ci
                                                  6. -
                                                  7. binary
                                                  8. +

                                                    1. libc_ci

                                                    2. +
                                                    3. libc_cs

                                                    4. +
                                                    5. utf8_general_ci

                                                    6. +
                                                    7. binary

                                                    @@ -2852,7 +2856,7 @@ case-insensitive (_ci) and case-sensitive (_cs) comparisons respectively. By default they will use C locale, effectively resorting to bytewise comparisons. To change that, you need to specify a different available -locale using collation_libc_locale +locale using collation_libc_locale directive. The list of locales available on your system can usually be obtained with the locale command:

                                                    @@ -2894,24 +2898,24 @@
                                                     SET collation_connection statement. All subsequent SphinxQL
                                                     queries will use this collation. SphinxAPI and SphinxSE queries will use
                                                     the server default collation, as specified in
                                                    -collation_server configuration
                                                    +collation_server configuration
                                                     directive. Sphinx currently defaults to libc_ci collation.
                                                     

                                                    Collations should affect all string attribute comparisons, including those within ORDER BY and GROUP BY, so differently ordered or grouped results can be returned depending on the collation chosen.

                                                  -

                                                  5.13. User-defined functions (UDF)

                                                  +

                                                  5.13. User-defined functions (UDF)

                                                  Starting with 2.0.1-beta, Sphinx supports User-Defined Functions, or UDF for short. They can be loaded and unloaded dynamically into searchd without having to restart the daemon, and used in expressions when searching. UDF features at a glance are as follows. -

                                                  • Functions can take integer (both 32-bit and 64-bit), float, string, or MVA arguments.
                                                  • -
                                                  • Functions can return integer or float values.
                                                  • -
                                                  • Functions can check the argument number, types, and names and raise errors.
                                                  • -
                                                  • Only simple functions (that is, non-aggregate ones) are currently supported.
                                                  • +

                                                    • Functions can take integer (both 32-bit and 64-bit), float, string, or MVA arguments.

                                                    • +
                                                    • Functions can return integer or float values.

                                                    • +
                                                    • Functions can check the argument number, types, and names and raise errors.

                                                    • +
                                                    • Only simple functions (that is, non-aggregate ones) are currently supported.

                                                    @@ -2920,13 +2924,13 @@ including Linux, Windows, MacOS, Solaris, BSD and others. (The internal testing has been done on Linux and Windows.) The UDF libraries must reside in a directory specified by -plugin_dir directive, and the +plugin_dir directive, and the server must be configured to use workers = threads mode. Relative paths to the library files are not allowed. Once the library is succesfully built and copied to the trusted location, you can then dynamically install and deinstall the functions using -CREATE FUNCTION and -DROP FUNCTION statements +CREATE FUNCTION and +DROP FUNCTION statements respectively. A single library can contain multiple functions. A library gets loaded when you first install a function from it, and unloaded when you deinstall all the functions from that library. @@ -2934,11 +2938,11 @@ The library functions that will implement a UDF visible to SQL statements need to follow C calling convention, and a simple naming convention. Sphinx source distribution provides a sample file, -src/udfexample.c, +src/udfexample.c, that defines a few simple functions showing how to work with integer, string, and MVA arguments; you can use that one as a foundation for your new functions. It includes the UDF interface header file, -src/sphinxudf.h, +src/sphinxudf.h, that defines the required types and structures. sphinxudf.h header is standalone, that is, does not require any other parts of Sphinx source to compile. @@ -2984,9 +2988,9 @@ SPH_UDF_ARGS, are defined in the src/sphinxudf.h interface header and documented there. RETURN_TYPE of the main function must be one of the following: -

                                                    • int for the functions that return INT.
                                                    • -
                                                    • sphinx_int64_t for the functions that return BIGINT.
                                                    • -
                                                    • float for the functions that return FLOAT.
                                                    • +

                                                      • int for the functions that return INT.

                                                      • +
                                                      • sphinx_int64_t for the functions that return BIGINT.

                                                      • +
                                                      • float for the functions that return FLOAT.

                                                      @@ -3001,7 +3005,7 @@ substituted. Sphinx might or might not choose to terminate such queries early, neither behavior is currently guaranteed.

                                                  -

                                                  Chapter 6. Command line tools reference

                                                  +

                                                  Chapter 6. Command line tools reference

                                                  As mentioned elsewhere, Sphinx is not a single program called 'sphinx', but a collection of 4 separate programs which collectively form Sphinx. This section -covers these tools and how to use them.

                                                  6.1. indexer command reference

                                                  +covers these tools and how to use them.

                                                  6.1. indexer command reference

                                                  indexer is the first of the two principle tools as part of Sphinx. Invoked from either the command line directly, or as part of a larger script, indexer is solely responsible @@ -3032,7 +3036,7 @@ in the configuration file, however there are some options you might need to specify on the command line as well, as they can affect how the indexing operation is performed. These options are: -

                                                  • --config <file> (-c <file> for short) +

                                                    • --config <file> (-c <file> for short) tells indexer to use the given file as its configuration. Normally, it will look for sphinx.conf in the installation directory (e.g. /usr/local/sphinx/etc/sphinx.conf if installed into @@ -3048,7 +3052,7 @@ $ indexer --config /home/myuser/sphinx.conf myindex

                                                    • -
                                                    • --all tells indexer to update +

                                                    • --all tells indexer to update every index listed in sphinx.conf, instead of listing individual indexes. This would be useful in small configurations, or cron-type or maintenance jobs where the entire index set will get rebuilt each day, or week, or whatever period is best. @@ -3057,7 +3061,7 @@ $ indexer --config /home/myuser/sphinx.conf --all

                                                    • -
                                                    • --rotate is used for rotating indexes. Unless you have the situation +

                                                    • --rotate is used for rotating indexes. Unless you have the situation where you can take the search function offline without troubling users, you will almost certainly need to keep search running whilst indexing new documents. --rotate creates a second index, parallel to the first (in the same place, simply including .new @@ -3066,13 +3070,13 @@ to rename the indexes (renaming the existing ones to include .old and renaming the .new to replace them), and then start serving from the newer files. Depending on the setting of -seamless_rotate, there may be a slight delay +seamless_rotate, there may be a slight delay in being able to search the newer indexes. Example usage:

                                                       $ indexer --rotate --all
                                                       

                                                    • -
                                                    • --quiet tells indexer not to output anything, +

                                                    • --quiet tells indexer not to output anything, unless there is an error. Again, most used for cron-type, or other script jobs where the output is irrelevant or unnecessary, except in the event of some kind of error. Example usage: @@ -3080,7 +3084,7 @@ $ indexer --rotate --all --quiet

                                                    • -
                                                    • --noprogress does not display progress details as they occur; +

                                                    • --noprogress does not display progress details as they occur; instead, the final status details (such as documents indexed, speed of indexing and so on are only reported at completion of indexing. In instances where the script is not being run on a console (or 'tty'), this will be on by default. Example usage: @@ -3088,7 +3092,7 @@ $ indexer --rotate --all --noprogress

                                                    • -
                                                    • --buildstops <outputfile.text> <N> reviews +

                                                    • --buildstops <outputfile.text> <N> reviews the index source, as if it were indexing the data, and produces a list of the terms that are being indexed. In other words, it produces a list of all the searchable terms that are becoming part of the index. Note; it does not update the index in question, @@ -3108,7 +3112,7 @@ the file will pertain to the last index indexed when specified with multiple indexes or --all (i.e. the last one listed in the configuration file)

                                                    • -
                                                    • --buildfreqs works with --buildstops +

                                                    • --buildfreqs works with --buildstops (and is ignored if --buildstops is not specified). As --buildstops provides the list of words used within the index, --buildfreqs adds the quantity present in the index, which would be @@ -3121,7 +3125,7 @@

                                                      This would produce the word_freq.txt as above, however after each word would be the number of times it occurred in the index in question.

                                                    • -
                                                    • --merge <dst-index> <src-index> is used +

                                                    • --merge <dst-index> <src-index> is used for physically merging indexes together, for example if you have a main+delta scheme, where the main index rarely changes, but the delta index is rebuilt frequently, and --merge would be used to combine the two. The operation moves @@ -3138,7 +3142,7 @@ indexer to combine the contents of the delta into the main index and rotate the indexes.

                                                    • -
                                                    • --merge-dst-range <attr> <min> <max> +

                                                    • --merge-dst-range <attr> <min> <max> runs the filter range given upon merging. Specifically, as the merge is applied to the destination index (as part of --merge, and is ignored if --merge is not specified), indexer @@ -3154,34 +3158,34 @@ to add successive filters to the merge, all of which must be met in order for a document to become part of the final index.

                                                    • -
                                                    • --dump-rows <FILE> dumps rows fetched +
                                                    • --dump-rows <FILE> dumps rows fetched by SQL source(s) into the specified file, in a MySQL compatible syntax. Resulting dumps are the exact representation of data as received by indexer and help to repeat indexing-time issues. -

                                                    • -
                                                    • --verbose guarantees that every row that +

                                                    • +
                                                    • --verbose guarantees that every row that caused problems indexing (duplicate, zero, or missing document ID; or file field IO issues; etc) will be reported. By default, this option is off, and problem summaries may be reported instead. -

                                                    • -
                                                    • --sighup-each is useful when you are +

                                                    • +
                                                    • --sighup-each is useful when you are rebuilding many big indexes, and want each one rotated into searchd as soon as possible. With --sighup-each, indexer will send a SIGHUP signal to searchd after succesfully completing the work on each index. (The default behavior is to send a single SIGHUP after all the indexes were built.) -

                                                    • -
                                                    • --print-queries prints out +

                                                    • +
                                                    • --print-queries prints out SQL queries that indexer sends to the database, along with SQL connection and disconnection events. That is useful to diagnose and fix problems with SQL sources. -

                                                    • +

                                                  -

                                                  6.2. searchd command reference

                                                  +

                                                  6.2. searchd command reference

                                                  searchd is the second of the two principle tools as part of Sphinx. searchd is the part of the system which actually handles searches; it functions as a server and is responsible for receiving queries, processing them and @@ -3191,25 +3195,25 @@ as a service (on Windows-type systems), so not all of the command line options will always apply, and so will be build-dependent.

                                                  Calling searchd is simply a case of:

                                                   $ searchd [OPTIONS]
                                                  -

                                                  The options available to searchd on all builds are:

                                                  • --help (-h for short) lists all of the +

                                                    The options available to searchd on all builds are:

                                                    • --help (-h for short) lists all of the parameters that can be called in your particular build of searchd. -

                                                    • -
                                                    • --config <file> (-c <file> for short) +

                                                    • +
                                                    • --config <file> (-c <file> for short) tells searchd to use the given file as its configuration, just as with indexer above. -

                                                    • -
                                                    • --stop is used to asynchronously stop searchd, +

                                                    • +
                                                    • --stop is used to asynchronously stop searchd, using the details of the PID file as specified in the sphinx.conf file, so you may also need to confirm to searchd which configuration file to use with the --config option. NB, calling --stop will also make sure any changes applied to the indexes with - UpdateAttributes() + UpdateAttributes() will be applied to the index files themselves. Example:

                                                       $ searchd --config /home/myuser/sphinx.conf --stop
                                                       

                                                    • -
                                                    • --stopwait is used to synchronously stop searchd. +

                                                    • --stopwait is used to synchronously stop searchd. --stop essentially tells the running instance to exit (by sending it a SIGTERM) and then immediately returns. --stopwait will also attempt to wait until the running searchd instance actually finishes the shutdown (eg. saves all @@ -3218,26 +3222,26 @@ $ searchd --config /home/myuser/sphinx.conf --stopwait

                                                      Possible exit codes are as follows: -

                                                      • 0 on success;
                                                      • -
                                                      • 1 if connection to running searchd daemon failed;
                                                      • -
                                                      • 2 if daemon reported an error during shutdown;
                                                      • -
                                                      • 3 if daemon crashed during shutdown.
                                                      • +

                                                        • 0 on success;

                                                        • +
                                                        • 1 if connection to running searchd daemon failed;

                                                        • +
                                                        • 2 if daemon reported an error during shutdown;

                                                        • +
                                                        • 3 if daemon crashed during shutdown.

                                                        -
                                                      • --status command is used to query running +

                                                      • --status command is used to query running searchd instance status, using the connection details from the (optionally) provided configuration file. It will try to connect to the running instance using the first configured UNIX socket or TCP port. On success, it will query for a number of status and performance counter -values and print them. You can use Status() +values and print them. You can use Status() API call to access the very same counters from your application. Examples:

                                                         $ searchd --status
                                                         $ searchd --config /home/myuser/sphinx.conf --status
                                                         

                                                      • -
                                                      • --pidfile is used to explicitly state a PID file, +

                                                      • --pidfile is used to explicitly state a PID file, where the process information is stored regarding searchd, used for inter-process communications (for example, indexer will need to know the PID to contact searchd for rotating @@ -3249,7 +3253,7 @@ $ searchd --config /home/myuser/sphinx.conf --pidfile /home/myuser/sphinx.pid

                                                      • -
                                                      • --console is used to force searchd +

                                                      • --console is used to force searchd into console mode; typically it will be running as a conventional server application, and will aim to dump information into the log files (as specified in sphinx.conf). Sometimes though, when debugging issues @@ -3264,23 +3268,23 @@ $ searchd --config /home/myuser/sphinx.conf --console

                                                      • -
                                                      • --logdebug enables additional debug output +
                                                      • --logdebug enables additional debug output in the daemon log. Should only be needed rarely, to assist with debugging issues that could not be easily reproduced on request. -

                                                      • -
                                                      • --iostats is used in conjuction with the +

                                                      • +
                                                      • --iostats is used in conjuction with the logging options (the query_log will need to have been activated in sphinx.conf) to provide more detailed information on a per-query basis as to the input/output operations carried out in the course of that query, with a slight performance hit and of course bigger logs. Further details are available under the -query log format section. +query log format section. You might start searchd thus:

                                                         $ searchd --config /home/myuser/sphinx.conf --iostats
                                                         

                                                      • -
                                                      • --cpustats is used to provide actual CPU time +

                                                      • --cpustats is used to provide actual CPU time report (in addition to wall time) in both query log file (for every given query) and status report (aggregated). It depends on clock_gettime() system call and might therefore be unavailable on certain systems. You might start @@ -3289,7 +3293,7 @@ $ searchd --config /home/myuser/sphinx.conf --cpustats

                                                      • -
                                                      • --port portnumber (-p for short) +

                                                      • --port portnumber (-p for short) is used to specify the port that searchd should listen on, usually for debugging purposes. This will usually default to 9312, but sometimes you need to run it on a different port. Specifying it on the command line @@ -3300,7 +3304,7 @@ $ searchd --port 9313

                                                      • -
                                                      • --listen ( address ":" port | port | path ) [ ":" protocol ] +
                                                      • --listen ( address ":" port | port | path ) [ ":" protocol ] (or -l for short) Works as --port, but allow you to specify not only the port, but full path, as IP address and port, or Unix-domain socket path, that searchd will listen on. @@ -3311,8 +3315,8 @@ can also specify a protocol handler (listener) to be used for connections on this socket. Supported protocol values are 'sphinx' (Sphinx 0.9.x API protocol) and 'mysql41' (MySQL protocol used since -4.1 upto at least 5.1).

                                                      • -
                                                      • --index <index> (or -i +4.1 upto at least 5.1).

                                                      • +
                                                      • --index <index> (or -i <index> for short) forces this instance of searchd only to serve the specified index. Like --port, above, this is usually for debugging purposes; @@ -3322,19 +3326,19 @@ $ searchd --index myindex

                                                      • -
                                                      • --strip-path strips the path names from +
                                                      • --strip-path strips the path names from all the file names referenced from the index (stopwords, wordforms, exceptions, etc). This is useful for picking up indexes built on another machine with possibly different path layouts. -

                                                      • -
                                                      • --replay-flags=<OPTIONS> switch, +

                                                      • +
                                                      • --replay-flags=<OPTIONS> switch, added in version 2.0.2-beta, can be used to specify a list of extra binary log replay options. The supported options are: -

                                                        • accept-desc-timestamp, +

                                                          • accept-desc-timestamp, ignore descending transaction timestamps and replay such transactions anyway (the default behavior is to exit with an error). -

                                                          • +

                                                          Example: @@ -3344,7 +3348,7 @@

                                                        There are some options for searchd that are specific -to Windows platforms, concerning handling as a service, are only be available on Windows binaries.

                                                        Note that on Windows searchd will default to --console mode, unless you install it as a service.

                                                        • --install installs searchd as a service +to Windows platforms, concerning handling as a service, are only be available on Windows binaries.

                                                          Note that on Windows searchd will default to --console mode, unless you install it as a service.

                                                          • --install installs searchd as a service into the Microsoft Management Console (Control Panel / Administrative Tools / Services). Any other parameters specified on the command line, where --install is specified will also become part of the command line on future starts of the service. @@ -3365,7 +3369,7 @@ --config C:\Sphinx\sphinx.conf --iostats

                                                          • -
                                                          • --delete removes the service from the Microsoft Management Console +

                                                          • --delete removes the service from the Microsoft Management Console and other places where services are registered, after previously installed with --install. Note, this does not uninstall the software or delete the indexes. It means the service will not be called from the services systems, and will not be started @@ -3378,7 +3382,7 @@ C:\WINDOWS\system32> C:\Sphinx\bin\searchd.exe --delete

                                                          • -
                                                          • --servicename <name> applies the given name to +

                                                          • --servicename <name> applies the given name to searchd when installing or deleting the service, as would appear in the Management Console; this will default to searchd, but if being deployed on servers where multiple administrators may log into the system, or a system with multiple @@ -3390,13 +3394,13 @@ --config C:\Sphinx\sphinx.conf --servicename SphinxSearch

                                                          • -
                                                          • --ntservice is the option that is passed by the +
                                                          • --ntservice is the option that is passed by the Management Console to searchd to invoke it as a service on Windows platforms. It would not normally be necessary to call this directly; this would normally be called by Windows when the service would be started, although if you wanted to call this as a regular service from the command-line (as the complement to --console) you could do so in theory. -

                                                          • +

                                                          Last but not least, as every other daemon, searchd supports a number of signals. @@ -3404,14 +3408,14 @@

                                                          Initiates a clean shutdown. New queries will not be handled; but queries that are already started will not be forcibly interrupted.

                                                          SIGHUP

                                                          Initiates index rotation. Depending on the value of - seamless_rotate setting, + seamless_rotate setting, new queries might be shortly stalled; clients will receive temporary errors.

                                                          SIGUSR1

                                                          Forces reopen of searchd log and query log files, letting you implement log file rotation.

                    -

                    6.3. search command reference

                    +

                    6.3. search command reference

                    search is one of the helper tools within the Sphinx package. Whereas searchd is responsible for searches in a server-type environment, search is @@ -3441,33 +3445,33 @@ SetMatchMode, and specifying * as the indexes to query as part of Query.

                    There are many options available to search. Firstly, the general options: -

                    • --config <file> (-c +

                      • --config <file> (-c <file> for short) tells search to use the given file as its configuration, just as with -indexer above.

                      • -
                      • --index <index> (-i +indexer above.

                      • +
                      • --index <index> (-i <index> for short) tells search to limit searching to the specified index only; normally it would attempt to search all of the physical indexes listed in -sphinx.conf, not any distributed ones.

                      • -
                      • --stdin tells search to +sphinx.conf, not any distributed ones.

                      • +
                      • --stdin tells search to accept the query from the standard input, rather than the command line. This can be useful for testing purposes whereby you could feed input via -pipes and from scripts.

                      • +pipes and from scripts.

                      Options for setting matches: -

                      • --any (-a for short) changes +

                        • --any (-a for short) changes the matching mode to match any of the words as part of the query (word1 OR word2 OR word3). In the API this would be equivalent to passing -SPH_MATCH_ANY to SetMatchMode.

                        • -
                        • --phrase (-p for short) +SPH_MATCH_ANY to SetMatchMode.

                        • +
                        • --phrase (-p for short) changes the matching mode to match all of the words as part of the query, and do so in the phrase given (not including punctuation). In the API this would be equivalent to passing SPH_MATCH_PHRASE to -SetMatchMode.

                        • -
                        • --boolean (-b for short) -changes the matching mode to Boolean +SetMatchMode.

                        • +
                        • --boolean (-b for short) +changes the matching mode to Boolean matching. Note if using Boolean syntax matching on the command line, you may need to escape the symbols (with a backslash) to avoid the shell/command line processor applying them, such as ampersands being @@ -3475,14 +3479,14 @@ search process, although this can be resolved by using --stdin, as below. In the API this would be equivalent to passing SPH_MATCH_BOOLEAN to -SetMatchMode.

                        • -
                        • --ext (-e for short) changes -the matching mode to extended +SetMatchMode.

                        • +
                        • --ext (-e for short) changes +the matching mode to extended matching which provides various text querying operators. In the API this would be equivalent to passing SPH_MATCH_EXTENDED to SetMatchMode. -

                        • -
                        • --filter <attr> <v> (-f +

                        • +
                        • --filter <attr> <v> (-f <attr> <v> for short) filters the results such that only documents where the attribute given (attr) matches the value given (v). For example, --filter deleted 0 only matches @@ -3490,34 +3494,34 @@ also add multiple filters on the command line, by specifying multiple --filter multiple times, however if you apply a second filter to an attribute it will override the first defined -filter.

                        • +filter.

                        Options for handling the results: -

                        • --limit <count> (-l +

                          • --limit <count> (-l count for short) limits the total number of matches back to the number given. If a 'group' is specified, this will be the number of grouped results. This defaults to 20 results if not specified (as do the -APIs)

                          • -
                          • --offset <count> (-o +APIs)

                          • +
                          • --offset <count> (-o <count> for short) offsets the result list by the number of places set by the count; this would be used for pagination through results, where if you have 20 results per 'page', the second page would -begin at offset 20, the third page at offset 40, etc.

                          • -
                          • --group <attr> (-g +begin at offset 20, the third page at offset 40, etc.

                          • +
                          • --group <attr> (-g <attr> for short) specifies that results should be grouped together based on the attribute specified. Like the GROUP BY clause in SQL, it will combine all results where the attribute given matches, and returns a set of results where each returned result is the best from each group. Unless otherwise specified, this will be the best match on -relevance.

                          • -
                          • --groupsort <expr> (-gs +relevance.

                          • +
                          • --groupsort <expr> (-gs <expr> for short) instructs that when results are grouped with --group, the expression given in <expr> shall determine the order of the groups. Note, this does not specify which is the best item within the group, only the order in which the groups -themselves shall be returned.

                          • -
                          • --sortby <clause> (-s +themselves shall be returned.

                          • +
                          • --sortby <clause> (-s <clause> for short) specifies that results should be sorted in the order listed in <clause>. This allows you to specify the order you wish results to be presented in, ordering by different columns. @@ -3529,42 +3533,42 @@ (--sortby @weight,DESC) to avoid the items being treated separately. Additionally, like the regular sorting modes, if --group (grouping) is being used, this will state how to -establish the best match within each group.

                          • -
                          • --sortexpr expr (-S expr for +establish the best match within each group.

                          • +
                          • --sortexpr expr (-S expr for short) specifies that the search results should be presented in an order determined by an arithmetic expression, stated in expr. For example: --sortexpr "@weight + ( user_karma + ln(pageviews) )*0.1" (again noting that this will have to be quoted to avoid the shell dealing with the asterisk). Extended sort mode is discussed in more detail under -the SPH_SORT_EXTENDED entry under the Sorting modes section of the -manual.

                          • -
                          • --sort=date specifies that the results should +the SPH_SORT_EXTENDED entry under the Sorting modes section of the +manual.

                          • +
                          • --sort=date specifies that the results should be sorted by descending (i.e. most recent first) date. This requires that -there is an attribute in the index that is set as a timestamp.

                          • -
                          • --rsort=date specifies that the results should +there is an attribute in the index that is set as a timestamp.

                          • +
                          • --rsort=date specifies that the results should be sorted by ascending (i.e. oldest first) date. This requires that there -is an attribute in the index that is set as a timestamp.

                          • -
                          • --sort=ts specifies that the results should be +is an attribute in the index that is set as a timestamp.

                          • +
                          • --sort=ts specifies that the results should be sorted by timestamp in groups; it will return all of the documents whose timestamp is within the last hour, then sorted within that bracket for relevance. After, it would return the documents from the last day, sorted by relevance, then the last week and then the last month. It is discussed in more detail under the SPH_SORT_TIME_SEGMENTS entry -under the Sorting modes section of -the manual.

                          • +under the Sorting modes section of +the manual.

                          Other options: -

                          • --noinfo (-q for short) +

                            • --noinfo (-q for short) instructs search not to look-up data in your SQL database. Specifically, for debugging with MySQL and search, you can provide it with a query to look up the full article based on the returned document ID. It is explained in -more detail under the sql_query_info directive.

                            • +more detail under the sql_query_info directive.

                          -

                          6.4. spelldump command reference

                          +

                          6.4. spelldump command reference

                          spelldump is one of the helper tools within the Sphinx package.

                          It is used to extract the contents of a dictionary file that uses ispell or MySpell format, which can help build word lists for wordforms - all of @@ -3589,7 +3593,7 @@ zoned > zoned zoning > zoning

                          -

                          6.5. indextool command reference

                          +

                          6.5. indextool command reference

                          indextool is one of the helper tools within the Sphinx package, introduced in version 0.9.9-rc2. It is used to @@ -3602,58 +3606,58 @@

                          The only currently available option applies to all commands and lets you specify the configuration file: -

                          • --config <file> (-c <file> for short) +

                            • --config <file> (-c <file> for short) overrides the built-in config file names. -

                            • +

                            The commands are as follows: -

                            • --dumpheader FILENAME.sph quickly dumps +

                              • --dumpheader FILENAME.sph quickly dumps the provided index header file without touching any other index files or even the configuration file. The report provides a breakdown of all the index settings, in particular the entire attribute and field list. Prior to 0.9.9-rc2, this command was present in CLI search utility. -

                              • -
                              • --dumpconfig FILENAME.sph dumps +

                              • +
                              • --dumpconfig FILENAME.sph dumps the index definition from the given index header file in (almost) compliant sphinx.conf file format. Added in version 2.0.1-beta. -

                              • -
                              • --dumpheader INDEXNAME dumps index header +

                              • +
                              • --dumpheader INDEXNAME dumps index header by index name with looking up the header path in the configuration file. -

                              • -
                              • --dumpdocids INDEXNAME dumps document IDs +

                              • +
                              • --dumpdocids INDEXNAME dumps document IDs by index name. It takes the data from attribute (.spa) file and therefore requires docinfo=extern to work. -

                              • -
                              • --dumphitlist INDEXNAME KEYWORD dumps all +

                              • +
                              • --dumphitlist INDEXNAME KEYWORD dumps all the hits (occurences) of a given keyword in a given index, with keyword specified as text. -

                              • -
                              • --dumphitlist INDEXNAME --wordid ID dumps all +

                              • +
                              • --dumphitlist INDEXNAME --wordid ID dumps all the hits (occurences) of a given keyword in a given index, with keyword specified as internal numeric ID. -

                              • -
                              • --htmlstrip INDEXNAME filters stdin using +

                              • +
                              • --htmlstrip INDEXNAME filters stdin using HTML stripper settings for a given index, and prints the filtering results to stdout. Note that the settings will be taken from sphinx.conf, and not the index header. -

                              • -
                              • --check INDEXNAME checks the index data +

                              • +
                              • --check INDEXNAME checks the index data files for consistency errors that might be introduced either by bugs in indexer and/or hardware faults. Starting with version 2.0.2-beta, --check also works on RT indexes, but checks disk chunks only. -

                              • -
                              • --strip-path strips the path names from +

                              • +
                              • --strip-path strips the path names from all the file names referenced from the index (stopwords, wordforms, exceptions, etc). This is useful for checking indexes built on another machine with possibly different path layouts. -

                              • +

                          -

                          Chapter 7. SphinxQL reference

                          +

                          Chapter 7. SphinxQL reference

                          Table of Contents

                          7.1. SELECT syntax
                          7.2. SHOW META syntax
                          7.3. SHOW WARNINGS syntax
                          @@ -3686,7 +3690,7 @@ SphinxQL but not vice versa; for instance, writes into RT indexes are only available via SphinxQL. This chapter documents supported SphinxQL statements syntax. -

                          7.1. SELECT syntax

                          +

                          7.1. SELECT syntax

                           SELECT
                               select_expr [, select_expr ...]
                          @@ -3702,7 +3706,7 @@
                           It's syntax is based upon regular SQL but adds several Sphinx-specific
                           extensions and has a few omissions (such as (currently) missing support for JOINs).
                           Specifically,
                          -

                          • Column list clause. Column names, arbitrary expressions, +

                            • Column list clause. Column names, arbitrary expressions, and star ('*') are all allowed (ie. SELECT @id, group_id*123+456 AS expr1 FROM test1 will work). Unlike in regular SQL, all computed expressions must be aliased @@ -3710,24 +3714,24 @@ is optional. Special names such as @id and @weight should currently be used with leading at-sign. This at-sign requirement will be lifted in the future. -

                            • -
                            • FROM clause. FROM clause should contain the list of indexes +

                            • +
                            • FROM clause. FROM clause should contain the list of indexes to search through. Unlike in regular SQL, comma means enumeration of -full-text indexes as in Query() +full-text indexes as in Query() API call rather than JOIN. -

                            • -
                            • WHERE clause. This clause will map both to fulltext query +

                            • +
                            • WHERE clause. This clause will map both to fulltext query and filters. Comparison operators (=, !=, <, >, <=, >=), IN, AND, NOT, and BETWEEN are all supported and map directly to filters. OR is not supported yet but will be in the future. MATCH('query') is supported and maps to fulltext query. Query will be interpreted -according to full-text query language rules. +according to full-text query language rules. There must be at most one MATCH() in the clause. Starting with version 2.0.1-beta, {col_name | expr_alias} [NOT] IN @uservar -condition syntax is supported. (Refer to Section 7.7, “SET syntax” +condition syntax is supported. (Refer to Section 7.7, “SET syntax” for a discussion of global user variables.) -

                            • -
                            • GROUP BY clause. Currently only supports grouping by a single +

                            • +
                            • GROUP BY clause. Currently only supports grouping by a single column. The column however can be a computed expression:

                               SELECT *, group_id*1000+article_type AS gkey FROM example GROUP BY gkey
                              @@ -3747,9 +3751,9 @@
                               GROUP BY vendorid
                               

                              Starting with 2.0.1-beta, GROUP BY on a string attribute is supported, -with respect for current collation (see Section 5.12, “Collations”). +with respect for current collation (see Section 5.12, “Collations”).

                            • -
                            • WITHIN GROUP ORDER BY clause. This is a Sphinx specific +

                            • WITHIN GROUP ORDER BY clause. This is a Sphinx specific extension that lets you control how the best row within a group will to be selected. The syntax matches that of regular ORDER BY clause: @@ -3761,9 +3765,9 @@ ORDER BY timeseg DESC, @weight DESC

                          Starting with 2.0.1-beta, WITHIN GROUP ORDER BY on a string attribute is supported, -with respect for current collation (see Section 5.12, “Collations”). +with respect for current collation (see Section 5.12, “Collations”).

                        • -
                        • ORDER BY clause. Unlike in regular SQL, only column names +

                        • ORDER BY clause. Unlike in regular SQL, only column names (not expressions) are allowed and explicit ASC and DESC are required. The columns however can be computed expressions:

                          @@ -3771,32 +3775,32 @@
                           

                          Starting with 2.0.1-beta, ORDER BY on a string attribute is supported, -with respect for current collation (see Section 5.12, “Collations”). +with respect for current collation (see Section 5.12, “Collations”).

                          Starting with 2.0.2-beta, ORDER BY RAND() syntax is supported. Note that this syntax is actually going to randomize the weight values and then order matches by those randomized weights.

                        • -
                        • LIMIT clause. Both LIMIT N and LIMIT M,N forms are supported. +
                        • LIMIT clause. Both LIMIT N and LIMIT M,N forms are supported. Unlike in regular SQL (but like in Sphinx API), an implicit LIMIT 0,20 is present by default. -

                        • -
                        • OPTION clause. This is a Sphinx specific extension that +

                        • +
                        • OPTION clause. This is a Sphinx specific extension that lets you control a number of per-query options. The syntax is:

                           OPTION <optionname>=<value> [ , ... ]
                           

                          Supported options and respectively allowed values are: -

                          • 'ranker' - any of 'proximity_bm25', 'bm25', 'none', 'wordcount', 'proximity', 'matchany', or 'fieldmask'
                          • -
                          • 'max_matches' - integer (per-query max matches value)
                          • -
                          • 'cutoff' - integer (max found matches threshold)
                          • -
                          • 'max_query_time' - integer (max search time threshold, msec)
                          • -
                          • 'retry_count' - integer (distributed retries count)
                          • -
                          • 'retry_delay' - integer (distributed retry delay, msec)
                          • -
                          • 'field_weights' - a named integer list (per-field user weights for ranking)
                          • -
                          • 'index_weights' - a named integer list (per-index user weights for ranking)
                          • -
                          • 'reverse_scan' - 0 or 1, lets you control the order in which full-scan query processes the rows
                          • -
                          • 'comment' - string, user comment that gets copied to a query log file
                          • +

                            • 'ranker' - any of 'proximity_bm25', 'bm25', 'none', 'wordcount', 'proximity', 'matchany', or 'fieldmask'

                            • +
                            • 'max_matches' - integer (per-query max matches value)

                            • +
                            • 'cutoff' - integer (max found matches threshold)

                            • +
                            • 'max_query_time' - integer (max search time threshold, msec)

                            • +
                            • 'retry_count' - integer (distributed retries count)

                            • +
                            • 'retry_delay' - integer (distributed retry delay, msec)

                            • +
                            • 'field_weights' - a named integer list (per-field user weights for ranking)

                            • +
                            • 'index_weights' - a named integer list (per-index user weights for ranking)

                            • +
                            • 'reverse_scan' - 0 or 1, lets you control the order in which full-scan query processes the rows

                            • +
                            • 'comment' - string, user comment that gets copied to a query log file

                            Example: @@ -3809,7 +3813,7 @@

                        -

                        7.2. SHOW META syntax

                        +

                        7.2. SHOW META syntax

                         SHOW META
                         

                        SHOW META shows additional meta-information about the latest @@ -3845,7 +3849,7 @@ 12 rows in set (0.00 sec)

                        -

                        7.3. SHOW WARNINGS syntax

                        +

                        7.3. SHOW WARNINGS syntax

                         SHOW WARNINGS
                         

                        SHOW WARNINGS statement, introduced in version 0.9.9-rc2, @@ -3877,7 +3881,7 @@ 1 row in set (0.00 sec)

                        -

                        7.4. SHOW STATUS syntax

                        +

                        7.4. SHOW STATUS syntax

                        SHOW STATUS, introduced in version 0.9.9-rc2, displays a number of useful performance counters. IO and CPU counters will only be available if searchd was started with --iostats and --cpustats @@ -3920,7 +3924,7 @@ 29 rows in set (0.00 sec)

                        -

                        7.5. INSERT and REPLACE syntax

                        +

                        7.5. INSERT and REPLACE syntax

                         {INSERT | REPLACE} INTO index [(column, ...)]
                         	VALUES (value, ...)
                        @@ -3943,7 +3947,7 @@
                         Multiple rows can be inserted using a single INSERT statement by providing
                         several comma-separated, parens-enclosed lists of rows values.
                         

                        -

                        7.6. DELETE syntax

                        +

                        7.6. DELETE syntax

                         DELETE FROM index WHERE {id = value | id IN (val1 [, val2 [, ...]])}
                         

                        @@ -3957,7 +3961,7 @@ Additional types of WHERE conditions (such as conditions on attributes, etc) are planned, but not supported yet as of 1.10-beta.

                        -

                        7.7. SET syntax

                        +

                        7.7. SET syntax

                         SET [GLOBAL] server_variable_name = value
                         SET GLOBAL @user_variable_name = (int_val1 [, int_val2, ...])
                        @@ -3974,9 +3978,9 @@
                         and frameworks that may need to run this statement when connecting.
                         

                        There are the following classes of the variables: -

                        1. per-session server variable (1.10-beta and above)
                        2. -
                        3. global server variable (2.0.1-beta and above)
                        4. -
                        5. global user variable (2.0.1-beta and above)
                        6. +

                          1. per-session server variable (1.10-beta and above)

                          2. +
                          3. global server variable (2.0.1-beta and above)

                          4. +
                          5. global user variable (2.0.1-beta and above)

                          @@ -4012,7 +4016,7 @@

                          COLLATION_CONNECTION = collation_name

                          Selects the collation to be used for ORDER BY or GROUP BY on string -values in the subsequent queries. Refer to Section 5.12, “Collations” +values in the subsequent queries. Refer to Section 5.12, “Collations” for a list of known collation names. Introduced in version 2.0.1-beta.

                          CHARACTER_SET_RESULTS = charset_name
                          @@ -4057,7 +4061,7 @@ Query OK, 0 rows affected (0.00 sec)

                        -

                        7.8. SET TRANSACTION syntax

                        +

                        7.8. SET TRANSACTION syntax

                         SET TRANSACTION ISOLATION LEVEL { READ UNCOMMITTED
                         	| READ COMMITTED
                        @@ -4075,7 +4079,7 @@
                         Query OK, 0 rows affected (0.00 sec)
                         

                        -

                        7.9. BEGIN, COMMIT, and ROLLBACK syntax

                        +

                        7.9. BEGIN, COMMIT, and ROLLBACK syntax

                         START TRANSACTION | BEGIN
                         COMMIT
                        @@ -4097,7 +4101,7 @@
                         means that the changes are not only invisible to the concurrent transactions
                         but even to the current session itself.
                         

                        -

                        7.10. CALL SNIPPETS syntax

                        +

                        7.10. CALL SNIPPETS syntax

                         CALL SNIPPETS(data, index, query[, opt_value AS opt_name[, ...]])
                         

                        @@ -4109,7 +4113,7 @@ index is the name of the index from which to take the text processing settings. query is the full-text query to build snippets for. Additional options are documented in -Section 8.7.1, “BuildExcerpts”. Usage example: +Section 8.7.1, “BuildExcerpts”. Usage example:

                         CALL SNIPPETS('this is my document text', 'test1', 'hello world',
                             5 AS around, 200 AS limit);
                        @@ -4118,7 +4122,7 @@
                         CALL SNIPPETS(('data/doc1.txt','data/doc2.txt','/home/sphinx/doc3.txt'), 'test1', 'hello world',
                             5 AS around, 200 AS limit, 1 AS load_files);
                         
                        -

                        7.11. CALL KEYWORDS syntax

                        +

                        7.11. CALL KEYWORDS syntax

                         CALL KEYWORDS(text, index, [hits])
                         

                        @@ -4131,7 +4135,7 @@ processing settings. hits is an optional boolean parameter that specifies whether to return document and hit occurrence statistics.

                        -

                        7.12. SHOW TABLES syntax

                        +

                        7.12. SHOW TABLES syntax

                         SHOW TABLES
                         

                        @@ -4153,7 +4157,7 @@ 4 rows in set (0.00 sec)

                        -

                        7.13. DESCRIBE syntax

                        +

                        7.13. DESCRIBE syntax

                         {DESC | DESCRIBE} index
                         

                        @@ -4182,17 +4186,17 @@ +---------+---------+ 4 rows in set (0.00 sec)

                        -

                        7.14. CREATE FUNCTION syntax

                        +

                        7.14. CREATE FUNCTION syntax

                         CREATE FUNCTION udf_name
                         	RETURNS {INT | BIGINT | FLOAT}
                         	SONAME 'udf_lib_file'
                         

                        CREATE FUNCTION statement, introduced in version 2.0.1-beta, -installs a user-defined function (UDF) +installs a user-defined function (UDF) with the given name and type from the given library file. The library file must reside in a trusted -plugin_dir directory. +plugin_dir directory. On success, the function is available for use in all subsequent queries that the server receives. Example:

                        @@ -4209,12 +4213,12 @@
                         |    4 |      1 | 7,40    | 23.500000 |
                         +------+--------+---------+-----------+
                         
                        -

                        7.15. DROP FUNCTION syntax

                        +

                        7.15. DROP FUNCTION syntax

                         DROP FUNCTION udf_name
                         

                        DROP FUNCTION statement, introduced in version 2.0.1-beta, -deinstalls a user-defined function (UDF) +deinstalls a user-defined function (UDF) with the given name. On success, the function is no longer available for use in subsequent queries. Pending concurrent queries will not be affected and the library unload, if necessary, will be postponed @@ -4223,7 +4227,7 @@ mysql> DROP FUNCTION avgmva; Query OK, 0 rows affected (0.00 sec)

                        -

                        7.16. SHOW VARIABLES syntax

                        +

                        7.16. SHOW VARIABLES syntax

                         SHOW [{GLOBAL | SESSION}] VARIABLES
                         

                        SHOW VARIABLES statement was added in version 2.0.1-beta @@ -4248,7 +4252,7 @@ 4 rows in set (0.00 sec)

                        -

                        7.17. SHOW COLLATION syntax

                        +

                        7.17. SHOW COLLATION syntax

                         SHOW COLLATION
                         

                        @@ -4260,7 +4264,7 @@ mysql> SHOW COLLATION; Query OK, 0 rows affected (0.00 sec)

                        -

                        7.18. UPDATE syntax

                        +

                        7.18. UPDATE syntax

                         UPDATE index SET col1 = newval1 [, ...] WHERE where_condition
                         

                        @@ -4272,8 +4276,8 @@ except for strings can be updated. Previously, some of the types were not supported.

                        -where_condition uses the same syntax as the SELECT statement -(see Section 7.1, “SELECT syntax” for details). +where_condition (also added in 2.0.2-beta) has the same syntax +as in the SELECT statement (see Section 7.1, “SELECT syntax” for details).

                        When assigning the out-of-range values to 32-bit attributes, they will be trimmed to their lower 32 bits without a prompt. For example, @@ -4282,7 +4286,7 @@ 4294967297 (0x100000001 in hex) amount to 1 (0x00000001 in hex).

                        MVA values sets for updating (and also for INSERT or REPLACE, refer -to Section 7.5, “INSERT and REPLACE syntax”) must be specificed as comma-separated +to Section 7.5, “INSERT and REPLACE syntax”) must be specificed as comma-separated lists in parentheses. To erase the MVA value, just assign () to it.

                         mysql> UPDATE myindex SET enabled=0 WHERE id=123;
                        @@ -4296,7 +4300,7 @@
                           WHERE MATCH('hehe') AND enabled=1;
                         Query OK, 148 rows affected (0.01 sec)
                         
                        -

                        7.19. ATTACH INDEX syntax

                        +

                        7.19. ATTACH INDEX syntax

                         ATTACH INDEX diskindex TO RTINDEX rtindex
                         

                        @@ -4322,9 +4326,9 @@ making ATTACH INDEX a one-time conversion operation only. Those restrictions may be lifted in future releases, as we add the needed functionality to the RT indexes. The complete list is as follows. -

                        • Target RT index needs to be empty.
                        • -
                        • Source disk index needs to have index_sp=0, boundary_step=0, stopword_step=1, dict=crc settings.
                        • -
                        • Source disk index needs to have an empty index_zones setting.
                        • +

                          • Target RT index needs to be empty.

                          • +
                          • Source disk index needs to have index_sp=0, boundary_step=0, stopword_step=1, dict=crc settings.

                          • +
                          • Source disk index needs to have an empty index_zones setting.

                          @@ -4381,7 +4385,7 @@
                           mysql> SELECT * FROM disk WHERE MATCH('test');
                           ERROR 1064 (42000): no enabled local indexes to search
                           
                        -

                        7.20. FLUSH RTINDEX syntax

                        +

                        7.20. FLUSH RTINDEX syntax

                         FLUSH RTINDEX rtindex
                         

                        @@ -4394,7 +4398,7 @@ write would need to be replayed. Those writes normally happen either on a clean shutdown, or periodically with a (big enough!) interval between writes specified in -rt_flush_period directive. +rt_flush_period directive. So such a backup made at an arbitrary point in time just might end up with way too much binary log data to replay.

                        @@ -4406,11 +4410,11 @@ mysql> FLUSH RTINDEX rt; Query OK, 0 rows affected (0.05 sec)

                        -

                        7.21. Multi-statement queries

                        +

                        7.21. Multi-statement queries

                        Starting version 2.0.1-beta, SphinxQL supports multi-statement queries, or batches. Possible inter-statement optimizations described -in Section 5.11, “Multi-queries” do apply to SphinxQL just as well. +in Section 5.11, “Multi-queries” do apply to SphinxQL just as well. The batched queries should be separated by a semicolon. Your MySQL client library needs to support MySQL multi-query mechanism and multiple result set. For instance, mysqli interface in PHP @@ -4468,7 +4472,7 @@ returned should match those that would be returned if the batched queries were sent one by one.

                        -

                        7.22. Comment syntax

                        +

                        7.22. Comment syntax

                        Since version 2.0.1-beta, SphinxQL supports C-style comment syntax. Everything from an opening /* sequence to a closing @@ -4482,7 +4486,7 @@ SELECT /*! SQL_CALC_FOUND_ROWS */ col1 FROM table1 WHERE ...

                        -

                        7.23. List of SphinxQL reserved keywords

                        +

                        7.23. List of SphinxQL reserved keywords

                        A complete alphabetical list of keywords that are currently reserved in SphinxQL syntax (and therefore can not be used as identifiers).

                        @@ -4538,7 +4542,7 @@
                         WHERE
                         WITHIN
                         
                        -

                        7.24. SphinxQL upgrade notes, version 2.0.1-beta

                        +

                        7.24. SphinxQL upgrade notes, version 2.0.1-beta

                        This section only applies to existing applications that use SphinxQL versions prior to 2.0.1-beta. @@ -4560,18 +4564,18 @@ SQL compliant (and will be further brought in as much compliance with standard SQL syntax as possible). That is not yet a breaking change, because searchd now supports -compat_sphinxql_magics +compat_sphinxql_magics directive that flips between the old "compatibility" mode and the new "compliance" mode. However, the compatibility mode support is going to be removed in future, so it's strongly advised to update SphinxQL applications and switch to the compliance mode.

                        The important changes are as follows: -

                        • +

                          • @ID magic name is deprecated in favor of ID. Document ID is considered an attribute. -

                          • -
                          • +

                          • +
                          • WEIGHT is no longer implicitly returned, because it is not actually a column (an index attribute), but rather an internal function computed per each row (a match). @@ -4582,7 +4586,7 @@ SELECT id, WEIGHT() w FROM myindex WHERE MATCH('test')

                          • -
                          • +

                          • You can now use quoted reserved keywords as aliases. The quote character is backtick ("`", ASCII code 96 decimal, 60 hex). One particularly useful example would be returning @@ -4591,15 +4595,15 @@ SELECT id, WEIGHT() `weight` FROM myindex WHERE MATCH('test')

                          • -
                          • +
                          • The column order is now different and should now match the one expliclitly defined in the query. So if you are accessing columns based on their position in the result set rather than the name (for instance, by using mysql_fetch_row() rather than mysql_fetch_assoc() in PHP), check and fix the order of columns in your queries. -

                          • -
                          • +

                          • +
                          • SELECT * return the columns in index order, as it used to, including the ID column. However, SELECT * does not automatically return WEIGHT(). @@ -4614,7 +4618,7 @@ SELECT id, *, WEIGHT() `weight` FROM myindex WHERE MATCH('test')

                          • -
                          • +

                          • Magic @count and @distinct attributes are no longer implicitly returned. You now have to explicitly ask for them when using GROUP BY. @@ -4628,7 +4632,7 @@

                        -

                        Chapter 8. API reference

                        +

                        Chapter 8. API reference

                        Table of Contents

                        8.1. General API functions
                        8.1.1. GetLastError
                        8.1.2. GetLastWarning
                        @@ -4691,26 +4695,26 @@ apply to them as well. There might be minor differences as to the method naming conventions or specific data structures used. But the provided functionality must not differ across languages. -

                        8.1. General API functions

                        -

                        8.1.1. GetLastError

                        +

                        8.1. General API functions

                        +

                        8.1.1. GetLastError

                        Prototype: function GetLastError()

                        Returns last error message, as a string, in human readable format. If there were no errors during the previous API call, empty string is returned.

                        -You should call it when any other function (such as Query()) +You should call it when any other function (such as Query()) fails (typically, the failing function returns false). The returned string will contain the error description.

                        The error message is not reset by this call; so you can safely call it several times if needed.

                        -

                        8.1.2. GetLastWarning

                        +

                        8.1.2. GetLastWarning

                        Prototype: function GetLastWarning ()

                        Returns last warning message, as a string, in human readable format. If there were no warnings during the previous API call, empty string is returned.

                        You should call it to verify whether your request -(such as Query()) was completed but with warnings. +(such as Query()) was completed but with warnings. For instance, search query against a distributed index might complete succesfully even if several remote agents timed out. In that case, a warning message would be produced. @@ -4718,13 +4722,13 @@ The warning message is not reset by this call; so you can safely call it several times if needed.

                        -

                        8.1.3. SetServer

                        +

                        8.1.3. SetServer

                        Prototype: function SetServer ( $host, $port )

                        Sets searchd host name and TCP port. All subsequent requests will use the new host and port settings. Default host and port are 'localhost' and 9312, respectively.

                        -

                        8.1.4. SetRetries

                        +

                        8.1.4. SetRetries

                        Prototype: function SetRetries ( $count, $delay=0 )

                        Sets distributed retry count and delay.

                        @@ -4736,7 +4740,7 @@ Currently, the list of temporary failures includes all kinds of connect() failures and maxed out (too busy) remote agents.

                        -

                        8.1.5. SetConnectTimeout

                        +

                        8.1.5. SetConnectTimeout

                        Prototype: function SetConnectTimeout ( $timeout )

                        Sets the time allowed to spend connecting to the server before giving up.

                        Under some circumstances, the server can be delayed in responding, either @@ -4749,7 +4753,7 @@ be returned back to the application in order for application-level error handling to advise the user.

                        -

                        8.1.6. SetArrayResult

                        +

                        8.1.6. SetArrayResult

                        Prototype: function SetArrayResult ( $arrayresult )

                        PHP specific. Controls matches format in the search results set (whether matches should be returned as an array or a hash). @@ -4766,15 +4770,15 @@ Thus they need to be returned as plain arrays, because hashes will only keep one entry per document ID.

                        -

                        8.1.7. IsConnectError

                        +

                        8.1.7. IsConnectError

                        Prototype: function IsConnectError ()

                        Checks whether the last error was a network error on API side, or a remote error reported by searchd. Returns true if the last connection attempt to searchd failed on API side, false otherwise (if the error was remote, or there were no connection attempts at all). Introduced in version 0.9.9-rc1.

                        -

                        8.2. General query settings

                        -

                        8.2.1. SetLimits

                        +

                        8.2. General query settings

                        +

                        8.2.1. SetLimits

                        Prototype: function SetLimits ( $offset, $limit, $max_matches=0, $cutoff=0 )

                        Sets offset into server-side result set ($offset) and amount of matches to return to client starting from that offset ($limit). Can additionally @@ -4810,17 +4814,17 @@ It tells searchd to forcibly stop search query once $cutoff matches had been found and processed.

                        -

                        8.2.2. SetMaxQueryTime

                        +

                        8.2.2. SetMaxQueryTime

                        Prototype: function SetMaxQueryTime ( $max_query_time )

                        Sets maximum search query time, in milliseconds. Parameter must be a non-negative integer. Default valus is 0 which means "do not limit". -

                        Similar to $cutoff setting from SetLimits(), +

                        Similar to $cutoff setting from SetLimits(), but limits elapsed query time instead of processed matches count. Local search queries will be stopped once that much time has elapsed. Note that if you're performing a search which queries several local indexes, this limit applies to each index separately.

                        -

                        8.2.3. SetOverride

                        +

                        8.2.3. SetOverride

                        Prototype: function SetOverride ( $attrname, $attrtype, $values )

                        Sets temporary (per-query) per-document attribute value overrides. Only supports scalar attributes. $values must be a hash that maps document @@ -4837,9 +4841,9 @@ then temporary override it with 1 for documents 123, 456 and 789 (recommended by exactly the friends of current user), and use that value when ranking.

                        -

                        8.2.4. SetSelect

                        +

                        8.2.4. SetSelect

                        Prototype: function SetSelect ( $clause )

                        -Sets the select clause, listing specific attributes to fetch, and expressions +Sets the select clause, listing specific attributes to fetch, and expressions to compute and fetch. Clause syntax mimics SQL. Introduced in version 0.9.9-rc1.

                        SetSelect() is very similar to the part of a typical SQL query between SELECT and FROM. It lets you choose what attributes (columns) to fetch, and also what expressions @@ -4857,8 +4861,8 @@ Starting with version 0.9.9-rc2, aggregate functions (AVG(), MIN(), MAX(), SUM()) are supported when using GROUP BY.

                        -Expression sorting (Section 5.6, “SPH_SORT_EXPR mode”) and geodistance functions -(Section 8.4.5, “SetGeoAnchor”) are now internally implemented using +Expression sorting (Section 5.6, “SPH_SORT_EXPR mode”) and geodistance functions +(Section 8.4.5, “SetGeoAnchor”) are now internally implemented using this computed expressions mechanism, using magic names '@expr' and '@geodist' respectively.

                        Example:

                        @@ -4867,10 +4871,10 @@
                            IF(age>40,1,0) AS over40" );
                         $cl->SetSelect ( "*, AVG(price) AS avgprice" );
                         
                        -

                        8.3. Full-text search query settings

                        -

                        8.3.1. SetMatchMode

                        +

                        8.3. Full-text search query settings

                        +

                        8.3.1. SetMatchMode

                        Prototype: function SetMatchMode ( $mode )

                        -Sets full-text query matching mode, as described in Section 5.1, “Matching modes”. +Sets full-text query matching mode, as described in Section 5.1, “Matching modes”. Parameter must be a constant specifying one of the known modes.

                        WARNING: (PHP specific) you must not take the matching mode @@ -4880,8 +4884,8 @@ $cl->SetMatchMode ( SPH_MATCH_ANY ); // correct, works OK

                        -

                        8.3.2. SetRankingMode

                        -

                        Prototype: function SetRankingMode ( $ranker )

                        +

                        8.3.2. SetRankingMode

                        +

                        Prototype: function SetRankingMode ( $ranker, $rankexpr="" )

                        Sets ranking mode (aka ranker). Only available in SPH_MATCH_EXTENDED matching mode. Parameter must be a constant specifying one of the known rankers. @@ -4898,11 +4902,17 @@ or maybe avoid computing it at all for performance reasons because you're sorting the result set by something else anyway. This can be accomplished by setting the appropriate ranking mode. The list of -the modes is available in Section 5.4, “Search results ranking”. +the modes is available in Section 5.4, “Search results ranking”. +

                        +$rankexpr argument was added in version 2.0.2-beta. +It lets you specify a ranking formula to use with the +expression based ranker, +that is, when $ranker is set to SPH_RANK_EXPR. +In all other cases, $rankexpr is ignored.

                        -

                        8.3.3. SetSortMode

                        +

                        8.3.3. SetSortMode

                        Prototype: function SetSortMode ( $mode, $sortby="" )

                        -Set matches sorting mode, as described in Section 5.6, “Sorting modes”. +Set matches sorting mode, as described in Section 5.6, “Sorting modes”. Parameter must be a constant specifying one of the known modes.

                        WARNING: (PHP specific) you must not take the matching mode @@ -4912,18 +4922,18 @@ $cl->SetSortMode ( SPH_SORT_ATTR_ASC ); // correct, works OK

                        -

                        8.3.4. SetWeights

                        +

                        8.3.4. SetWeights

                        Prototype: function SetWeights ( $weights )

                        Binds per-field weights in the order of appearance in the index. -DEPRECATED, use SetFieldWeights() instead. +DEPRECATED, use SetFieldWeights() instead.

                        -

                        8.3.5. SetFieldWeights

                        +

                        8.3.5. SetFieldWeights

                        Prototype: function SetFieldWeights ( $weights )

                        Binds per-field weights by name. Parameter must be a hash (associative array) mapping string field names to integer weights.

                        Match ranking can be affected by per-field weights. For instance, -see Section 5.4, “Search results ranking” for an explanation how phrase proximity +see Section 5.4, “Search results ranking” for an explanation how phrase proximity ranking is affected. This call lets you specify what non-default weights to assign to different full-text fields.

                        @@ -4936,12 +4946,12 @@ hitting 32-bit wraparound issues. For instance, if you set a weight of 10,000,000 and search in extended mode, then maximum possible weight will be equal to 10 million (your weight) -by 1 thousand (internal BM25 scaling factor, see Section 5.4, “Search results ranking”) +by 1 thousand (internal BM25 scaling factor, see Section 5.4, “Search results ranking”) by 1 or more (phrase proximity rank). The result is at least 10 billion that does not fit in 32 bits and will be wrapped around, producing unexpected results.

                        -

                        8.3.6. SetIndexWeights

                        +

                        8.3.6. SetIndexWeights

                        Prototype: function SetIndexWeights ( $weights )

                        Sets per-index weights, and enables weighted summing of match weights across different indexes. Parameter must be a hash (associative array) @@ -4963,8 +4973,8 @@ and you called SetIndexWeights ( array ( "A"=>100, "B"=>10 ) ), the final weight return to the client will be 2*100+3*10 = 230.

                        -

                        8.4. Result set filtering settings

                        -

                        8.4.1. SetIDRange

                        +

                        8.4. Result set filtering settings

                        +

                        8.4.1. SetIDRange

                        Prototype: function SetIDRange ( $min, $max )

                        Sets an accepted range of document IDs. Parameters must be integers. Defaults are 0 and 0; that combination means to not limit by range. @@ -4974,7 +4984,7 @@ exactly equal to $min or $max) will be matched.

                        -

                        8.4.2. SetFilter

                        +

                        8.4.2. SetFilter

                        Prototype: function SetFilter ( $attribute, $values, $exclude=false )

                        Adds new integer values set filter.

                        @@ -4989,7 +4999,7 @@ stored in the index matches any of the values from $values array will be matched (or rejected, if $exclude is true).

                        -

                        8.4.3. SetFilterRange

                        +

                        8.4.3. SetFilterRange

                        Prototype: function SetFilterRange ( $attribute, $min, $max, $exclude=false )

                        Adds new integer range filter.

                        @@ -5006,7 +5016,7 @@ (including values that are exactly equal to $min or $max) will be matched (or rejected, if $exclude is true).

                        -

                        8.4.4. SetFilterFloatRange

                        +

                        8.4.4. SetFilterFloatRange

                        Prototype: function SetFilterFloatRange ( $attribute, $min, $max, $exclude=false )

                        Adds new float range filter.

                        @@ -5023,7 +5033,7 @@ (including values that are exactly equal to $min or $max) will be matched (or rejected, if $exclude is true).

                        -

                        8.4.5. SetGeoAnchor

                        +

                        8.4.5. SetGeoAnchor

                        Prototype: function SetGeoAnchor ( $attrlat, $attrlong, $lat, $long )

                        Sets anchor point for and geosphere distance (geodistance) calculations, and enable them.

                        @@ -5039,16 +5049,16 @@ attribute data are expected to be in radians. The result will be returned in meters, so geodistance value of 1000.0 means 1 km. 1 mile is approximately 1609.344 meters.

                        -

                        8.5. GROUP BY settings

                        -

                        8.5.1. SetGroupBy

                        +

                        8.5. GROUP BY settings

                        +

                        8.5.1. SetGroupBy

                        Prototype: function SetGroupBy ( $attribute, $func, $groupsort="@group desc" )

                        Sets grouping attribute, function, and groups sorting mode; and enables grouping -(as described in Section 5.7, “Grouping (clustering) search results ”). +(as described in Section 5.7, “Grouping (clustering) search results ”).

                        $attribute is a string that contains group-by attribute name. $func is a constant that chooses a function applied to the attribute value in order to compute group-by key. $groupsort is a clause that controls how the groups will be sorted. Its syntax is similar -to that described in Section 5.6, “SPH_SORT_EXTENDED mode”. +to that described in Section 5.6, “SPH_SORT_EXTENDED mode”.

                        Grouping feature is very similar in nature to GROUP BY clause from SQL. Results produces by this function call are going to be the same as produced @@ -5057,20 +5067,20 @@ SELECT ... GROUP BY $func($attribute) ORDER BY $groupsort

                        Note that it's $groupsort that affects the order of matches -in the final result set. Sorting mode (see Section 8.3.3, “SetSortMode”) +in the final result set. Sorting mode (see Section 8.3.3, “SetSortMode”) affect the ordering of matches within group, ie. what match will be selected as the best one from the group. So you can for instance order the groups by matches count and select the most relevant match within each group at the same time.

                        Starting with version 0.9.9-rc2, aggregate functions (AVG(), MIN(), -MAX(), SUM()) are supported through SetSelect() API call +MAX(), SUM()) are supported through SetSelect() API call when using GROUP BY.

                        Starting with version 2.0.1-beta, grouping on string attributes is supported, with respect to current collation.

                        -

                        8.5.2. SetGroupDistinct

                        +

                        8.5.2. SetGroupDistinct

                        Prototype: function SetGroupDistinct ( $attribute )

                        Sets attribute name for per-group distinct values count calculations. Only available for grouping queries. @@ -5101,8 +5111,8 @@ matches will also contain total per-category matches count, and the count of distinct vendor IDs within each category.

                        -

                        8.6. Querying

                        -

                        8.6.1. Query

                        +

                        8.6. Querying

                        +

                        8.6.1. Query

                        Prototype: function Query ( $query, $index="*", $comment="" )

                        Connects to searchd server, runs given search query with current settings, obtains and returns the result set. @@ -5128,18 +5138,18 @@ Index specification order matters. If document with identical IDs are found in two or more indexes, weight and attribute values from the very last matching index will be used for sorting and returning to client (unless explicitly -overridden with SetIndexWeights()). Therefore, +overridden with SetIndexWeights()). Therefore, in the example above, matches from "delta" index will always win over matches from "main".

                        On success, Query() returns a result set that contains -some of the found matches (as requested by SetLimits()) +some of the found matches (as requested by SetLimits()) and additional general per-query statistics. The result set is a hash (PHP specific; other languages might utilize other structures instead of hash) with the following keys and values:

                        "matches":

                        Hash which maps found document IDs to another small hash containing document weight and attribute values - (or an array of the similar small hashes if SetArrayResult() was enabled). + (or an array of the similar small hashes if SetArrayResult() was enabled).

                        "total":

                        Total amount of matches retrieved on server (ie. to the server side result set) by this query. You can retrieve up to this amount of matches from server for this query text with current query settings. @@ -5156,14 +5166,14 @@ RunQueries(), then returning the first array element of matches (from the first, and only, query.)

                        -

                        8.6.2. AddQuery

                        +

                        8.6.2. AddQuery

                        Prototype: function AddQuery ( $query, $index="*", $comment="" )

                        Adds additional query with current settings to multi-query batch. $query is a query string. $index is an index name (or names) string. Additionally if provided, the contents of $comment are sent to the query log, marked in square brackets, just before the search terms, which can be very useful for debugging. Currently, this is limited to 128 characters. -Returns index to results array returned from RunQueries(). +Returns index to results array returned from RunQueries().

                        Batch queries (or multi-queries) enable searchd to perform internal optimizations if possible. They also reduce network connection overheads and search process @@ -5220,7 +5230,7 @@ second will return 1, and so on. Just a small helper so you won't have to track the indexes manualy if you need then.

                        -

                        8.6.3. RunQueries

                        +

                        8.6.3. RunQueries

                        Prototype: function RunQueries ()

                        Connect to searchd, runs a batch of all queries added using AddQuery(), obtains and returns the result sets. Returns false and sets GetLastError() @@ -5228,7 +5238,7 @@ of result sets on success.

                        Each result set in the returned array is exactly the same as -the result set returned from Query(). +the result set returned from Query().

                        Note that the batch query request itself almost always succeds - unless there's a network error, blocking index rotation in progress, @@ -5242,7 +5252,7 @@ succesfully connect to searchd, submit the batch, and receive the results - but every result set will have a specific error message.

                        -

                        8.6.4. ResetFilters

                        +

                        8.6.4. ResetFilters

                        Prototype: function ResetFilters ()

                        Clears all currently set filters.

                        @@ -5251,7 +5261,7 @@ you should call ResetFilters() and add new filters using the respective calls.

                        -

                        8.6.5. ResetGroupBy

                        +

                        8.6.5. ResetGroupBy

                        Prototype: function ResetGroupBy ()

                        Clears all currently group-by settings, and disables group-by.

                        @@ -5263,8 +5273,8 @@ in the current state, so that subsequent AddQuery() calls can perform non-grouping searches.

                        -

                        8.7. Additional functionality

                        -

                        8.7.1. BuildExcerpts

                        +

                        8.7. Additional functionality

                        +

                        8.7.1. BuildExcerpts

                        Prototype: function BuildExcerpts ( $docs, $index, $words, $opts=array() )

                        Excerpts (snippets) builder function. Connects to searchd, asks it to generate excerpts (snippets) from given documents, and returns the results. @@ -5276,7 +5286,7 @@ be processed with respect to index settings. For instance, if English stemming is enabled in the index, "shoes" will be highlighted even if keyword is "shoe". Starting with version 0.9.9-rc1, keywords can contain wildcards, that work similarly to -star-syntax available in queries. +star-syntax available in queries. $opts is a hash which contains additional optional highlighting parameters:

                        "before_match":

                        A string to insert before a keyword match. Starting with version 1.10-beta, @@ -5293,13 +5303,13 @@

                        Whether to extract single best passage only. Boolean, default is false.

                        "use_boundaries":

                        Whether to additionaly break passages by phrase boundary characters, as configured in index settings with - phrase_boundary + phrase_boundary directive. Boolean, default is false.

                        "weight_order":

                        Whether to sort the extracted passages in order of relevance (decreasing weight), or in order of appearance in the document (increasing position). Boolean, default is false.

                        "query_mode":

                        Added in version 1.10-beta. Whether to handle $words as a query in - extended syntax, or as a bag of words + extended syntax, or as a bag of words (default behavior). For instance, in query mode ("one two" | "three four") will only highlight and include those occurrences "one two" or "three four" when the two words from each pair are adjacent to each other. In default mode, @@ -5322,17 +5332,22 @@

                        Added in version 1.10-beta. Whether to handle $docs as data to extract snippets from (default behavior), or to treat it as file names, and load data from specified files on the server side. Starting with - version 2.0.1-beta, up to dist_threads + version 2.0.1-beta, up to dist_threads worker threads per request will be created to parallelize the work when this flag is enabled. Boolean, default is false. Starting with version 2.0.2-beta, - building of the snippets could be parallelized between remote agents. Just set the 'dist_threads' param in the config + building of the snippets could be parallelized between remote agents. Just set the 'dist_threads' param in the config to the value greater than 1, and then invoke the snippets - generation over the distributed index, which contain only one(!) first(!) local agent and several remotes. + generation over the distributed index, which contain only one(!) first(!) local agent and several remotes.

                        "load_files_scattered":
                        -

                        Added in version 2.0.2-beta. It assumes "load_files" option, and works only with distributed snippets generation +

                        Added in version 2.0.2-beta. It works only with distributed snippets generation with remote agents. The source files for snippets could be distributed among different agents, and the main daemon will merge together all non-erroneous results. So, if one agent of the distributed index has 'file1.txt', another has 'file2.txt' and you call for the snippets with both these files, the sphinx will merge results from the agents together, so you will get the snippets from both 'file1.txt' and 'file2.txt'. + Boolean, default is false. +

                        If the "load_files" is also set, the request will return the error in case if any of the files is not available anywhere. Otherwise (if "load_files" is not set) + it will just return the empty strings for all absent files. The master instance reset this flag when distributes the snippets among agents. So, for agents the absence of a file + is not critical error, but for the master it might be so. If you want to be sure that all snippets are actually created, set both "load_files_scattered" and "load_files". If the + absense of some snippets caused by some agents is not critical for you - set just "load_files_scattered", leaving "load_files" not set.

                        "html_strip_mode":

                        Added in version 1.10-beta. HTML stripping mode setting. Defaults to "index", which means that index settings will be used. @@ -5371,7 +5386,7 @@

                        Returns false on failure. Returns a plain array of strings with excerpts (snippets) on success.

                        -

                        8.7.2. UpdateAttributes

                        +

                        8.7.2. UpdateAttributes

                        Prototype: function UpdateAttributes ( $index, $attrs, $values )

                        Instantly updates given attribute values in given documents. Returns number of actually updated documents (0 or more) on success, or -1 on failure. @@ -5390,7 +5405,7 @@ They are very fast because they're working fully in RAM, but they can also be made persistent: updates are saved on disk on clean searchd shutdown initiated by SIGTERM signal. With additional restrictions, updates -are also possible on MVA attributes; refer to mva_updates_pool +are also possible on MVA attributes; refer to mva_updates_pool directive for details.

                        Usage example: @@ -5404,7 +5419,7 @@ the new price will be set to 123 and the new amount in stock to 5; for document 1002, the new price will be 37 and the new amount will be 11; etc.

                        -

                        8.7.3. BuildKeywords

                        +

                        8.7.3. BuildKeywords

                        Prototype: function BuildKeywords ( $query, $index, $hits )

                        Extracts keywords from query using tokenizer settings for given index, optionally with per-keyword occurrence statistics. Returns an array of hashes with per-keyword information. @@ -5417,7 +5432,7 @@

                         $keywords = $cl->BuildKeywords ( "this.is.my query", "test1", false );
                         
                        -

                        8.7.4. EscapeString

                        +

                        8.7.4. EscapeString

                        Prototype: function EscapeString ( $string )

                        Escapes characters that are treated as special operators by the query language parser. Returns an escaped string. @@ -5432,7 +5447,7 @@

                         $escaped = $cl->EscapeString ( "escaping-sample@query/string" );
                         
                        -

                        8.7.5. Status

                        +

                        8.7.5. Status

                        Prototype: function Status ()

                        Queries searchd status, and returns an array of status variable name and value pairs.

                        @@ -5442,14 +5457,14 @@ foreach ( $status as $row ) print join ( ": ", $row ) . "\n";

                        -

                        8.7.6. FlushAttributes

                        +

                        8.7.6. FlushAttributes

                        Prototype: function FlushAttributes ()

                        Forces searchd to flush pending attribute updates to disk, and blocks until completion. Returns a non-negative internal "flush tag" on success. Returns -1 and sets an error message on error. Introduced in version 1.10-beta.

                        -Attribute values updated using UpdateAttributes() +Attribute values updated using UpdateAttributes() API call are only kept in RAM until a so-called flush (which writes the current, possibly updated attribute values back to disk). FlushAttributes() call lets you enforce a flush. The call will block until searchd @@ -5471,19 +5486,19 @@ if ( $status<0 ) print "ERROR: " . $cl->GetLastError();

                        -

                        8.8. Persistent connections

                        +

                        8.8. Persistent connections

                        Persistent connections allow to use single network connection to run multiple commands that would otherwise require reconnects. -

                        8.8.1. Open

                        +

                        8.8.1. Open

                        Prototype: function Open ()

                        Opens persistent connection to the server.

                        -

                        8.8.2. Close

                        +

                        8.8.2. Close

                        Prototype: function Close ()

                        Closes previously opened persistent connection.

                        -

                        Chapter 9. MySQL storage engine (SphinxSE)

                        +

                        Chapter 9. MySQL storage engine (SphinxSE)

                        -

                        9.1. SphinxSE overview

                        +

                        9.1. SphinxSE overview

                        SphinxSE is MySQL storage engine which can be compiled into MySQL server 5.x using its pluggable architecure. @@ -5507,19 +5522,19 @@ searching happen outside MySQL.

                        Obvious SphinxSE applications include: -

                        • easier porting of MySQL FTS applications to Sphinx;
                        • -
                        • allowing Sphinx use with progamming languages for which native APIs are not available yet;
                        • -
                        • optimizations when additional Sphinx result set processing on MySQL side is required - (eg. JOINs with original document tables, additional MySQL-side filtering, etc).
                        • +

                          • easier porting of MySQL FTS applications to Sphinx;

                          • +
                          • allowing Sphinx use with progamming languages for which native APIs are not available yet;

                          • +
                          • optimizations when additional Sphinx result set processing on MySQL side is required + (eg. JOINs with original document tables, additional MySQL-side filtering, etc).

                        -

                        9.2. Installing SphinxSE

                        +

                        9.2. Installing SphinxSE

                        You will need to obtain a copy of MySQL sources, prepare those, and then recompile MySQL binary. MySQL sources (mysql-5.x.yy.tar.gz) could be obtained from -dev.mysql.com Web site. +dev.mysql.com Web site.

                        For some MySQL versions, there are delta tarballs with already prepared source versions available from Sphinx Web site. After unzipping @@ -5530,10 +5545,8 @@ reason, you would have to prepare sources manually. You will need to GNU Autotools framework (autoconf, automake and libtool) installed to do that. -

                        9.2.1. Compiling MySQL 5.0.x with SphinxSE

                        -

                        -Skips steps 1-3 if using already prepared delta tarball. -

                        1. copy sphinx.5.0.yy.diff patch file +

                          9.2.1. Compiling MySQL 5.0.x with SphinxSE

                          +
                          1. copy sphinx.5.0.yy.diff patch file into MySQL sources directory and run

                             patch -p1 < sphinx.5.0.yy.diff
                            @@ -5542,25 +5555,25 @@
                             to build, try applying .diff with closest version numbers. It is important
                             that the patch should apply with no rejects.
                             

                          2. -
                          3. in MySQL sources directory, run +

                          4. in MySQL sources directory, run

                             sh BUILD/autorun.sh
                             

                          5. -
                          6. in MySQL sources directory, create sql/sphinx +

                          7. in MySQL sources directory, create sql/sphinx directory in and copy all files in mysqlse directory from Sphinx sources there. Example:

                             cp -R /root/builds/sphinx-0.9.7/mysqlse /root/builds/mysql-5.0.24/sql/sphinx
                             

                          8. -
                          9. +

                          10. configure MySQL and enable Sphinx engine:

                             ./configure --with-sphinx-storage-engine
                             

                          11. -
                          12. +

                          13. build and install MySQL:

                             make
                            @@ -5568,28 +5581,26 @@
                             

                          -

                          9.2.2. Compiling MySQL 5.1.x with SphinxSE

                          -

                          -Skip steps 1-2 if using already prepared delta tarball. -

                          1. in MySQL sources directory, create storage/sphinx +

                            9.2.2. Compiling MySQL 5.1.x with SphinxSE

                            +
                            1. in MySQL sources directory, create storage/sphinx directory in and copy all files in mysqlse directory from Sphinx sources there. Example:

                               cp -R /root/builds/sphinx-0.9.7/mysqlse /root/builds/mysql-5.1.14/storage/sphinx
                               

                            2. -
                            3. in MySQL sources directory, run +

                            4. in MySQL sources directory, run

                               sh BUILD/autorun.sh
                               

                            5. -
                            6. +

                            7. configure MySQL and enable Sphinx engine:

                               ./configure --with-plugins=sphinx
                               

                            8. -
                            9. +

                            10. build and install MySQL:

                               make
                              @@ -5597,7 +5608,7 @@
                               

                            -

                            9.2.3. Checking SphinxSE installation

                            +

                            9.2.3. Checking SphinxSE installation

                            To check whether SphinxSE has been succesfully compiled into MySQL, launch newly built servers, run mysql client and @@ -5616,7 +5627,7 @@ +------------+----------+-------------------------------------------------------------+ 13 rows in set (0.00 sec)

                            -

                            9.3. Using SphinxSE

                            +

                            9.3. Using SphinxSE

                            To search via SphinxSE, you would need to create special ENGINE=SPHINX "search table", and then SELECT from it with full text query put into WHERE clause for query column. @@ -5675,10 +5686,10 @@ into WHERE clause on search query column (ie. 3rd column); the options are separated by semicolons; and their names from values by equality sign. Any number of options can be specified. Available options are: -

                            • query - query text;
                            • -
                            • mode - matching mode. Must be one of "all", "any", "phrase", - "boolean", or "extended". Default is "all";
                            • -
                            • sort - match sorting mode. Must be one of "relevance", "attr_desc", +

                              • query - query text;

                              • +
                              • mode - matching mode. Must be one of "all", "any", "phrase", + "boolean", or "extended". Default is "all";

                              • +
                              • sort - match sorting mode. Must be one of "relevance", "attr_desc", "attr_asc", "time_segments", or "extended". In all modes besides "relevance" attribute name (or sorting clause for "extended") is also required after a colon:

                                @@ -5686,21 +5697,21 @@
                                 ... WHERE query='test;sort=extended:@weight desc, group_id asc';
                                 

                              • -
                              • offset - offset into result set, default is 0;
                              • -
                              • limit - amount of matches to retrieve from result set, default is 20;
                              • -
                              • index - names of the indexes to search: +

                              • offset - offset into result set, default is 0;

                              • +
                              • limit - amount of matches to retrieve from result set, default is 20;

                              • +
                              • index - names of the indexes to search:

                                 ... WHERE query='test;index=test1;';
                                 ... WHERE query='test;index=test1,test2,test3;';
                                 

                              • -
                              • minid, maxid - min and max document ID to match;
                              • -
                              • weights - comma-separated list of weights to be assigned to Sphinx full-text fields: +

                              • minid, maxid - min and max document ID to match;

                              • +
                              • weights - comma-separated list of weights to be assigned to Sphinx full-text fields:

                                 ... WHERE query='test;weights=1,2,3;';
                                 

                              • -
                              • filter, !filter - comma-separated attribute name and a set of values to match: +

                              • filter, !filter - comma-separated attribute name and a set of values to match:

                                 # only include groups 1, 5 and 19
                                 ... WHERE query='test;filter=group_id,1,5,19;';
                                @@ -5709,7 +5720,7 @@
                                 ... WHERE query='test;!filter=group_id,3,11;';
                                 

                              • -
                              • range, !range - comma-separated attribute name, min and max value to match: +

                              • range, !range - comma-separated attribute name, min and max value to match:

                                 # include groups from 3 to 7, inclusive
                                 ... WHERE query='test;range=group_id,3,7;';
                                @@ -5718,77 +5729,80 @@
                                 ... WHERE query='test;!range=group_id,5,25;';
                                 

                              • -
                              • maxmatches - per-query max matches value, as in max_matches parameter to -SetLimits() API call: +

                              • maxmatches - per-query max matches value, as in max_matches parameter to +SetLimits() API call:

                                 ... WHERE query='test;maxmatches=2000;';
                                 

                              • -
                              • cutoff - maximum allowed matches, as in cutoff parameter to -SetLimits() API call: +

                              • cutoff - maximum allowed matches, as in cutoff parameter to +SetLimits() API call:

                                 ... WHERE query='test;cutoff=10000;';
                                 

                              • -
                              • maxquerytme - maximum allowed query time (in milliseconds), as in -SetMaxQueryTime() API call: +

                              • maxquerytme - maximum allowed query time (in milliseconds), as in +SetMaxQueryTime() API call:

                                 ... WHERE query='test;maxquerytime=1000;';
                                 

                              • -
                              • groupby - group-by function and attribute, corresponding to -SetGroupBy() API call: +

                              • groupby - group-by function and attribute, corresponding to +SetGroupBy() API call:

                                 ... WHERE query='test;groupby=day:published_ts;';
                                 ... WHERE query='test;groupby=attr:group_id;';
                                 

                              • -
                              • groupsort - group-by sorting clause: +

                              • groupsort - group-by sorting clause:

                                 ... WHERE query='test;groupsort=@count desc;';
                                 

                              • -
                              • distinct - an attribute to compute COUNT(DISTINCT) for when doing group-by, as in -SetGroupDistinct() API call: +

                              • distinct - an attribute to compute COUNT(DISTINCT) for when doing group-by, as in +SetGroupDistinct() API call:

                                 ... WHERE query='test;groupby=attr:country_id;distinct=site_id';
                                 

                              • -
                              • indexweights - comma-separated list of index names and weights +

                              • indexweights - comma-separated list of index names and weights to use when searching through several indexes:

                                 ... WHERE query='test;indexweights=idx_exact,2,idx_stemmed,1;';
                                 

                              • -
                              • comment - a string to mark this query in query log -(mapping to $comment parameter in Query() API call): +

                              • comment - a string to mark this query in query log +(mapping to $comment parameter in Query() API call):

                                 ... WHERE query='test;comment=marker001;';
                                 

                              • -
                              • select - a string with expressions to compute -(mapping to SetSelect() API call): +

                              • select - a string with expressions to compute +(mapping to SetSelect() API call):

                                 ... WHERE query='test;select=2*a+3*b as myexpr;';
                                 

                              • -
                              • host, port - remote searchd host name +

                              • host, port - remote searchd host name and TCP port, respectively:

                                 ... WHERE query='test;host=sphinx-test.loc;port=7312;';
                                 

                              • -
                              • ranker - a ranking function to use with "extended" matching mode, -as in SetRankingMode() API call +

                              • ranker - a ranking function to use with "extended" matching mode, +as in SetRankingMode() API call (the only mode that supports full query syntax). Known values are "proximity_bm25", "bm25", "none", "wordcount", "proximity", -"matchany", and "fieldmask". +"matchany", "fieldmask"; and, starting with 2.0.4-release, "expr:EXPRESSION" +syntax to support expression-based ranker (where EXPRESSION should be replaced +with your specific ranking formula):

                                 ... WHERE query='test;mode=extended;ranker=bm25;';
                                +... WHERE query='test;mode=extended;ranker=expr:sum(lcs);';
                                 

                              • -
                              • geoanchor - geodistance anchor, as in -SetGeoAnchor() API call. +

                              • geoanchor - geodistance anchor, as in +SetGeoAnchor() API call. Takes 4 parameters which are latitude and longiture attribute names, and anchor point coordinates respectively:

                                @@ -5859,11 +5873,11 @@
                                 2 rows in set (0.00 sec)
                                 

                              -

                              9.4. Building snippets (excerpts) via MySQL

                              +

                              9.4. Building snippets (excerpts) via MySQL

                              Starting with version 0.9.9-rc2, SphinxSE also includes a UDF function that lets you create snippets through MySQL. The functionality is fully -similar to BuildExcerprts +similar to BuildExcerprts API call but accesible through MySQL+SphinxSE.

                              The binary that provides the UDF is named sphinx.so @@ -5884,7 +5898,7 @@ Document and words arguments can be either strings or table columns. Options must be specified like this: 'value' AS option_name. For a list of supported options, refer to -BuildExcerprts() API call. +BuildExcerprts() API call. The only UDF-specific additional option is named 'sphinx' and lets you specify searchd location (host and port).

                              @@ -5900,7 +5914,7 @@ WHERE query='mysql php' AND sphinx.id=documents.id;

                              -

                              Chapter 10. Reporting bugs

                              +

                              Chapter 10. Reporting bugs

                              Unfortunately, Sphinx is not yet 100% bug free (even though I'm working hard towards that), so you might occasionally run into some issues. @@ -5909,10 +5923,10 @@ because to fix it, I need to be able either to reproduce and debug the bug, or to deduce what's causing it from the information that you provide. So here are some instructions on how to do that. -

                              Build-time issues

                              If Sphinx fails to build for some reason, please do the following:

                              1. check that headers and libraries for your DBMS are properly installed +

                                Build-time issues

                                If Sphinx fails to build for some reason, please do the following:

                                1. check that headers and libraries for your DBMS are properly installed (for instance, check that mysql-devel package is present); -

                                2. -
                                3. report Sphinx version and config file (be sure to remove the passwords!), +

                                4. +
                                5. report Sphinx version and config file (be sure to remove the passwords!), MySQL (or PostgreSQL) configuration info, gcc version, OS version and CPU type (ie. x86, x86-64, PowerPC, etc):

                                  @@ -5921,18 +5935,18 @@
                                   uname -a
                                   

                                6. -
                                7. +
                                8. report the error message which is produced by configure or gcc (it should be to include error message itself only, not the whole build log). -

                                9. +

                                Run-time issues

                                If Sphinx builds and runs, but there are any problems running it, please do the following: -

                                1. describe the bug (ie. both the expected behavior and actual behavior) -and all the steps necessary to reproduce it;
                                2. -
                                3. include Sphinx version and config file (be sure to remove the passwords!), +

                                  1. describe the bug (ie. both the expected behavior and actual behavior) +and all the steps necessary to reproduce it;

                                  2. +
                                  3. include Sphinx version and config file (be sure to remove the passwords!), MySQL (or PostgreSQL) version, gcc version, OS version and CPU type (ie. x86, x86-64, PowerPC, etc):

                                    @@ -5941,7 +5955,7 @@
                                     uname -a
                                     

                                  4. -
                                  5. build, install and run debug versions of all Sphinx programs (this is +

                                  6. build, install and run debug versions of all Sphinx programs (this is to enable a lot of additional internal checks, so-called assertions):

                                     make distclean
                                    @@ -5950,53 +5964,53 @@
                                     killall -TERM searchd
                                     

                                  7. -
                                  8. reindex to check if any assertions are triggered (in this case, +
                                  9. reindex to check if any assertions are triggered (in this case, it's likely that the index is corrupted and causing problems); -

                                  10. -
                                  11. if the bug does not reproduce with debug versions, +

                                  12. +
                                  13. if the bug does not reproduce with debug versions, revert to non-debug and mention it in your report; -

                                  14. -
                                  15. if the bug could be easily reproduced with a small (1-100 record) +

                                  16. +
                                  17. if the bug could be easily reproduced with a small (1-100 record) part of your database, please provide a gzipped dump of that part; -

                                  18. -
                                  19. if the problem is related to searchd, include +

                                  20. +
                                  21. if the problem is related to searchd, include relevant entries from searchd.log and query.log in your bug report; -

                                  22. -
                                  23. if the problem is related to searchd, try +

                                  24. +
                                  25. if the problem is related to searchd, try running it in console mode and check if it dies with an assertion:

                                     ./searchd --console
                                     

                                  26. -
                                  27. if any program dies with an assertion, provide the assertion message.
                                  28. +
                                  29. if any program dies with an assertion, provide the assertion message.

                                  Debugging assertions, crashes and hangups

                                  If any program dies with an assertion, crashes without an assertion or hangs up, you would additionally need to generate a core dump and examine it. -

                                  1. +

                                    1. enable core dumps. On most Linux systems, this is done using ulimit:

                                       ulimit -c 32768
                                       

                                    2. -
                                    3. +
                                    4. run the program and try to reproduce the bug; -

                                    5. -
                                    6. +

                                    7. +
                                    8. if the program crashes (either with or without an assertion), find the core file in current directory (it should typically print out "Segmentation fault (core dumped)" message); -

                                    9. -
                                    10. +

                                    11. +
                                    12. if the program hangs, use kill -SEGV from another console to force it to exit and dump core:

                                       kill -SEGV HANGED-PROCESS-ID
                                       

                                    13. -
                                    14. +

                                    15. use gdb to examine the core file and obtain a backtrace:

                                      @@ -6036,7 +6050,7 @@
                                       closely tied to your system) but I might need to ask
                                       you a few additional questions about it.
                                       

                                    -

                                    Chapter 11. sphinx.conf options reference

                                    +

                                    Chapter 11. sphinx.conf options reference

                                    -

                                    11.1. Data source configuration options

                                    -

                                    11.1.1. type

                                    +

                                    11.1. Data source configuration options

                                    +

                                    11.1.1. type

                                    Data source type. Mandatory, no default value. @@ -6214,11 +6229,11 @@ not be supported depending on your build settings, installed client libraries, etc. mssql type is currently only available on Windows. odbc type is available both on Windows natively and on -Linux through UnixODBC library. +Linux through UnixODBC library.

                                    Example:

                                     type = mysql
                                     
                                    -

                                    11.1.2. sql_host

                                    +

                                    11.1.2. sql_host

                                    SQL server host to connect to. Mandatory, no default value. @@ -6230,37 +6245,37 @@ socket based on the host name. Specifically "localhost" will force it to use UNIX socket (this is the default and generally recommended mode) and "127.0.0.1" will force TCP/IP usage. Refer to -MySQL manual +MySQL manual for more details.

                                    Example:

                                     sql_host = localhost
                                     
                                    -

                                    11.1.3. sql_port

                                    +

                                    11.1.3. sql_port

                                    SQL server IP port to connect to. Optional, default is 3306 for mysql source type and 5432 for pgsql type. Applies to SQL source types (mysql, pgsql, mssql) only. -Note that it depends on sql_host setting whether this value will actually be used. +Note that it depends on sql_host setting whether this value will actually be used.

                                    Example:

                                     sql_port = 3306
                                     
                                    -

                                    11.1.4. sql_user

                                    +

                                    11.1.4. sql_user

                                    -SQL user to use when connecting to sql_host. +SQL user to use when connecting to sql_host. Mandatory, no default value. Applies to SQL source types (mysql, pgsql, mssql) only.

                                    Example:

                                     sql_user = test
                                     
                                    -

                                    11.1.5. sql_pass

                                    +

                                    11.1.5. sql_pass

                                    -SQL user password to use when connecting to sql_host. +SQL user password to use when connecting to sql_host. Mandatory, no default value. Applies to SQL source types (mysql, pgsql, mssql) only.

                                    Example:

                                     sql_pass = mysecretpassword
                                     
                                    -

                                    11.1.6. sql_db

                                    +

                                    11.1.6. sql_db

                                    SQL database (in MySQL terms) to use after the connection and perform further queries within. Mandatory, no default value. @@ -6268,7 +6283,7 @@

                                    Example:

                                     sql_db = test
                                     
                                    -

                                    11.1.7. sql_sock

                                    +

                                    11.1.7. sql_sock

                                    UNIX socket name to connect to for local SQL servers. Optional, default value is empty (use client library default settings). @@ -6276,23 +6291,23 @@

                                    On Linux, it would typically be /var/lib/mysql/mysql.sock. On FreeBSD, it would typically be /tmp/mysql.sock. -Note that it depends on sql_host setting whether this value will actually be used. +Note that it depends on sql_host setting whether this value will actually be used.

                                    Example:

                                     sql_sock = /tmp/mysql.sock
                                     
                                    -

                                    11.1.8. mysql_connect_flags

                                    +

                                    11.1.8. mysql_connect_flags

                                    MySQL client connection flags. Optional, default value is 0 (do not set any flags). Applies to mysql source type only.

                                    This option must contain an integer value with the sum of the flags. -The value will be passed to mysql_real_connect() verbatim. +The value will be passed to mysql_real_connect() verbatim. The flags are enumerated in mysql_com.h include file. Flags that are especially interesting in regard to indexing, with their respective values, are as follows: -

                                    • CLIENT_COMPRESS = 32; can use compression protocol
                                    • -
                                    • CLIENT_SSL = 2048; switch to SSL after handshake
                                    • -
                                    • CLIENT_SECURE_CONNECTION = 32768; new 4.1 authentication
                                    • +

                                      • CLIENT_COMPRESS = 32; can use compression protocol

                                      • +
                                      • CLIENT_SSL = 2048; switch to SSL after handshake

                                      • +
                                      • CLIENT_SECURE_CONNECTION = 32768; new 4.1 authentication

                                      For instance, you can specify 2080 (2048+32) to use both compression and SSL, @@ -6306,7 +6321,7 @@

                                      Example:

                                       mysql_connect_flags = 32 # enable compression
                                       
                                    -

                                    11.1.9. mysql_ssl_cert, mysql_ssl_key, mysql_ssl_ca

                                    +

                                    11.1.9. mysql_ssl_cert, mysql_ssl_key, mysql_ssl_ca

                                    SSL certificate settings to use for connecting to MySQL server. Optional, default values are empty strings (do not use SSL). @@ -6321,7 +6336,7 @@ mysql_ssl_key = /etc/ssl/client-key.pem mysql_ssl_ca = /etc/ssl/cacert.pem

                                    -

                                    11.1.10. odbc_dsn

                                    +

                                    11.1.10. odbc_dsn

                                    ODBC DSN to connect to. Mandatory, no default value. @@ -6333,14 +6348,14 @@

                                    Example:

                                     odbc_dsn = Driver={Oracle ODBC Driver};Dbq=myDBName;Uid=myUsername;Pwd=myPassword
                                     
                                    -

                                    11.1.11. sql_query_pre

                                    +

                                    11.1.11. sql_query_pre

                                    Pre-fetch query, or pre-query. Multi-value, optional, default is empty list of queries. Applies to SQL source types (mysql, pgsql, mssql) only.

                                    Multi-value means that you can specify several pre-queries. -They are executed before the main fetch query, +They are executed before the main fetch query, and they will be exectued exactly in order of appeareance in the configuration file. Pre-query results are ignored.

                                    @@ -6350,8 +6365,8 @@

                                    Perhaps the most frequent pre-query usage is to specify the encoding that the server will use for the rows it returnes. It must match -the encoding that Sphinx expects (as specified by charset_type -and charset_table options). +the encoding that Sphinx expects (as specified by charset_type +and charset_table options). Two MySQL specific examples of setting the encoding are:

                                     sql_query_pre = SET CHARACTER_SET_RESULTS=cp1251
                                    @@ -6368,7 +6383,7 @@
                                     sql_query_pre = SET NAMES utf8
                                     sql_query_pre = SET SESSION query_cache_type=OFF
                                     
                                    -

                                    11.1.12. sql_query

                                    +

                                    11.1.12. sql_query

                                    Main document fetch query. Mandatory, no default value. @@ -6391,7 +6406,7 @@ title, content \ FROM documents

                                    -

                                    11.1.13. sql_joined_field

                                    +

                                    11.1.13. sql_joined_field

                                    Joined/payload field fetch query. Multi-value, optional, default is empty list of queries. @@ -6404,10 +6419,10 @@ QUERY [ ; RANGE-QUERY ]

                                    where -

                                    • FIELD-NAME is a joined/payload field name;
                                    • -
                                    • QUERY is an SQL query that must fetch values to index.
                                    • -
                                    • RANGE-QUERY is an optional SQL query that fetches a range -of values to index. (Added in version 2.0.1-beta.)
                                    • +

                                      • FIELD-NAME is a joined/payload field name;

                                      • +
                                      • QUERY is an SQL query that must fetch values to index.

                                      • +
                                      • RANGE-QUERY is an optional SQL query that fetches a range +of values to index. (Added in version 2.0.1-beta.)

                                      @@ -6441,7 +6456,7 @@ Starting with 2.0.1-beta, ranged queries can be used when a single query is not efficient enough or does not work because of the database driver limitations. It works similar to the ranged -queries in the main indexing loop, see Section 3.8, “Ranged queries”. +queries in the main indexing loop, see Section 3.8, “Ranged queries”. The range will be queried for and fetched upfront once, then multiple queries with different $start and $end substitutions will be run to fetch @@ -6469,13 +6484,13 @@ tagstext from query; \ SELECT docid, CONCAT('tag',tagid) FROM tags ORDER BY docid ASC

                                    -

                                    11.1.14. sql_query_range

                                    +

                                    11.1.14. sql_query_range

                                    Range query setup. Optional, default is empty. Applies to SQL source types (mysql, pgsql, mssql) only.

                                    -Setting this option enables ranged document fetch queries (see Section 3.8, “Ranged queries”). +Setting this option enables ranged document fetch queries (see Section 3.8, “Ranged queries”). Ranged queries are useful to avoid notorious MyISAM table locks when indexing lots of data. (They also help with other less notorious issues, such as reduced performance caused by big result sets, or additional resources consumed by InnoDB @@ -6485,39 +6500,39 @@ used as range boundaries. It must return exactly two integer fields, min ID first and max ID second; the field names are ignored.

                                    -When ranged queries are enabled, sql_query +When ranged queries are enabled, sql_query will be required to contain $start and $end macros (because it obviously would be a mistake to index the whole table many times over). Note that the intervals specified by $start..$end will not overlap, so you should not remove document IDs that are exactly equal to $start or $end from your query. -The example in Section 3.8, “Ranged queries”) illustrates that; note how it +The example in Section 3.8, “Ranged queries”) illustrates that; note how it uses greater-or-equal and less-or-equal comparisons.

                                    Example:

                                     sql_query_range = SELECT MIN(id),MAX(id) FROM documents
                                     
                                    -

                                    11.1.15. sql_range_step

                                    +

                                    11.1.15. sql_range_step

                                    Range query step. Optional, default is 1024. Applies to SQL source types (mysql, pgsql, mssql) only.

                                    -Only used when ranged queries are enabled. -The full document IDs interval fetched by sql_query_range +Only used when ranged queries are enabled. +The full document IDs interval fetched by sql_query_range will be walked in this big steps. For example, if min and max IDs fetched are 12 and 3456 respectively, and the step is 1000, indexer will call -sql_query several times with the +sql_query several times with the following substitutions: -

                                    • $start=12, $end=1011
                                    • -
                                    • $start=1012, $end=2011
                                    • -
                                    • $start=2012, $end=3011
                                    • -
                                    • $start=3012, $end=3456
                                    • +

                                      • $start=12, $end=1011

                                      • +
                                      • $start=1012, $end=2011

                                      • +
                                      • $start=2012, $end=3011

                                      • +
                                      • $start=3012, $end=3456

                                      Example:

                                       sql_range_step = 1000
                                       
                                    -

                                    11.1.16. sql_query_killlist

                                    +

                                    11.1.16. sql_query_killlist

                                    Kill-list query. Optional, default is empty (no query). @@ -6559,9 +6574,9 @@ SELECT id FROM documents WHERE updated_ts>=@last_reindex UNION \ SELECT id FROM documents_deleted WHERE deleted_ts>=@last_reindex

                                    -

                                    11.1.17. sql_attr_uint

                                    +

                                    11.1.17. sql_attr_uint

                                    -Unsigned integer attribute declaration. +Unsigned integer attribute declaration. Multi-value (there might be multiple attributes declared), optional. Applies to SQL source types (mysql, pgsql, mssql) only.

                                    @@ -6572,37 +6587,37 @@ You can specify bit count for integer attributes by appending ':BITCOUNT' to attribute name (see example below). Attributes with less than default 32-bit size, or bitfields, perform slower. -But they require less RAM when using extern storage: +But they require less RAM when using extern storage: such bitfields are packed together in 32-bit chunks in .spa attribute data file. Bit size settings are ignored if using -inline storage. +inline storage.

                                    Example:

                                     sql_attr_uint = group_id
                                     sql_attr_uint = forum_id:9 # 9 bits for forum_id
                                     
                                    -

                                    11.1.18. sql_attr_bool

                                    +

                                    11.1.18. sql_attr_bool

                                    -Boolean attribute declaration. +Boolean attribute declaration. Multi-value (there might be multiple attributes declared), optional. Applies to SQL source types (mysql, pgsql, mssql) only. -Equivalent to sql_attr_uint declaration with a bit count of 1. +Equivalent to sql_attr_uint declaration with a bit count of 1.

                                    Example:

                                     sql_attr_bool = is_deleted # will be packed to 1 bit
                                     
                                    -

                                    11.1.19. sql_attr_bigint

                                    +

                                    11.1.19. sql_attr_bigint

                                    -64-bit signed integer attribute declaration. +64-bit signed integer attribute declaration. Multi-value (there might be multiple attributes declared), optional. Applies to SQL source types (mysql, pgsql, mssql) only. -Note that unlike sql_attr_uint, +Note that unlike sql_attr_uint, these values are signed. Introduced in version 0.9.9-rc1.

                                    Example:

                                     sql_attr_bigint = my_bigint_id
                                     
                                    -

                                    11.1.20. sql_attr_timestamp

                                    +

                                    11.1.20. sql_attr_timestamp

                                    -UNIX timestamp attribute declaration. +UNIX timestamp attribute declaration. Multi-value (there might be multiple attributes declared), optional. Applies to SQL source types (mysql, pgsql, mssql) only.

                                    @@ -6624,11 +6639,12 @@ If you only needs to work with dates, not times, consider TO_DAYS() function in MySQL instead.

                                    Example:

                                    -sql_attr_timestamp = UNIX_TIMESTAMP(added_datetime) AS added_ts
                                    +# sql_query = ... UNIX_TIMESTAMP(added_datetime) AS added_ts ...
                                    +sql_attr_timestamp = added_ts
                                     
                                    -

                                    11.1.21. sql_attr_str2ordinal

                                    +

                                    11.1.21. sql_attr_str2ordinal

                                    -Ordinal string number attribute declaration. +Ordinal string number attribute declaration. Multi-value (there might be multiple attributes declared), optional. Applies to SQL source types (mysql, pgsql, mssql) only.

                                    @@ -6645,7 +6661,7 @@ Starting with revision r1112, ordinals accumulation and sorting also runs in fixed memory (at the cost of using additional temporary disk space), and honors -mem_limit settings. +mem_limit settings.

                                    Ideally the strings should be sorted differently, depending on the encoding and locale. For instance, if the strings are known @@ -6671,9 +6687,9 @@

                                    Example:

                                     sql_attr_str2ordinal = author_name
                                     
                                    -

                                    11.1.22. sql_attr_float

                                    +

                                    11.1.22. sql_attr_float

                                    -Floating point attribute declaration. +Floating point attribute declaration. Multi-value (there might be multiple attributes declared), optional. Applies to SQL source types (mysql, pgsql, mssql) only.

                                    @@ -6687,9 +6703,9 @@ sql_attr_float = lat_radians sql_attr_float = long_radians

                                    -

                                    11.1.23. sql_attr_multi

                                    +

                                    11.1.23. sql_attr_multi

                                    -Multi-valued attribute (MVA) declaration. +Multi-valued attribute (MVA) declaration. Multi-value (ie. there may be more than one such attribute declared), optional. Applies to SQL source types (mysql, pgsql, mssql) only.

                                    @@ -6706,10 +6722,10 @@ [;RANGE-QUERY]

                                    where -

                                    • ATTR-TYPE is 'uint', 'bigint' or 'timestamp'
                                    • -
                                    • SOURCE-TYPE is 'field', 'query', or 'ranged-query'
                                    • -
                                    • QUERY is SQL query used to fetch all ( docid, attrvalue ) pairs
                                    • -
                                    • RANGE-QUERY is SQL query used to fetch min and max ID values, similar to 'sql_query_range'
                                    • +

                                      • ATTR-TYPE is 'uint', 'bigint' or 'timestamp'

                                      • +
                                      • SOURCE-TYPE is 'field', 'query', or 'ranged-query'

                                      • +
                                      • QUERY is SQL query used to fetch all ( docid, attrvalue ) pairs

                                      • +
                                      • RANGE-QUERY is SQL query used to fetch min and max ID values, similar to 'sql_query_range'

                                      Example:

                                      @@ -6718,7 +6734,7 @@
                                       	SELECT id, tag FROM tags WHERE id>=$start AND id<=$end; \
                                       	SELECT MIN(id), MAX(id) FROM tags
                                       
                                    -

                                    11.1.24. sql_attr_string

                                    +

                                    11.1.24. sql_attr_string

                                    String attribute declaration. Multi-value (ie. there may be more than one such attribute declared), optional. @@ -6733,12 +6749,12 @@ They can not participate in expressions, be used for filtering, sorting, or grouping (ie. in WHERE, ORDER or GROUP clauses). Note that attributes declared using sql_attr_string will not be full-text -indexed; you can use sql_field_string +indexed; you can use sql_field_string directive for that.

                                    Example:

                                     sql_attr_string = title # will be stored but will not be indexed
                                     
                                    -

                                    11.1.25. sql_attr_str2wordcount

                                    +

                                    11.1.25. sql_attr_str2wordcount

                                    Word-count attribute declaration. Multi-value (ie. there may be more than one such attribute declared), optional. @@ -6753,7 +6769,7 @@

                                    Example:

                                     sql_attr_str2wordcount = title_wc
                                     
                                    -

                                    11.1.26. sql_column_buffers

                                    +

                                    11.1.26. sql_column_buffers

                                    Per-column buffer sizes. Optional, default is empty (deduce the sizes automatically). @@ -6784,33 +6800,33 @@ sql_query = SELECT id, mytitle, mycontent FROM documents sql_column_buffers = mytitle=64K, mycontent=10M

                                    -

                                    11.1.27. sql_field_string

                                    +

                                    11.1.27. sql_field_string

                                    Combined string attribute and full-text field declaration. Multi-value (ie. there may be more than one such attribute declared), optional. Applies to SQL source types (mysql, pgsql, mssql) only. Introduced in version 1.10-beta.

                                    -sql_attr_string only stores the column +sql_attr_string only stores the column value but does not full-text index it. In some cases it might be desired to both full-text index the column and store it as attribute. sql_field_string lets you do exactly that. Both the field and the attribute will be named the same.

                                    Example:

                                     sql_field_string = title # will be both indexed and stored
                                     
                                    -

                                    11.1.28. sql_field_str2wordcount

                                    +

                                    11.1.28. sql_field_str2wordcount

                                    Combined word-count attribute and full-text field declaration. Multi-value (ie. there may be more than one such attribute declared), optional. Applies to SQL source types (mysql, pgsql, mssql) only. Introduced in version 1.10-beta. -

                                    sql_attr_str2wordcount only stores the column +

                                    sql_attr_str2wordcount only stores the column word count but does not full-text index it. In some cases it might be desired to both full-text index the column and also have the count. sql_field_str2wordcount lets you do exactly that. Both the field and the attribute will be named the same.

                                    Example:

                                     sql_field_str2wordcount = title # will be indexed, and counted/stored
                                     
                                    -

                                    11.1.29. sql_file_field

                                    +

                                    11.1.29. sql_file_field

                                    File based field declaration. Applies to SQL source types (mysql, pgsql, mssql) only. @@ -6818,20 +6834,20 @@

                                    This directive makes indexer interpret field contents as a file name, and load and index the referred file. Files larger than -max_file_field_buffer +max_file_field_buffer in size are skipped. Any errors during the file loading (IO errors, missed limits, etc) will be reported as indexing warnings and will not early terminate the indexing. No content will be indexed for such files.

                                    Example:

                                     sql_file_field = my_file_path # load and index files referred to by my_file_path
                                     
                                    -

                                    11.1.30. sql_query_post

                                    +

                                    11.1.30. sql_query_post

                                    Post-fetch query. Optional, default value is empty. Applies to SQL source types (mysql, pgsql, mssql) only.

                                    -This query is executed immediately after sql_query +This query is executed immediately after sql_query completes successfully. When post-fetch query produces errors, they are reported as warnings, but indexing is not terminated. It's result set is ignored. Note that indexing is not yet completed @@ -6839,11 +6855,11 @@ Therefore, any permanent updates should not be done from here. For instance, updates on helper table that permanently change the last successfully indexed ID should not be run from post-fetch -query; they should be run from post-index query instead. +query; they should be run from post-index query instead.

                                    Example:

                                     sql_query_post = DROP TABLE my_tmp_table
                                     
                                    -

                                    11.1.31. sql_query_post_index

                                    +

                                    11.1.31. sql_query_post_index

                                    Post-index query. Optional, default value is empty. @@ -6860,7 +6876,7 @@ sql_query_post_index = REPLACE INTO counters ( id, val ) \ VALUES ( 'max_indexed_id', $maxid )

                                    -

                                    11.1.32. sql_ranged_throttle

                                    +

                                    11.1.32. sql_ranged_throttle

                                    Ranged query throttling period, in milliseconds. Optional, default is 0 (no throttling). @@ -6873,7 +6889,7 @@

                                    Example:

                                     sql_ranged_throttle = 1000 # sleep for 1 sec before each query step
                                     
                                    -

                                    11.1.33. sql_query_info

                                    +

                                    11.1.33. sql_query_info

                                    Document info query. Optional, default is empty. @@ -6887,32 +6903,32 @@

                                    Example:

                                     sql_query_info = SELECT * FROM documents WHERE id=$id
                                     
                                    -

                                    11.1.34. xmlpipe_command

                                    +

                                    11.1.34. xmlpipe_command

                                    Shell command that invokes xmlpipe stream producer. Mandatory. Applies to xmlpipe and xmlpipe2 source types only.

                                    Specifies a command that will be executed and which output -will be parsed for documents. Refer to Section 3.9, “xmlpipe data source” -or Section 3.10, “xmlpipe2 data source” for specific format description. +will be parsed for documents. Refer to Section 3.9, “xmlpipe data source” +or Section 3.10, “xmlpipe2 data source” for specific format description.

                                    Example:

                                     xmlpipe_command = cat /home/sphinx/test.xml
                                     
                                    -

                                    11.1.35. xmlpipe_field

                                    +

                                    11.1.35. xmlpipe_field

                                    xmlpipe field declaration. Multi-value, optional. -Applies to xmlpipe2 source type only. Refer to Section 3.10, “xmlpipe2 data source”. +Applies to xmlpipe2 source type only. Refer to Section 3.10, “xmlpipe2 data source”.

                                    Example:

                                     xmlpipe_field = subject
                                     xmlpipe_field = content
                                     
                                    -

                                    11.1.36. xmlpipe_field_string

                                    +

                                    11.1.36. xmlpipe_field_string

                                    xmlpipe field and string attribute declaration. Multi-value, optional. -Applies to xmlpipe2 source type only. Refer to Section 3.10, “xmlpipe2 data source”. +Applies to xmlpipe2 source type only. Refer to Section 3.10, “xmlpipe2 data source”. Introduced in version 1.10-beta.

                                    Makes the specified XML element indexed as both a full-text field and a string attribute. @@ -6920,11 +6936,11 @@

                                    Example:

                                     xmlpipe_field_string = subject
                                     
                                    -

                                    11.1.37. xmlpipe_field_wordcount

                                    +

                                    11.1.37. xmlpipe_field_wordcount

                                    xmlpipe field and word count attribute declaration. Multi-value, optional. -Applies to xmlpipe2 source type only. Refer to Section 3.10, “xmlpipe2 data source”. +Applies to xmlpipe2 source type only. Refer to Section 3.10, “xmlpipe2 data source”. Introduced in version 1.10-beta.

                                    Makes the specified XML element indexed as both a full-text field and a word count attribute. @@ -6932,53 +6948,62 @@

                                    Example:

                                     xmlpipe_field_wordcount = subject
                                     
                                    -

                                    11.1.38. xmlpipe_attr_uint

                                    +

                                    11.1.38. xmlpipe_attr_uint

                                    xmlpipe integer attribute declaration. Multi-value, optional. Applies to xmlpipe2 source type only. -Syntax fully matches that of sql_attr_uint. +Syntax fully matches that of sql_attr_uint.

                                    Example:

                                    -xmlpipe_attr_uint = author
                                    +xmlpipe_attr_uint = author_id
                                     
                                    -

                                    11.1.39. xmlpipe_attr_bool

                                    +

                                    11.1.39. xmlpipe_attr_bigint

                                    +

                                    +xmlpipe signed 64-bit integer attribute declaration. +Multi-value, optional. +Applies to xmlpipe2 source type only. +Syntax fully matches that of sql_attr_bigint. +

                                    Example:

                                    +xmlpipe_attr_bigint = my_bigint_id
                                    +
                                    +

                                    11.1.40. xmlpipe_attr_bool

                                    xmlpipe boolean attribute declaration. Multi-value, optional. Applies to xmlpipe2 source type only. -Syntax fully matches that of sql_attr_bool. +Syntax fully matches that of sql_attr_bool.

                                    Example:

                                     xmlpipe_attr_bool = is_deleted # will be packed to 1 bit
                                     
                                    -

                                    11.1.40. xmlpipe_attr_timestamp

                                    +

                                    11.1.41. xmlpipe_attr_timestamp

                                    xmlpipe UNIX timestamp attribute declaration. Multi-value, optional. Applies to xmlpipe2 source type only. -Syntax fully matches that of sql_attr_timestamp. +Syntax fully matches that of sql_attr_timestamp.

                                    Example:

                                     xmlpipe_attr_timestamp = published
                                     
                                    -

                                    11.1.41. xmlpipe_attr_str2ordinal

                                    +

                                    11.1.42. xmlpipe_attr_str2ordinal

                                    xmlpipe string ordinal attribute declaration. Multi-value, optional. Applies to xmlpipe2 source type only. -Syntax fully matches that of sql_attr_str2ordinal. +Syntax fully matches that of sql_attr_str2ordinal.

                                    Example:

                                     xmlpipe_attr_str2ordinal = author_sort
                                     
                                    -

                                    11.1.42. xmlpipe_attr_float

                                    +

                                    11.1.43. xmlpipe_attr_float

                                    xmlpipe floating point attribute declaration. Multi-value, optional. Applies to xmlpipe2 source type only. -Syntax fully matches that of sql_attr_float. +Syntax fully matches that of sql_attr_float.

                                    Example:

                                     xmlpipe_attr_float = lat_radians
                                     xmlpipe_attr_float = long_radians
                                     
                                    -

                                    11.1.43. xmlpipe_attr_multi

                                    +

                                    11.1.44. xmlpipe_attr_multi

                                    xmlpipe MVA attribute declaration. Multi-value, optional. @@ -6987,12 +7012,12 @@ This setting declares an MVA attribute tag in xmlpipe2 stream. The contents of the specified tag will be parsed and a list of integers that will constitute the MVA will be extracted, similar to how -sql_attr_multi parses +sql_attr_multi parses SQL column contents when 'field' MVA source type is specified.

                                    Example:

                                     xmlpipe_attr_multi = taglist
                                     
                                    -

                                    11.1.44. xmlpipe_attr_multi_64

                                    +

                                    11.1.45. xmlpipe_attr_multi_64

                                    xmlpipe MVA attribute declaration. Declares the BIGINT (signed 64-bit integer) MVA attribute. Multi-value, optional. @@ -7001,12 +7026,12 @@ This setting declares an MVA attribute tag in xmlpipe2 stream. The contents of the specified tag will be parsed and a list of integers that will constitute the MVA will be extracted, similar to how -sql_attr_multi parses +sql_attr_multi parses SQL column contents when 'field' MVA source type is specified.

                                    Example:

                                     xmlpipe_attr_multi_64 = taglist
                                     
                                    -

                                    11.1.45. xmlpipe_attr_string

                                    +

                                    11.1.46. xmlpipe_attr_string

                                    xmlpipe string declaration. Multi-value, optional. @@ -7018,7 +7043,7 @@

                                    Example:

                                     xmlpipe_attr_string = subject
                                     
                                    -

                                    11.1.46. xmlpipe_fixup_utf8

                                    +

                                    11.1.47. xmlpipe_fixup_utf8

                                    Perform Sphinx-side UTF-8 validation and filtering to prevent XML parser from choking on non-UTF-8 documents. Optional, default is 0. @@ -7035,7 +7060,7 @@

                                    Example:

                                     xmlpipe_fixup_utf8 = 1
                                     
                                    -

                                    11.1.47. mssql_winauth

                                    +

                                    11.1.48. mssql_winauth

                                    MS SQL Windows authentication flag. Boolean, optional, default value is 0 (false). @@ -7049,7 +7074,7 @@

                                    Example:

                                     mssql_winauth = 1
                                     
                                    -

                                    11.1.48. mssql_unicode

                                    +

                                    11.1.49. mssql_unicode

                                    MS SQL encoding type flag. Boolean, optional, default value is 0 (false). @@ -7057,7 +7082,7 @@ Introduced in version 0.9.9-rc1.

                                    Whether to ask for Unicode or single-byte data when querying MS SQL Server. -This flag must be in sync with charset_type directive; +This flag must be in sync with charset_type directive; that is, to index Unicode data, you must set both charset_type in the index (to 'utf-8') and mssql_unicode in the source (to 1). For reference, MS SQL will actually return data in UCS-2 encoding instead of UTF-8, @@ -7065,7 +7090,7 @@

                                    Example:

                                     mssql_unicode = 1
                                     
                                    -

                                    11.1.49. unpack_zlib

                                    +

                                    11.1.50. unpack_zlib

                                    Columns to unpack using zlib (aka deflate, aka gunzip). Multi-value, optional, default value is empty list of columns. @@ -7080,7 +7105,7 @@ unpack_zlib = col1 unpack_zlib = col2

                                    -

                                    11.1.50. unpack_mysqlcompress

                                    +

                                    11.1.51. unpack_mysqlcompress

                                    Columns to unpack using MySQL UNCOMPRESS() algorithm. Multi-value, optional, default value is empty list of columns. @@ -7095,13 +7120,13 @@ unpack_mysqlcompress = body_compressed unpack_mysqlcompress = description_compressed

                                    -

                                    11.1.51. unpack_mysqlcompress_maxsize

                                    +

                                    11.1.52. unpack_mysqlcompress_maxsize

                                    Buffer size for UNCOMPRESS()ed data. Optional, default value is 16M. Introduced in version 0.9.9-rc1.

                                    -When using unpack_mysqlcompress, +When using unpack_mysqlcompress, due to implementation intrincacies it is not possible to deduce the required buffer size from the compressed data. So the buffer must be preallocated in advance, and unpacked data can not go over the buffer size. This option lets you control the buffer size, @@ -7110,8 +7135,8 @@

                                    Example:

                                     unpack_mysqlcompress_maxsize = 1M
                                     
                                    -

                                    11.2. Index configuration options

                                    -

                                    11.2.1. type

                                    +

                                    11.2. Index configuration options

                                    +

                                    11.2.1. type

                                    Index type. Known values are 'plain', 'distributed', and 'rt'. @@ -7121,11 +7146,11 @@ Versions 0.9.x supported two index types: plain local indexes that are stored and processed on the local machine; and distributed indexes, that involve not only local searching but querying remote searchd -instances over the network as well (see Section 5.8, “Distributed searching”). +instances over the network as well (see Section 5.8, “Distributed searching”). Version 1.10-beta also adds support for so-called real-time indexes (or RT indexes for short) that are also stored and processed locally, but additionally allow -for on-the-fly updates of the full-text index (see Chapter 4, Real-time indexes). +for on-the-fly updates of the full-text index (see Chapter 4, Real-time indexes). Note that attributes can be updated on-the-fly using either plain local indexes or RT ones.

                                    @@ -7134,7 +7159,7 @@

                                    Example:

                                     type = distributed
                                     
                                    -

                                    11.2.2. source

                                    +

                                    11.2.2. source

                                    Adds document source to local index. Multi-value, mandatory. @@ -7155,7 +7180,7 @@ to tell what source the matched document came from, you will need to store some additional information yourself. Two typical approaches include: -

                                    1. mangling document ID and encoding source ID in it: +

                                      1. mangling document ID and encoding source ID in it:

                                         source src1
                                         {
                                        @@ -7170,7 +7195,7 @@
                                         }
                                         

                                      2. -
                                      3. +

                                      4. storing source ID simply as an attribute:

                                         source src1
                                        @@ -7195,7 +7220,7 @@
                                         source = srcpart2
                                         source = srcpart3
                                         
                                      -

                                      11.2.3. path

                                      +

                                      11.2.3. path

                                      Index files path and file name (without extension). Mandatory. @@ -7209,20 +7234,20 @@ files is if indexer fails to remove them automatically.

                                      For reference, different index files store the following data: -

                                      • .spa stores document attributes (used in extern docinfo storage mode only);
                                      • -
                                      • .spd stores matching document ID lists for each word ID;
                                      • -
                                      • .sph stores index header information;
                                      • -
                                      • .spi stores word lists (word IDs and pointers to .spd file);
                                      • -
                                      • .spk stores kill-lists;
                                      • -
                                      • .spm stores MVA data;
                                      • -
                                      • .spp stores hit (aka posting, aka word occurence) lists for each word ID;
                                      • -
                                      • .sps stores string attribute data.
                                      • +

                                        • .spa stores document attributes (used in extern docinfo storage mode only);

                                        • +
                                        • .spd stores matching document ID lists for each word ID;

                                        • +
                                        • .sph stores index header information;

                                        • +
                                        • .spi stores word lists (word IDs and pointers to .spd file);

                                        • +
                                        • .spk stores kill-lists;

                                        • +
                                        • .spm stores MVA data;

                                        • +
                                        • .spp stores hit (aka posting, aka word occurence) lists for each word ID;

                                        • +
                                        • .sps stores string attribute data.

                                        Example:

                                         path = /var/data/test1
                                         
                                      -

                                      11.2.4. docinfo

                                      +

                                      11.2.4. docinfo

                                      Document attribute values (docinfo) storage mode. Optional, default is 'extern'. @@ -7241,12 +7266,12 @@ Basically, externally stored docinfo must be kept in RAM when querying. for performance reasons. So in some cases "inline" might be the only option. However, such cases are infrequent, and docinfo defaults to "extern". -Refer to Section 3.3, “Attributes” for in-depth discussion +Refer to Section 3.3, “Attributes” for in-depth discussion and RAM usage estimates.

                                      Example:

                                       docinfo = inline
                                       
                                      -

                                      11.2.5. mlock

                                      +

                                      11.2.5. mlock

                                      Memory locking for cached data. Optional, default is 0 (do not call mlock()). @@ -7269,7 +7294,7 @@

                                      Example:

                                       mlock = 1
                                       
                                      -

                                      11.2.6. morphology

                                      +

                                      11.2.6. morphology

                                      A list of morphology preprocessors to apply. Optional, default is empty (do not apply any preprocessor). @@ -7284,8 +7309,8 @@ (that supports UTF-8 and Windows-1251 encodings), Soundex, and Metaphone. The latter two replace the words with special phonetic codes that are equal is words are phonetically close. -Additional stemmers provided by Snowball -project libstemmer library +Additional stemmers provided by Snowball +project libstemmer library can be enabled at compile time using --with-libstemmer configure option. Built-in English and Russian stemmers should be faster than their libstemmer counterparts, but can produce slightly different results, @@ -7294,13 +7319,13 @@

                                      Built-in values that are available for use in morphology option are as follows: -

                                      • none - do not perform any morphology processing;
                                      • -
                                      • stem_en - apply Porter's English stemmer;
                                      • -
                                      • stem_ru - apply Porter's Russian stemmer;
                                      • -
                                      • stem_enru - apply Porter's English and Russian stemmers;
                                      • -
                                      • stem_cz - apply Czech stemmer;
                                      • -
                                      • soundex - replace keywords with their SOUNDEX code;
                                      • -
                                      • metaphone - replace keywords with their METAPHONE code.
                                      • +

                                        • none - do not perform any morphology processing;

                                        • +
                                        • stem_en - apply Porter's English stemmer;

                                        • +
                                        • stem_ru - apply Porter's Russian stemmer;

                                        • +
                                        • stem_enru - apply Porter's English and Russian stemmers;

                                        • +
                                        • stem_cz - apply Czech stemmer;

                                        • +
                                        • soundex - replace keywords with their SOUNDEX code;

                                        • +
                                        • metaphone - replace keywords with their METAPHONE code.

                                        Additional values provided by libstemmer are in 'libstemmer_XXX' format, @@ -7310,15 +7335,15 @@ Several stemmers can be specified (comma-separated). They will be applied to incoming words in the order they are listed, and the processing will stop once one of the stemmers actually modifies the word. -Also when wordforms feature is enabled +Also when wordforms feature is enabled the word will be looked up in word forms dictionary first, and if there is a matching entry in the dictionary, stemmers will not be applied at all. -Or in other words, wordforms can be +Or in other words, wordforms can be used to implement stemming exceptions.

                                        Example:

                                         morphology = stem_en, libstemmer_sv
                                         
                                      -

                                      11.2.7. dict

                                      +

                                      11.2.7. dict

                                      The keywords dictionary type. Known values are 'crc' and 'keywords'. @@ -7351,7 +7376,7 @@ forms.) Second, and more importantly, substring searches are not directly possible with control sums. Sphinx alleviated that by pre-indexing all the possible substrings as separate keywords -(see Section 11.2.18, “min_prefix_len”, Section 11.2.19, “min_infix_len” +(see Section 11.2.18, “min_prefix_len”, Section 11.2.19, “min_infix_len” directives). That actually has an added benefit of matching substrings in the quickest way possible. But at the same time pre-indexing all substrings grows the index size a lot (factors @@ -7379,7 +7404,7 @@ on how many actual keywords match the given substring (in other words, into how many keywords does the search term expand). The maximum number of keywords matched is restricted by the -expansion_limit +expansion_limit directive.

                                      Essentially, keywords and CRC dictionaries represent the two @@ -7391,7 +7416,7 @@

                                      Example:

                                       dict = keywords
                                       
                                      -

                                      11.2.8. index_sp

                                      +

                                      11.2.8. index_sp

                                      Whether to detect and index sentence and paragraph boundaries. Optional, default is 0 (do not detect and index). @@ -7402,18 +7427,18 @@ Sentence boundary detection is based on plain text analysis, so you only need to set index_sp = 1 to enable it. Paragraph detection is however based on HTML markup, and happens in the -HTML stripper. +HTML stripper. So to index paragraph locations you also need to enable the stripper by specifying html_strip = 1. Both types of boundaries are detected based on a few built-in rules enumerated just below.

                                      Sentence boundary detection rules are as follows. -

                                      • Question and excalamation signs (? and !) are always a sentence boundary.
                                      • -
                                      • Trailing dot (.) is a sentence boundary, except: -

                                        • When followed by a letter. That's considered a part of an abbreviation (as in "S.T.A.L.K.E.R" or "Goldman Sachs S.p.A.").
                                        • -
                                        • When followed by a comma. That's considered an abbreviation followed by a comma (as in "Telecom Italia S.p.A., founded in 1994").
                                        • -
                                        • When followed by a space and a small letter. That's considered an abbreviation within a sentence (as in "News Corp. announced in Februrary").
                                        • -
                                        • When preceded by a space and a capital letter, and followed by a space. That's considered a middle initial (as in "John D. Doe").
                                        • +

                                          • Question and excalamation signs (? and !) are always a sentence boundary.

                                          • +
                                          • Trailing dot (.) is a sentence boundary, except: +

                                            • When followed by a letter. That's considered a part of an abbreviation (as in "S.T.A.L.K.E.R" or "Goldman Sachs S.p.A.").

                                            • +
                                            • When followed by a comma. That's considered an abbreviation followed by a comma (as in "Telecom Italia S.p.A., founded in 1994").

                                            • +
                                            • When followed by a space and a small letter. That's considered an abbreviation within a sentence (as in "News Corp. announced in Februrary").

                                            • +
                                            • When preceded by a space and a capital letter, and followed by a space. That's considered a middle initial (as in "John D. Doe").

                                          • @@ -7429,7 +7454,7 @@

                                            Example:

                                             index_sp = 1
                                             
                                          -

                                          11.2.9. index_zones

                                          +

                                          11.2.9. index_zones

                                          A list of in-field HTML/XML zones to index. Optional, default is empty (do not index zones). @@ -7444,7 +7469,7 @@

                                          Zone indexing, enabled by index_zones directive, is an optional extension of the HTML stripper. So it will also -require that the stripper +require that the stripper is enabled (with html_strip = 1). The value of the index_zones should be a comma-separated list of those tag names and wildcards (ending with a star) that should @@ -7456,11 +7481,11 @@ such as H1) and spans (all the occurrences of those H1 tags) in a document. Once indexed, zones can then be used for matching with -the ZONE operator, see Section 5.3, “Extended query syntax”. +the ZONE operator, see Section 5.3, “Extended query syntax”.

                                          Example:

                                           index_zones = h*, th, title
                                           
                                          -

                                          11.2.10. min_stemming_len

                                          +

                                          11.2.10. min_stemming_len

                                          Minimum word length at which to enable stemming. Optional, default is 1 (stem everything). @@ -7474,11 +7499,11 @@ the given threshold will not be stemmed. Note that keywords that are exactly as long as specified will be stemmed. So in order to avoid stemming 3-character keywords, you should specify 4 for the value. -For more finely grained control, refer to wordforms feature. +For more finely grained control, refer to wordforms feature.

                                          Example:

                                           min_stemming_len = 4
                                           
                                          -

                                          11.2.11. stopwords

                                          +

                                          11.2.11. stopwords

                                          Stopword files list (space separated). Optional, default is empty. @@ -7489,10 +7514,10 @@

                                          You can specify several file names, separated by spaces. All the files will be loaded. Stopwords file format is simple plain text. The encoding -must match index encoding specified in charset_type. -File data will be tokenized with respect to charset_table +must match index encoding specified in charset_type. +File data will be tokenized with respect to charset_table settings, so you can use the same separators as in the indexed data. -The stemmers will also be +The stemmers will also be applied when parsing stopwords file.

                                          While stopwords are not indexed, they still do affect the keyword positions. @@ -7500,17 +7525,23 @@ "in office", and that document 2 contains "in the office". Searching for "in office" as for exact phrase will only return the first document, as expected, even though "the" in the second one is stopped. +

                                          +Stopwords files can either be created manually, or semi-automatically. +indexer provides a mode that creates a frequency dictionary +of the index, sorted by the keyword frequency, see --buildstops +and --buildfreqs switch in Section 6.1, “indexer command reference”. +Top keywords from that dictionary can usually be used as stopwords.

                                          Example:

                                           stopwords = /usr/local/sphinx/data/stopwords.txt
                                           stopwords = stopwords-ru.txt stopwords-en.txt
                                           
                                          -

                                          11.2.12. wordforms

                                          +

                                          11.2.12. wordforms

                                          Word forms dictionary. Optional, default is empty.

                                          Word forms are applied after tokenizing the incoming text -by charset_table rules. +by charset_table rules. They essentialy let you replace one word with another. Normally, that would be used to bring different word forms to a single normal form (eg. to normalize all the variants such as "walks", @@ -7532,9 +7563,9 @@

                                          Dictionary file should be in a simple plain text format. Each line should contain source and destination word forms, in exactly the same -encoding as specified in charset_type, +encoding as specified in charset_type, separated by "greater" sign. Rules from the -charset_table will be +charset_table will be applied when the file is loaded. So basically it's as case sensitive as your other full-text indexed data, ie. typically case insensitive. Here's the file contents sample: @@ -7568,22 +7599,21 @@

                                          Example:

                                           wordforms = /usr/local/sphinx/data/wordforms.txt
                                           
                                          -

                                          11.2.13. exceptions

                                          +

                                          11.2.13. exceptions

                                          Tokenizing exceptions file. Optional, default is empty.

                                          Exceptions allow to map one or more tokens (including tokens with characters that would normally be excluded) to a single keyword. -They are similar to wordforms +They are similar to wordforms in that they also perform mapping, but have a number of important differences.

                                          Short summary of the differences is as follows: -

                                          • exceptions are case sensitive, wordforms are not;
                                          • -
                                          • exceptions allow to detect sequences of tokens, wordforms work with single words only;
                                          • -
                                          • exceptions can use special characters that are not in charset_table, wordforms fully obey charset_table;
                                          • -
                                          • exceptions can underperform on huge dictionaries, wordforms handle millions of entries well.
                                          • +

                                            • exceptions are case sensitive, wordforms are not;

                                            • +
                                            • exceptions can use special characters that are not in charset_table, wordforms fully obey charset_table;

                                            • +
                                            • exceptions can underperform on huge dictionaries, wordforms handle millions of entries well.

                                            @@ -7605,7 +7635,7 @@ C plus plus => cplusplus

                                            All tokens here are case sensitive: they will not be processed by -charset_table rules. Thus, with +charset_table rules. Thus, with the example exceptions file above, "At&t" text will be tokenized as two keywords "at" and "t", because of lowercase letters. On the other hand, "AT&T" will match exactly and produce single "AT&T" keyword. @@ -7633,7 +7663,7 @@ thanks to the very first entry from the sample.

                                            Exceptions also allow to capture special characters (that are exceptions -from general charset_table rules; +from general charset_table rules; hence the name). Assume that you generally do not want to treat '+' as a valid character, but still want to be able search for some exceptions from this rule such as 'C++'. The sample above will do just that, totally @@ -7646,7 +7676,7 @@

                                            Example:

                                             exceptions = /usr/local/sphinx/data/exceptions.txt
                                             
                                          -

                                          11.2.14. min_word_len

                                          +

                                          11.2.14. min_word_len

                                          Minimum indexed word length. Optional, default is 1 (index everything). @@ -7656,7 +7686,7 @@

                                          Example:

                                           min_word_len = 4
                                           
                                          -

                                          11.2.15. charset_type

                                          +

                                          11.2.15. charset_type

                                          Character set encoding type. Optional, default is 'sbcs'. @@ -7673,16 +7703,16 @@ Note that while 'utf-8' implies that the decoded values must be treated as Unicode codepoint numbers, there's a family of 'sbcs' encodings that may in turn treat different byte values differently, and that should be -properly reflected in your charset_table settings. +properly reflected in your charset_table settings. For example, the same byte value of 224 (0xE0 hex) maps to different Russian letters depending on whether koi-8r or windows-1251 encoding is used.

                                          Example:

                                           charset_type = utf-8
                                           
                                          -

                                          11.2.16. charset_table

                                          +

                                          11.2.16. charset_table

                                          Accepted characters table, with case folding rules. -Optional, default value depends on charset_type value. +Optional, default value depends on charset_type value.

                                          charset_table is the main workhorse of Sphinx tokenizing process, ie. the process of extracting keywords from document text or query txet. @@ -7751,7 +7781,7 @@ charset_table = 0..9, A..Z->a..z, _, a..z, \ U+410..U+42F->U+430..U+44F, U+430..U+44F

                                          -

                                          11.2.17. ignore_chars

                                          +

                                          11.2.17. ignore_chars

                                          Ignored characters list. Optional, default is empty. @@ -7763,19 +7793,19 @@ On the contrary, if '-' is added to ignore_chars list, the same text will be indexed as a single "abcdef" keyword.

                                          -The syntax is the same as for charset_table, +The syntax is the same as for charset_table, but it's only allowed to declare characters, and not allowed to map them. Also, the ignored characters must not be present in charset_table.

                                          Example:

                                           ignore_chars = U+AD
                                           
                                          -

                                          11.2.18. min_prefix_len

                                          +

                                          11.2.18. min_prefix_len

                                          Minimum word prefix length to index. Optional, default is 0 (do not index prefixes).

                                          Prefix indexing allows to implement wildcard searching by 'wordstart*' wildcards -(refer to enable_star option for details on wildcard syntax). +(refer to enable_star option for details on wildcard syntax). When mininum prefix length is set to a positive number, indexer will index all the possible keyword prefixes (ie. word beginnings) in addition to the keywords themselves. Too short prefixes (below the minimum allowed length) will not @@ -7792,7 +7822,7 @@ There's no automatic way to rank perfect word matches higher in a prefix index, but there's a number of tricks to achieve that. First, you can setup two indexes, one with prefix indexing and one -without it, search through both, and use SetIndexWeights() +without it, search through both, and use SetIndexWeights() call to combine weights. Second, you can enable star-syntax and rewrite your extended-mode queries:

                                          @@ -7805,13 +7835,13 @@
                                           

                                          Example:

                                           min_prefix_len = 3
                                           
                                          -

                                          11.2.19. min_infix_len

                                          +

                                          11.2.19. min_infix_len

                                          Minimum infix prefix length to index. Optional, default is 0 (do not index infixes).

                                          Infix indexing allows to implement wildcard searching by 'start*', '*end', and '*middle*' wildcards -(refer to enable_star option for details on wildcard syntax). +(refer to enable_star option for details on wildcard syntax). When mininum infix length is set to a positive number, indexer will index all the possible keyword infixes (ie. substrings) in addition to the keywords themselves. Too short infixes (below the minimum allowed length) will not be indexed. For instance, @@ -7823,12 +7853,12 @@ many more indexed keywords), and will degrade both indexing and searching times.

                                          There's no automatic way to rank perfect word matches higher -in an infix index, but the same tricks as with prefix indexes +in an infix index, but the same tricks as with prefix indexes can be applied.

                                          Example:

                                           min_infix_len = 3
                                           
                                          -

                                          11.2.20. prefix_fields

                                          +

                                          11.2.20. prefix_fields

                                          The list of full-text fields to limit prefix indexing to. Optional, default is empty (index all fields in prefix mode). @@ -7842,17 +7872,17 @@

                                          Example:

                                           prefix_fields = url, domain
                                           
                                          -

                                          11.2.21. infix_fields

                                          +

                                          11.2.21. infix_fields

                                          The list of full-text fields to limit infix indexing to. Optional, default is empty (index all fields in infix mode).

                                          -Similar to prefix_fields, +Similar to prefix_fields, but lets you limit infix-indexing to given fields.

                                          Example:

                                           infix_fields = url, domain
                                           
                                          -

                                          11.2.22. enable_star

                                          +

                                          11.2.22. enable_star

                                          Enables star-syntax (or wildcard syntax) when searching through prefix/infix indexes. Optional, default is is 0 (do not use wildcard syntax), for compatibility with 0.9.7. @@ -7865,29 +7895,29 @@

                                          The default value is 0, that means to disable star-syntax and treat all keywords as prefixes or infixes respectively, -depending on indexing-time min_prefix_len -and min_infix_len settings. +depending on indexing-time min_prefix_len +and min_infix_len settings. The value of 1 means that star ('*') can be used at the start and/or the end of the keyword. The star will match zero or more characters.

                                          For example, assume that the index was built with infixes and that enable_star is 1. Searching should work as follows: -

                                          1. "abcdef" query will match only those documents that contain the exact "abcdef" word in them.
                                          2. -
                                          3. "abc*" query will match those documents that contain +

                                            1. "abcdef" query will match only those documents that contain the exact "abcdef" word in them.

                                            2. +
                                            3. "abc*" query will match those documents that contain any words starting with "abc" (including the documents which -contain the exact "abc" word only);

                                            4. -
                                            5. "*cde*" query will match those documents that contain +contain the exact "abc" word only);

                                            6. +
                                            7. "*cde*" query will match those documents that contain any words which have "cde" characters in any part of the word -(including the documents which contain the exact "cde" word only).

                                            8. -
                                            9. "*def" query will match those documents that contain +(including the documents which contain the exact "cde" word only).

                                            10. +
                                            11. "*def" query will match those documents that contain any words ending with "def" (including the documents that -contain the exact "def" word only).

                                            12. +contain the exact "def" word only).

                                            Example:

                                             enable_star = 1
                                             
                                          -

                                          11.2.23. ngram_len

                                          +

                                          11.2.23. ngram_len

                                          N-gram lengths for N-gram indexing. Optional, default is 0 (disable n-gram indexing). @@ -7906,7 +7936,7 @@ some CJK characters) and length is 1, in will be indexed as if it was "A B C D E F". (With length equal to 2, it would produce "AB BC CD DE EF"; but only 1 is supported at the moment.) Only those characters that are -listed in ngram_chars table +listed in ngram_chars table will be split this way; other ones will not be affected.

                                          Note that if search query is segmented, ie. there are separators between @@ -7927,19 +7957,19 @@

                                          Example:

                                           ngram_len = 1
                                           
                                          -

                                          11.2.24. ngram_chars

                                          +

                                          11.2.24. ngram_chars

                                          N-gram characters list. Optional, default is empty.

                                          -To be used in conjunction with in ngram_len, +To be used in conjunction with in ngram_len, this list defines characters, sequences of which are subject to N-gram extraction. Words comprised of other characters will not be affected by N-gram indexing -feature. The value format is identical to charset_table. +feature. The value format is identical to charset_table.

                                          Example:

                                           ngram_chars = U+3000..U+2FA1F
                                           
                                          -

                                          11.2.25. phrase_boundary

                                          +

                                          11.2.25. phrase_boundary

                                          Phrase boundary characters list. Optional, default is empty. @@ -7947,12 +7977,12 @@ This list controls what characters will be treated as phrase boundaries, in order to adjust word positions and enable phrase-level search emulation through proximity search. The syntax is similar -to charset_table. +to charset_table. Mappings are not allowed and the boundary characters must not overlap with anything else.

                                          On phrase boundary, additional word position increment (specified by -phrase_boundary_step) +phrase_boundary_step) will be added to current word position. This enables phrase-level searching through proximity queries: words in different phrases will be guaranteed to be more than phrase_boundary_step distance @@ -7965,17 +7995,17 @@

                                          Example:

                                           phrase_boundary = ., ?, !, U+2026 # horizontal ellipsis
                                           
                                          -

                                          11.2.26. phrase_boundary_step

                                          +

                                          11.2.26. phrase_boundary_step

                                          Phrase boundary word position increment. Optional, default is 0.

                                          On phrase boundary, current word position will be additionally incremented -by this number. See phrase_boundary for details. +by this number. See phrase_boundary for details.

                                          Example:

                                           phrase_boundary_step = 100
                                           
                                          -

                                          11.2.27. html_strip

                                          +

                                          11.2.27. html_strip

                                          Whether to strip HTML markup from incoming full-text data. Optional, default is 0. @@ -8006,14 +8036,14 @@

                                          Only the tags themselves, and also HTML comments, are stripped. To strip the contents of the tags too (eg. to strip embedded scripts), -see html_remove_elements option. +see html_remove_elements option. There are no restrictions on tag names; ie. everything that looks like a valid tag start, or end, or a comment will be stripped.

                                          Example:

                                           html_strip = 1
                                           
                                          -

                                          11.2.28. html_index_attrs

                                          +

                                          11.2.28. html_index_attrs

                                          A list of markup attributes to index when stripping HTML. Optional, default is empty (do not index markup attributes). @@ -8024,7 +8054,7 @@

                                          Example:

                                           html_index_attrs = img=alt,title; a=title;
                                           
                                          -

                                          11.2.29. html_remove_elements

                                          +

                                          11.2.29. html_remove_elements

                                          A list of HTML elements for which to strip contents along with the elements themselves. Optional, default is empty string (do not strip contents of any elements). @@ -8040,25 +8070,33 @@

                                          Example:

                                           html_remove_elements = style, script
                                           
                                          -

                                          11.2.30. local

                                          +

                                          11.2.30. local

                                          -Local index declaration in the distributed index. +Local index declaration in the distributed index. Multi-value, optional, default is empty.

                                          This setting is used to declare local indexes that will be searched when -given distributed index is searched. All local indexes will be searched -sequentially, utilizing only 1 CPU or core; to parallelize processing, -you can configure searchd to query itself (refer to -Section 11.2.31, “agent” for the details). There might be several local -indexes declared per each distributed index. Any local index can be mentioned -several times in other distributed indexes. +given distributed index is searched. Many local indexes can be declared per +each distributed index. Any local index can also be mentioned several times +in different distributed indexes. +

                                          +Note that by default all local indexes will be searched sequentially, +utilizing only 1 CPU or core. To parallelize processing of the local parts +in the distributed index, you should use dist_threads directive, +see Section 11.4.29, “dist_threads”. +

                                          +Before dist_threads, there also was a legacy solution +to configure searchd to query itself instead of using +local indexes (refer to Section 11.2.31, “agent” for the details). However, +that creates redundant CPU and network load, and dist_threads +is now strongly suggested instead.

                                          Example:

                                           local = chunk1
                                           local = chunk2
                                           
                                          -

                                          11.2.31. agent

                                          +

                                          11.2.31. agent

                                          -Remote agent declaration in the distributed index. +Remote agent declaration in the distributed index. Multi-value, optional, default is empty.

                                          This setting is used to declare remote agents that will be searched @@ -8116,9 +8154,9 @@ agent = /var/run/searchd.s:chunk2 agent = searchbox2:9312:chunk3,chunk4 # search remote indexes

                                          -

                                          11.2.32. agent_blackhole

                                          +

                                          11.2.32. agent_blackhole

                                          -Remote blackhole agent declaration in the distributed index. +Remote blackhole agent declaration in the distributed index. Multi-value, optional, default is empty. Introduced in version 0.9.9-rc1.

                                          @@ -8131,11 +8169,11 @@ normally, but it will neither wait nor process any responses. Also, all network errors on blackhole agents will be ignored. The value format is completely identical to regular -agent directive. +agent directive.

                                          Example:

                                           agent_blackhole = testbox:9312:testindex1,testindex2
                                           
                                          -

                                          11.2.33. agent_connect_timeout

                                          +

                                          11.2.33. agent_connect_timeout

                                          Remote agent connection timeout, in milliseconds. Optional, default is 1000 (ie. 1 second). @@ -8143,12 +8181,12 @@ When connecting to remote agents, searchd will wait at most this much time for connect() call to complete succesfully. If the timeout is reached but connect() does not complete, -and retries are enabled, +and retries are enabled, retry will be initiated.

                                          Example:

                                           agent_connect_timeout = 300
                                           
                                          -

                                          11.2.34. agent_query_timeout

                                          +

                                          11.2.34. agent_query_timeout

                                          Remote agent query timeout, in milliseconds. Optional, default is 3000 (ie. 3 seconds). @@ -8162,7 +8200,7 @@

                                          Example:

                                           agent_query_timeout = 10000 # our query can be long, allow up to 10 sec
                                           
                                          -

                                          11.2.35. preopen

                                          +

                                          11.2.35. preopen

                                          Whether to pre-open all index files, or open them per each query. Optional, default is 0 (do not preopen). @@ -8182,7 +8220,7 @@

                                          Example:

                                           preopen = 1
                                           
                                          -

                                          11.2.36. ondisk_dict

                                          +

                                          11.2.36. ondisk_dict

                                          Whether to keep the dictionary file (.spi) for this index on disk, or precache it in RAM. Optional, default is 0 (precache in RAM). @@ -8199,7 +8237,7 @@

                                          Example:

                                           ondisk_dict = 1
                                           
                                          -

                                          11.2.37. inplace_enable

                                          +

                                          11.2.37. inplace_enable

                                          Whether to enable in-place index inversion. Optional, default is 0 (use separate temporary files). @@ -8230,9 +8268,9 @@

                                          Example:

                                           inplace_enable = 1
                                           
                                          -

                                          11.2.38. inplace_hit_gap

                                          +

                                          11.2.38. inplace_hit_gap

                                          -In-place inversion fine-tuning option. +In-place inversion fine-tuning option. Controls preallocated hitlist gap size. Optional, default is 0. Introduced in version 0.9.9-rc1. @@ -8242,9 +8280,9 @@

                                          Example:

                                           inplace_hit_gap = 1M
                                           
                                          -

                                          11.2.39. inplace_docinfo_gap

                                          +

                                          11.2.39. inplace_docinfo_gap

                                          -In-place inversion fine-tuning option. +In-place inversion fine-tuning option. Controls preallocated docinfo gap size. Optional, default is 0. Introduced in version 0.9.9-rc1. @@ -8254,9 +8292,9 @@

                                          Example:

                                           inplace_docinfo_gap = 1M
                                           
                                          -

                                          11.2.40. inplace_reloc_factor

                                          +

                                          11.2.40. inplace_reloc_factor

                                          -In-place inversion fine-tuning option. +In-place inversion fine-tuning option. Controls relocation buffer size within indexing memory arena. Optional, default is 0.1. Introduced in version 0.9.9-rc1. @@ -8266,9 +8304,9 @@

                                          Example:

                                           inplace_reloc_factor = 0.1
                                           
                                          -

                                          11.2.41. inplace_write_factor

                                          +

                                          11.2.41. inplace_write_factor

                                          -In-place inversion fine-tuning option. +In-place inversion fine-tuning option. Controls in-place write buffer size within indexing memory arena. Optional, default is 0.1. Introduced in version 0.9.9-rc1. @@ -8278,7 +8316,7 @@

                                          Example:

                                           inplace_write_factor = 0.1
                                           
                                          -

                                          11.2.42. index_exact_words

                                          +

                                          11.2.42. index_exact_words

                                          Whether to index the original keywords along with the stemmed/remapped versions. Optional, default is 0 (do not index). @@ -8286,15 +8324,15 @@

                                          When enabled, index_exact_words forces indexer to put the raw keywords in the index along with the stemmed versions. That, in turn, -enables exact form operator in the query language to work. +enables exact form operator in the query language to work. This impacts the index size and the indexing time. However, searching performance is not impacted at all.

                                          Example:

                                           index_exact_words = 1
                                           
                                          -

                                          11.2.43. overshort_step

                                          +

                                          11.2.43. overshort_step

                                          -Position increment on overshort (less that min_word_len) keywords. +Position increment on overshort (less that min_word_len) keywords. Optional, allowed values are 0 and 1, default is 1. Introduced in version 0.9.9-rc1.

                                          @@ -8303,9 +8341,9 @@

                                          Example:

                                           overshort_step = 1
                                           
                                          -

                                          11.2.44. stopword_step

                                          +

                                          11.2.44. stopword_step

                                          -Position increment on stopwords. +Position increment on stopwords. Optional, allowed values are 0 and 1, default is 1. Introduced in version 0.9.9-rc1.

                                          @@ -8314,7 +8352,7 @@

                                          Example:

                                           stopword_step = 1
                                           
                                          -

                                          11.2.45. hitless_words

                                          +

                                          11.2.45. hitless_words

                                          Hitless words list. Optional, allowed values are 'all', or a list file name. @@ -8349,7 +8387,7 @@

                                          Example:

                                           hitless_words = all
                                           
                                          -

                                          11.2.46. expand_keywords

                                          +

                                          11.2.46. expand_keywords

                                          Expand keywords with exact forms and/or stars when possible. Optional, default is 0 (do not expand keywords). @@ -8360,7 +8398,7 @@ prefix or infix indexing enabled, every keyword gets internally replaced with a disjunction of keyword itself and a respective prefix or infix (keyword with stars). If the index was built with both stemming and -index_exact_words enabled, +index_exact_words enabled, exact form is also added. Here's an example that shows how internal expansion works when all of the above (infixes, stemming, and exact words) are combined: @@ -8382,7 +8420,7 @@

                                          Example:

                                           expand_keywords = 1
                                           
                                          -

                                          11.2.47. blend_chars

                                          +

                                          11.2.47. blend_chars

                                          Blended characters list. Optional, default is empty. @@ -8422,7 +8460,7 @@ blend_chars = +, &, U+23 blend_chars = +, &->+ # 2.0.1 and above

                                          -

                                          11.2.48. blend_mode

                                          +

                                          11.2.48. blend_mode

                                          Blended tokens indexing mode. Optional, default is trim_none. @@ -8470,7 +8508,7 @@

                                          Example:

                                           blend_mode = trim_tail, skip_pure
                                           
                                          -

                                          11.2.49. rt_mem_limit

                                          +

                                          11.2.49. rt_mem_limit

                                          RAM chunk size limit. Optional, default is empty. @@ -8490,7 +8528,7 @@

                                          Example:

                                           rt_mem_limit = 512M
                                           
                                          -

                                          11.2.50. rt_field

                                          +

                                          11.2.50. rt_field

                                          Full-text field declaration. Multi-value, mandatory @@ -8506,7 +8544,7 @@ rt_field = title rt_field = content

                                          -

                                          11.2.51. rt_attr_uint

                                          +

                                          11.2.51. rt_attr_uint

                                          Unsigned integer attribute declaration. Multi-value (an arbitrary number of attributes is allowed), optional. @@ -8515,7 +8553,7 @@

                                          Example:

                                           rt_attr_uint = gid
                                           
                                          -

                                          11.2.52. rt_attr_bigint

                                          +

                                          11.2.52. rt_attr_bigint

                                          BIGINT attribute declaration. Multi-value (an arbitrary number of attributes is allowed), optional. @@ -8524,7 +8562,7 @@

                                          Example:

                                           rt_attr_bigint = guid
                                           
                                          -

                                          11.2.53. rt_attr_float

                                          +

                                          11.2.53. rt_attr_float

                                          Floating point attribute declaration. Multi-value (an arbitrary number of attributes is allowed), optional. @@ -8533,25 +8571,25 @@

                                          Example:

                                           rt_attr_float = gpa
                                           
                                          -

                                          11.2.54. rt_attr_multi

                                          +

                                          11.2.54. rt_attr_multi

                                          -Multi-valued attribute (MVA) declaration. +Multi-valued attribute (MVA) declaration. Declares the UNSIGNED INTEGER (unsigned 32-bit) MVA attribute. Multi-value (ie. there may be more than one such attribute declared), optional. Applies to RT indexes only.

                                          Example:

                                           rt_attr_multi = my_tags
                                           
                                          -

                                          11.2.55. rt_attr_multi_64

                                          +

                                          11.2.55. rt_attr_multi_64

                                          -Multi-valued attribute (MVA) declaration. +Multi-valued attribute (MVA) declaration. Declares the BIGINT (signed 64-bit) MVA attribute. Multi-value (ie. there may be more than one such attribute declared), optional. Applies to RT indexes only.

                                          Example:

                                           rt_attr_multi_64 = my_wide_tags
                                           
                                          -

                                          11.2.56. rt_attr_timestamp

                                          +

                                          11.2.56. rt_attr_timestamp

                                          Timestamp attribute declaration. Multi-value (an arbitrary number of attributes is allowed), optional. @@ -8559,7 +8597,7 @@

                                          Example:

                                           rt_attr_timestamp = date_added
                                           
                                          -

                                          11.2.57. rt_attr_string

                                          +

                                          11.2.57. rt_attr_string

                                          String attribute declaration. Multi-value (an arbitrary number of attributes is allowed), optional. @@ -8567,8 +8605,8 @@

                                          Example:

                                           rt_attr_string = author
                                           
                                          -

                                          11.3. indexer program configuration options

                                          -

                                          11.3.1. mem_limit

                                          +

                                          11.3. indexer program configuration options

                                          +

                                          11.3.1. mem_limit

                                          Indexing RAM usage limit. Optional, default is 32M. @@ -8595,7 +8633,7 @@ # mem_limit = 262144K # same, but in KB # mem_limit = 268435456 # same, but in bytes

                                          -

                                          11.3.2. max_iops

                                          +

                                          11.3.2. max_iops

                                          Maximum I/O operations per second, for I/O throttling. Optional, default is 0 (unlimited). @@ -8616,7 +8654,7 @@

                                          Example:

                                           max_iops = 40
                                           
                                          -

                                          11.3.3. max_iosize

                                          +

                                          11.3.3. max_iosize

                                          Maximum allowed I/O operation size, in bytes, for I/O throttling. Optional, default is 0 (unlimited). @@ -8626,20 +8664,20 @@ A value of 0 means that no limit is imposed. Reads or writes that are bigger than the limit will be split in several smaller operations, and counted as several operation -by max_iops setting. At the time of this +by max_iops setting. At the time of this writing, all I/O calls should be under 256 KB (default internal buffer size) anyway, so max_iosize values higher than 256 KB must not affect anything.

                                          Example:

                                           max_iosize = 1048576
                                           
                                          -

                                          11.3.4. max_xmlpipe2_field

                                          +

                                          11.3.4. max_xmlpipe2_field

                                          Maximum allowed field size for XMLpipe2 source type, bytes. Optional, default is 2 MB.

                                          Example:

                                           max_xmlpipe2_field = 8M
                                           
                                          -

                                          11.3.5. write_buffer

                                          +

                                          11.3.5. write_buffer

                                          Write buffer size, bytes. Optional, default is 1 MB. @@ -8647,19 +8685,19 @@ Write buffers are used to write both temporary and final index files when indexing. Larger buffers reduce the number of required disk writes. Memory for the buffers is allocated in addition to -mem_limit. Note that several +mem_limit. Note that several (currently up to 4) buffers for different files will be allocated, proportionally increasing the RAM usage.

                                          Example:

                                           write_buffer = 4M
                                           
                                          -

                                          11.3.6. max_file_field_buffer

                                          +

                                          11.3.6. max_file_field_buffer

                                          Maximum file field adaptive buffer size, bytes. Optional, default is 8 MB, minimum is 1 MB.

                                          File field buffer is used to load files referred to from -sql_file_field columns. +sql_file_field columns. This buffer is adaptive, starting at 1 MB at first allocation, and growing in 2x steps until either file contents can be loaded, or maximum buffer size, specified by max_file_field_buffer @@ -8673,20 +8711,20 @@

                                          Example:

                                           max_file_field_buffer = 128M
                                           
                                          -

                                          11.3.7. on_file_field_error

                                          +

                                          11.3.7. on_file_field_error

                                          How to handle IO errors in file fields. Optional, default is ignore_field. Introduced in version 2.0.2-beta.

                                          When there is a problem indexing a file referenced by a file field -(Section 11.1.29, “sql_file_field”), indexer can +(Section 11.1.29, “sql_file_field”), indexer can either index the document, assuming empty content in this particular field, or skip the document, or fail indexing entirely. on_file_field_error directive controls that behavior. The values it takes are: -

                                          • ignore_field, index the current document without field;
                                          • -
                                          • skip_document, skip the current document but continue indexing;
                                          • -
                                          • fail_index, fail indexing with an error message.
                                          • +

                                            • ignore_field, index the current document without field;

                                            • +
                                            • skip_document, skip the current document but continue indexing;

                                            • +
                                            • fail_index, fail indexing with an error message.

                                            @@ -8705,8 +8743,8 @@

                                            Example:

                                             on_file_field_errors = skip_document
                                             
                                          -

                                          11.4. searchd program configuration options

                                          -

                                          11.4.1. listen

                                          +

                                          11.4. searchd program configuration options

                                          +

                                          11.4.1. listen

                                          This setting lets you specify IP address and port, or Unix-domain socket path, that searchd will listen on. @@ -8726,7 +8764,7 @@ Supported protocol values are 'sphinx' (Sphinx 0.9.x API protocol) and 'mysql41' (MySQL protocol used since 4.1 upto at least 5.1). More details on MySQL protocol support can be found in -Section 5.10, “MySQL protocol support and SphinxQL” section. +Section 5.10, “MySQL protocol support and SphinxQL” section.

                                          Examples:

                                           listen = localhost
                                           listen = localhost:5000
                                          @@ -8741,16 +8779,16 @@
                                           on all available interfaces using the default SphinxAPI port 9312.
                                           Starting with 1.10-beta, it will also listen on default SphinxQL 
                                           port 9306. Both port numbers are assigned by IANA (see
                                          -http://www.iana.org/assignments/port-numbers
                                          +http://www.iana.org/assignments/port-numbers
                                           for details) and should therefore be available.
                                           

                                          Unix-domain sockets are not supported on Windows.

                                          -

                                          11.4.2. address

                                          +

                                          11.4.2. address

                                          Interface IP address to bind on. Optional, default is 0.0.0.0 (ie. listen on all interfaces). -DEPRECATED, use listen instead. +DEPRECATED, use listen instead.

                                          address setting lets you specify which network interface searchd will bind to, listen on, and accept incoming @@ -8759,15 +8797,15 @@

                                          Example:

                                           address = 192.168.0.1
                                           
                                          -

                                          11.4.3. port

                                          +

                                          11.4.3. port

                                          searchd TCP port number. -DEPRECATED, use listen instead. +DEPRECATED, use listen instead. Used to be mandatory. Default port number is 9312.

                                          Example:

                                           port = 9312
                                           
                                          -

                                          11.4.4. log

                                          +

                                          11.4.4. log

                                          Log file name. Optional, default is 'searchd.log'. @@ -8778,11 +8816,11 @@

                                          Example:

                                           log = /var/log/searchd.log
                                           
                                          -

                                          11.4.5. query_log

                                          +

                                          11.4.5. query_log

                                          Query log file name. Optional, default is empty (do not log queries). -All search queries will be logged in this file. The format is described in Section 5.9, “searchd query log formats”. +All search queries will be logged in this file. The format is described in Section 5.9, “searchd query log formats”.

                                          In case of 'plain' format, you can use the 'syslog' as the path to the log file. In this case all search queries will be sent to syslog daemon with LOG_INFO priority, @@ -8791,7 +8829,7 @@

                                          Example:

                                           query_log = /var/log/query.log
                                           
                                          -

                                          11.4.6. query_log_format

                                          +

                                          11.4.6. query_log_format

                                          Query log format. Optional, allowed values are 'plain' and 'sphinxql', default is 'plain'. @@ -8802,12 +8840,12 @@ valid SphinxQL statements. This directive allows to switch between the two formats on search daemon startup. The log format can also be altered on the fly, using SET GLOBAL query_log_format=sphinxql syntax. -Refer to Section 5.9, “searchd query log formats” for more discussion and format +Refer to Section 5.9, “searchd query log formats” for more discussion and format details.

                                          Example:

                                           query_log_format = sphinxql
                                           
                                          -

                                          11.4.7. read_timeout

                                          +

                                          11.4.7. read_timeout

                                          Network client request read timeout, in seconds. Optional, default is 5 seconds. @@ -8815,14 +8853,14 @@

                                          Example:

                                           read_timeout = 1
                                           
                                          -

                                          11.4.8. client_timeout

                                          +

                                          11.4.8. client_timeout

                                          Maximum time to wait between requests (in seconds) when using persistent connections. Optional, default is five minutes.

                                          Example:

                                           client_timeout = 3600
                                           
                                          -

                                          11.4.9. max_children

                                          +

                                          11.4.9. max_children

                                          Maximum amount of children to fork (or in other words, concurrent searches to run in parallel). Optional, default is 0 (unlimited). @@ -8834,7 +8872,7 @@

                                          Example:

                                           max_children = 10
                                           
                                          -

                                          11.4.10. pid_file

                                          +

                                          11.4.10. pid_file

                                          searchd process ID file name. Mandatory. @@ -8849,7 +8887,7 @@

                                          Example:

                                           pid_file = /var/run/searchd.pid
                                           
                                          -

                                          11.4.11. max_matches

                                          +

                                          11.4.11. max_matches

                                          Maximum amount of matches that the daemon keeps in RAM for each index and can return to the client. Optional, default is 1000. @@ -8878,18 +8916,18 @@

                                          CAVEAT EMPTOR! Note that there also is another place where this limit is enforced. max_matches can be decreased on the fly -through the corresponding API call, +through the corresponding API call, and the default value in the API is also set to 1,000. So in order to retrieve more than 1,000 matches to your application, you will have to change the configuration file, restart searchd, and set proper limit -in SetLimits() call. +in SetLimits() call. Also note that you can not set the value in the API higher than the value in the .conf file. This is prohibited in order to have some protection against malicious and/or malformed requests.

                                          Example:

                                           max_matches = 10000
                                           
                                          -

                                          11.4.12. seamless_rotate

                                          +

                                          11.4.12. seamless_rotate

                                          Prevents searchd stalls while rotating indexes with huge amounts of data to precache. Optional, default is 1 (enable seamless rotation). @@ -8900,12 +8938,12 @@ MVA data, and keyword index, respectively.) Without seamless rotate, rotating an index tries to use as little RAM as possible and works as follows: -

                                          1. new queries are temporarly rejected (with "retry" error code);
                                          2. -
                                          3. searchd waits for all currently running queries to finish;
                                          4. -
                                          5. old index is deallocated and its files are renamed;
                                          6. -
                                          7. new index files are renamed and required RAM is allocated;
                                          8. -
                                          9. new index attribute and dictionary data is preloaded to RAM;
                                          10. -
                                          11. searchd resumes serving queries from new index.
                                          12. +

                                            1. new queries are temporarly rejected (with "retry" error code);

                                            2. +
                                            3. searchd waits for all currently running queries to finish;

                                            4. +
                                            5. old index is deallocated and its files are renamed;

                                            6. +
                                            7. new index files are renamed and required RAM is allocated;

                                            8. +
                                            9. new index attribute and dictionary data is preloaded to RAM;

                                            10. +
                                            11. searchd resumes serving queries from new index.

                                            @@ -8913,11 +8951,11 @@ could take noticeble time - up to several minutes in case of preloading 1-5+ GB files.

                                            With seamless rotate enabled, rotation works as follows: -

                                            1. new index RAM storage is allocated;
                                            2. -
                                            3. new index attribute and dictionary data is asynchronously preloaded to RAM;
                                            4. -
                                            5. on success, old index is deallocated and both indexes' files are renamed;
                                            6. -
                                            7. on failure, new index is deallocated;
                                            8. -
                                            9. at any given moment, queries are served either from old or new index copy.
                                            10. +

                                              1. new index RAM storage is allocated;

                                              2. +
                                              3. new index attribute and dictionary data is asynchronously preloaded to RAM;

                                              4. +
                                              5. on success, old index is deallocated and both indexes' files are renamed;

                                              6. +
                                              7. on failure, new index is deallocated;

                                              8. +
                                              9. at any given moment, queries are served either from old or new index copy.

                                              @@ -8928,7 +8966,7 @@

                                              Example:

                                               seamless_rotate = 1
                                               
                                            -

                                            11.4.13. preopen_indexes

                                            +

                                            11.4.13. preopen_indexes

                                            Whether to forcibly preopen all indexes on startup. Optional, default is 1 (preopen everything). @@ -8938,7 +8976,7 @@ versions, it used to be 0 (use per-index settings).

                                            When set to 1, this directive overrides and enforces -preopen on all indexes. +preopen on all indexes. They will be preopened, no matter what is the per-index preopen setting. When set to 0, per-index settings can take effect. (And they default to 0.) @@ -8951,14 +8989,14 @@

                                            Example:

                                             preopen_indexes = 1
                                             
                                            -

                                            11.4.14. unlink_old

                                            +

                                            11.4.14. unlink_old

                                            Whether to unlink .old index copies on succesful rotation. Optional, default is 1 (do unlink).

                                            Example:

                                             unlink_old = 0
                                             
                                            -

                                            11.4.15. attr_flush_period

                                            +

                                            11.4.15. attr_flush_period

                                            When calling UpdateAttributes() to update document attributes in real-time, changes are first written to the in-memory copy of attributes @@ -8974,21 +9012,21 @@

                                            Example:

                                             attr_flush_period = 900 # persist updates to disk every 15 minutes
                                             
                                            -

                                            11.4.16. ondisk_dict_default

                                            +

                                            11.4.16. ondisk_dict_default

                                            -Instance-wide defaults for ondisk_dict directive. +Instance-wide defaults for ondisk_dict directive. Optional, default it 0 (precache dictionaries in RAM). Introduced in version 0.9.9-rc1.

                                            This directive lets you specify the default value of -ondisk_dict for all the indexes +ondisk_dict for all the indexes served by this copy of searchd. Per-index directive take precedence, and will overwrite this instance-wide default value, allowing for fine-grain control.

                                            Example:

                                             ondisk_dict_default = 1 # keep all dictionaries on disk
                                             
                                            -

                                            11.4.17. max_packet_size

                                            +

                                            11.4.17. max_packet_size

                                            Maximum allowed network packet size. Limits both query packets from clients, and response packets from remote agents in distributed environment. @@ -8998,7 +9036,7 @@

                                            Example:

                                             max_packet_size = 32M
                                             
                                            -

                                            11.4.18. mva_updates_pool

                                            +

                                            11.4.18. mva_updates_pool

                                            Shared pool size for in-memory MVA updates storage. Optional, default size is 1M. @@ -9016,14 +9054,14 @@

                                            Example:

                                             mva_updates_pool = 16M
                                             
                                            -

                                            11.4.19. crash_log_path

                                            +

                                            11.4.19. crash_log_path

                                            Deprecated debugging setting, path (formally prefix) for crash log files. Introduced in version 0.9.9-rc1. Deprecated in version 2.0.1-beta, as crash debugging information now gets logged into searchd.log in text form, and separate binary crash logs are no longer needed.

                                            -

                                            11.4.20. max_filters

                                            +

                                            11.4.20. max_filters

                                            Maximum allowed per-query filter count. Only used for internal sanity checks, does not directly affect RAM use or performance. @@ -9032,7 +9070,7 @@

                                            Example:

                                             max_filters = 1024
                                             
                                            -

                                            11.4.21. max_filter_values

                                            +

                                            11.4.21. max_filter_values

                                            Maximum allowed per-filter values count. Only used for internal sanity checks, does not directly affect RAM use or performance. @@ -9041,7 +9079,7 @@

                                            Example:

                                             max_filter_values = 16384
                                             
                                            -

                                            11.4.22. listen_backlog

                                            +

                                            11.4.22. listen_backlog

                                            TCP listen backlog. Optional, default is 5. @@ -9055,7 +9093,7 @@

                                            Example:

                                             listen_backlog = 20
                                             
                                            -

                                            11.4.23. read_buffer

                                            +

                                            11.4.23. read_buffer

                                            Per-keyword read buffer size. Optional, default is 256K. @@ -9067,7 +9105,7 @@

                                            Example:

                                             read_buffer = 1M
                                             
                                            -

                                            11.4.24. read_unhinted

                                            +

                                            11.4.24. read_unhinted

                                            Unhinted read size. Optional, default is 32K. @@ -9083,40 +9121,40 @@

                                            Example:

                                             read_unhinted = 32K
                                             
                                            -

                                            11.4.25. max_batch_queries

                                            +

                                            11.4.25. max_batch_queries

                                            Limits the amount of queries per batch. Optional, default is 32.

                                            Makes searchd perform a sanity check of the amount of the queries -submitted in a single batch when using multi-queries. +submitted in a single batch when using multi-queries. Set it to 0 to skip the check.

                                            Example:

                                             max_batch_queries = 256
                                             
                                            -

                                            11.4.26. subtree_docs_cache

                                            +

                                            11.4.26. subtree_docs_cache

                                            Max common subtree document cache size, per-query. Optional, default is 0 (disabled).

                                            -Limits RAM usage of a common subtree optimizer (see Section 5.11, “Multi-queries”). +Limits RAM usage of a common subtree optimizer (see Section 5.11, “Multi-queries”). At most this much RAM will be spent to cache document entries per each query. Setting the limit to 0 disables the optimizer.

                                            Example:

                                             subtree_docs_cache = 8M
                                             
                                            -

                                            11.4.27. subtree_hits_cache

                                            +

                                            11.4.27. subtree_hits_cache

                                            Max common subtree hit cache size, per-query. Optional, default is 0 (disabled).

                                            -Limits RAM usage of a common subtree optimizer (see Section 5.11, “Multi-queries”). +Limits RAM usage of a common subtree optimizer (see Section 5.11, “Multi-queries”). At most this much RAM will be spent to cache keyword occurrences (hits) per each query. Setting the limit to 0 disables the optimizer.

                                            Example:

                                             subtree_hits_cache = 16M
                                             
                                            -

                                            11.4.28. workers

                                            +

                                            11.4.28. workers

                                            Multi-processing mode (MPM). Optional; allowed values are none, fork, prefork, and threads. @@ -9156,7 +9194,7 @@

                                            Example:

                                             workers = threads
                                             
                                            -

                                            11.4.29. dist_threads

                                            +

                                            11.4.29. dist_threads

                                            Max local worker threads to use for parallelizable requests (searching a distributed index; building a batch of snippets). Optional, default is 0, which means to disable in-request parallelism. @@ -9201,14 +9239,15 @@ dist_threads = 4

                                            -

                                            11.4.30. binlog_path

                                            +

                                            11.4.30. binlog_path

                                            Binary log (aka transaction log) files path. Optional, default is build-time configured data directory. Introduced in version 1.10-beta.

                                            -Binary logs are used for crash recovery of RT index data that -would otherwise only be stored in RAM. When logging is enabled, +Binary logs are used for crash recovery of RT index data, and also of +attributes updates of plain disk indices that +would otherwise only be stored in RAM untill flush. When logging is enabled, every transaction COMMIT-ted into RT index gets written into a log file. Logs are then automatically replayed on startup after an unclean shutdown, recovering the logged changes. @@ -9220,11 +9259,16 @@

                                            Empty value disables binary logging. That improves performance, but puts RT index data at risk. +

                                            +WARNING! It is strongly recommended to always explicitly define 'binlog_path' option in your config. +Otherwise, the default path, which in most cases is the same as working folder, may point to the +folder with no write access (for example, /usr/local/var/data). In this case, the searchd +will not start at all.

                                            Example:

                                             binlog_path = # disable logging
                                             binlog_path = /var/data # /var/data/binlog.001 etc will be created
                                             
                                            -

                                            11.4.31. binlog_flush

                                            +

                                            11.4.31. binlog_flush

                                            Binary log transaction flush/sync mode. Optional, default is 2 (flush every transaction, sync every second). @@ -9232,18 +9276,18 @@

                                            This directive controls how frequently will binary log be flushed to OS and synced to disk. Three modes are supported: -

                                            • 0, flush and sync every second. Best performance, +

                                              • 0, flush and sync every second. Best performance, but up to 1 second worth of committed transactions can be lost both on daemon crash, or OS/hardware crash. -

                                              • -
                                              • 1, flush and sync every transaction. Worst performance, +

                                              • +
                                              • 1, flush and sync every transaction. Worst performance, but every committed transaction data is guaranteed to be saved. -

                                              • -
                                              • 2, flush every transaction, sync every second. +

                                              • +
                                              • 2, flush every transaction, sync every second. Good performance, and every committed transaction is guaranteed to be saved in case of daemon crash. However, in case of OS/hardware crash up to 1 second worth of committed transactions can be lost. -

                                              • +

                                              @@ -9255,7 +9299,7 @@

                                              Example:

                                               binlog_flush = 1 # ultimate safety, low speed
                                               
                                            -

                                            11.4.32. binlog_max_log_size

                                            +

                                            11.4.32. binlog_max_log_size

                                            Maximum binary log file size. Optional, default is 0 (do not reopen binlog file based on size). @@ -9267,7 +9311,7 @@

                                            Example:

                                             binlog_max_log_size = 16M
                                             
                                            -

                                            11.4.33. collation_server

                                            +

                                            11.4.33. collation_server

                                            Default server collation. Optional, default is libc_ci. @@ -9275,35 +9319,35 @@

                                            Specifies the default collation used for incoming requests. The collation can be overridden on a per-query basis. -Refer to Section 5.12, “Collations” section for the list of available collations and other details. +Refer to Section 5.12, “Collations” section for the list of available collations and other details.

                                            Example:

                                             collation_server = utf8_ci
                                             
                                            -

                                            11.4.34. collation_libc_locale

                                            +

                                            11.4.34. collation_libc_locale

                                            Server libc locale. Optional, default is C. Introduced in version 2.0.1-beta.

                                            Specifies the libc locale, affecting the libc-based collations. -Refer to Section 5.12, “Collations” section for the details. +Refer to Section 5.12, “Collations” section for the details.

                                            Example:

                                             collation_libc_locale = fr_FR
                                             
                                            -

                                            11.4.35. plugin_dir

                                            +

                                            11.4.35. plugin_dir

                                            Trusted location for the dynamic libraries (UDFs). Optional, default is empty (no location). Introduced in version 2.0.1-beta.

                                            Specifies the trusted directory from which the -UDF libraries can be loaded. Requires -workers = thread to take effect. +UDF libraries can be loaded. Requires +workers = thread to take effect.

                                            Example:

                                             workers = threads
                                             plugin_dir = /usr/local/sphinx/lib
                                             
                                            -

                                            11.4.36. mysql_version_string

                                            +

                                            11.4.36. mysql_version_string

                                            A server version string to return via MySQL protocol. Optional, default is empty (return Sphinx version). @@ -9322,7 +9366,7 @@

                                            Example:

                                             mysql_version_string = 5.0.37
                                             
                                            -

                                            11.4.37. rt_flush_period

                                            +

                                            11.4.37. rt_flush_period

                                            RT indexes RAM chunk flush check period, in seconds. Optional, default is 0 (do not flush). @@ -9332,12 +9376,12 @@ can result in ever-growing binlogs, impacting disk use and crash recovery time. With this directive the search daemon performs periodic flush checks, and eligible RAM chunks can get saved, -enabling consequential binlog cleanup. See Section 4.4, “Binary logging” +enabling consequential binlog cleanup. See Section 4.4, “Binary logging” for more details.

                                            Example:

                                             rt_flush_period = 3600
                                             
                                            -

                                            11.4.38. thread_stack

                                            +

                                            11.4.38. thread_stack

                                            Per-thread stack size. Optional, default is 64K. @@ -9363,7 +9407,7 @@

                                            Example:

                                             thread_stack = 256K
                                             
                                            -

                                            11.4.39. expansion_limit

                                            +

                                            11.4.39. expansion_limit

                                            The maximum number of expanded keywords for a single wildcard. Optional, default is 0 (no limit). @@ -9380,7 +9424,7 @@

                                            Example:

                                             expansion_limit = 16
                                             
                                            -

                                            11.4.40. compat_sphinxql_magics

                                            +

                                            11.4.40. compat_sphinxql_magics

                                            Legacy SphinxQL quirks compatiblity mode. Optional, default is 1 (keep compatibility). @@ -9395,19 +9439,19 @@ with standard SQL syntax. So it's advised to update the applications utilising SphinxQL and then switch the daemon to the new, more SQL compliant mode by setting compat_sphinxql_magics = 0. -Please refer to Section 7.24, “SphinxQL upgrade notes, version 2.0.1-beta” +Please refer to Section 7.24, “SphinxQL upgrade notes, version 2.0.1-beta” for the details and update instruction.

                                            Example:

                                             compat_sphinxql_magics = 0 # the future is now
                                             
                                            -

                                            11.4.41. watchdog

                                            +

                                            11.4.41. watchdog

                                            Threaded server watchdog. Optional, default is 1 (watchdog enabled). Introduced in version 2.0.1-beta.

                                            A crashed query in threads multi-processing mode -(workers = threads) +(workers = threads) can take down the entire server. With watchdog feature enabled, searchd additionally keeps a separate lightweight process that monitors the main server process, and automatically @@ -9416,13 +9460,13 @@

                                            Example:

                                             watchdog = 0 # disable watchdog
                                             
                                            -

                                            11.4.42. prefork_rotation_throttle

                                            +

                                            11.4.42. prefork_rotation_throttle

                                            Delay between restarting preforked children on index rotation, in milliseconds. Optional, default is 0 (no delay). Introduced in version 2.0.2-beta.

                                            -When running in workers = prefork +When running in workers = prefork mode, every index rotation needs to restart all children to propagate the newly loaded index data changes. Restarting all of them at once might put excessive strain on CPU and/or network connections. (For instance, when the application @@ -9438,750 +9482,808 @@

                                            Example:

                                             prefork_rotation_throttle = 50 # throttle children restarts by 50 msec each
                                             
                                            -

                                            Appendix A. Sphinx revision history

                                            -

                                            Table of Contents

                                            A.1. Version 2.0.2-beta, 15 nov 2011
                                            -
                                            A.2. Version 2.0.1-beta, 22 apr 2011
                                            -
                                            A.3. Version 1.10-beta, 19 jul 2010
                                            -
                                            A.4. Version 0.9.9-release, 02 dec 2009
                                            -
                                            A.5. Version 0.9.9-rc2, 08 apr 2009
                                            -
                                            A.6. Version 0.9.9-rc1, 17 nov 2008
                                            -
                                            A.7. Version 0.9.8.1, 30 oct 2008
                                            -
                                            A.8. Version 0.9.8, 14 jul 2008
                                            -
                                            A.9. Version 0.9.7, 02 apr 2007
                                            -
                                            A.10. Version 0.9.7-rc2, 15 dec 2006
                                            -
                                            A.11. Version 0.9.7-rc1, 26 oct 2006
                                            -
                                            A.12. Version 0.9.6, 24 jul 2006
                                            -
                                            A.13. Version 0.9.6-rc1, 26 jun 2006
                                            +

                                            Appendix A. Sphinx revision history

                                            + -

                                            A.1. Version 2.0.2-beta, 15 nov 2011

                                            -

                                            Major new features

                                            -

                                            New features

                                            • added support for upto 256 searchable fields (was upto 32 before)
                                            • -
                                            • added FIBONACCI() function to expressions
                                            • -
                                            • added load_files_scattered option to snippets
                                            • -
                                            • added implicit attribute type promotions in multi-index result sets (#939)
                                            • -
                                            • added index names to indexer progress message on merge (#928)
                                            • -
                                            • added --replay-flags switch to searchd
                                            • -
                                            • added string attribute support and a few previously missing snippets options to SphinxSE
                                            • -
                                            • added previously missing Status(), SetConnectTimeout() API calls to Python API
                                            • -
                                            • added ORDER BY RAND() support to SELECT statement
                                            • -
                                            • added Sphinx version to Windows crash log
                                            • -
                                            • added RT index support to indextool --check (checks disk chunks only) (#877)
                                            • -
                                            • added prefork_rotation_throttle directive (preforked children restart delay, in milliseconds) (#873)
                                            • -
                                            • added on_file_field_error directive (different sql_file_field handling modes)
                                            • -
                                            • added manpages for all the programs
                                            • -
                                            • added syslog logging support
                                            • -
                                            • added sentence, paragraph, and zone support in html_strip_mode=retain mode to snippets
                                            • -
                                            • optimized search performance with many ZONE operators
                                            • -
                                            • improved suggestion tool (added Levenshtein limit, removed extra DB fetch)
                                            • -
                                            • improved sentence extraction (handles salutations, starting initials better now)
                                            • -
                                            • changed max_filter_values sanity check to 10M values
                                            • -
                                            -

                                            New SphinxQL features

                                            • added FLUSH RTINDEX statement
                                            • -
                                            • added dist_threads directive (parallel processing), load_files, load_files_scattered, batch syntax (multiple documents) support to CALL SNIPPETS statement
                                            • -
                                            • added OPTION comment='...' support to SELECT statement (#944)
                                            • -
                                            • added SHOW VARIABLES statement
                                            • -
                                            • added dummy handlers for SET TRANSACTION, SET NAMES, SELECT @@sysvar statements, and for sql_auto_is_null, sql_mode, and @@-style variables (like @@tx_isolation) in SET statement (better MySQL frameworks/connectors support)
                                            • -
                                            • added complete SphinxQL error logging (all errors are logged now, not just SELECTs)
                                            • -
                                            • improved SELECT statement syntax, made expressions aliases optional
                                            • -
                                            -

                                            Bug fixes

                                            • fixed #982, empty binlogs prevented upgraded daemon from starting up
                                            • -
                                            • fixed #978, libsphinxclient build failed on sparc/sparc64 solaris
                                            • -
                                            • fixed #977, eliminated (most) compiler warnings
                                            • -
                                            • fixed #969, broken expression MVA/string argument type check prevented IF(IN(mva..)) and other valid expressions from working
                                            • -
                                            • fixed #966, NOT IN @global_var syntax was not supported
                                            • -
                                            • fixed #958, mem_limit over INT_MAX was not clamped
                                            • -
                                            • fixed #954, UTF-8 snippets could crash on malformed data
                                            • -
                                            • fixed #951, UTF-8 snippets could hang on malformed data
                                            • -
                                            • fixed #947, bad float column type was reported via SphinxQL, breaking some clients
                                            • -
                                            • fixed #940, group-by with a small enough max_matches limit could occasionaly crash and/or sort wrongly
                                            • -
                                            • fixed #932, sending huge queries to agents occasionally failed (mainly on Windows)
                                            • -
                                            • fixed #926, snippets did not highlight widlcard matches with morphology enabled
                                            • -
                                            • fixed #918, crash logger did not report a proper query in dist_threads case
                                            • -
                                            • fixed #916, watchdog caused (endless) respawns if there was a crash during shutdown
                                            • -
                                            • fixed #904, attribute names were not forcibly case-folded in some API calls (eg. SetGroupDistinct)
                                            • -
                                            • fixed #902, query parser did not support stopword_step=0
                                            • -
                                            • fixed #897, network sockets dangled (open but unattended) while replaying binlog
                                            • -
                                            • fixed #855, allow_empty option in snippets did not always work correctly
                                            • -
                                            • fixed #854, indexing with many bigint attributes and docinfo=inline crashed
                                            • -
                                            • fixed #838, RT MVA insertion did not sort MVA values, caused matching issues
                                            • -
                                            • fixed #833, duplicate MVA values were not eliminated on update
                                            • -
                                            • fixed #832, certain (overshort/incorrect) documents crashed indexing MS SQL Unicode columns
                                            • -
                                            • fixed #829, query parser did not properly handle numerics with blend_chars
                                            • -
                                            • fixed #814, group-by string attributes in RT indexes dit not always work correctly
                                            • -
                                            • fixed #812, utf8 stemming produced unexpected stems on words with single-byte chars
                                            • -
                                            • fixed #808, huge queries crashed logging with query_log_format=sphinxql
                                            • -
                                            • fixed #806, stray single-star keyword crashed on querying
                                            • -
                                            • fixed #798, snippets ignored index_exact_words in query_mode
                                            • -
                                            • fixed #797, RT klist loader had an occasional off-by-one crash
                                            • -
                                            • fixed #791, preopen_indexes erroneously defaulted to 0 on Windows
                                            • -
                                            • fixed #790, huge dictionaries (over 4 GB) did not work
                                            • -
                                            • fixed #786, inplace_enable could occasionally corrupt the indexes
                                            • -
                                            • fixed #775, doc had a typo (soundex vs metaphone)
                                            • -
                                            • fixed #772, snippets duplicated blended chars on a SPZ boundary
                                            • -
                                            • fixed #762, query parser truncated digit-only keywords over 15 digits
                                            • -
                                            • fixed #736, query parser dit not properly handle blended/special char sequence
                                            • -
                                            • fixed #726, rotation of an index with a changed attribute count crashed
                                            • -
                                            • fixed #687, querying multiple indexes with index weights and sort-by expression produced incorrect (unadjusted) weights
                                            • -
                                            • fixed #585, (unsupported) string ordinals were silently zeroed out with docinfo=inline (instead of failing)
                                            • -
                                            • fixed #583, certain keywords could occasionally crash multiforms
                                            • -
                                            • fixed that concurrent MVA updates could crash
                                            • -
                                            • fixed that query parser did not ignore a pure blended token with a leading modifier
                                            • -
                                            • fixed that query parser did not properly handle a modifier followed by a dash
                                            • -
                                            • fixed that substring indexing with dict=crc did not support index_exact_words and zones
                                            • -
                                            • fixed that in a rare edge case common subtree cache could crash
                                            • -
                                            • fixed that empty result set returned the full schema (rather than SELECT-ed columns)
                                            • -
                                            • fixed that SphinxQL did not have a sanity check for (currently unsupported) result set schemas over 250 attributes
                                            • -
                                            • fixed that updates on regular indexes were not binlogged
                                            • -
                                            • fixed that multi-query optimization check for expressions did not handle multi-index case
                                            • -
                                            • fixed that SphinxSE did not build vs MySQL 5.5 release
                                            • -
                                            • fixed that proximity_bm25 ranker could yield incorrect weight on duplicated keywords
                                            • -
                                            • fixed that prefix expansion with dict=keyword occasionally crashed
                                            • -
                                            • fixed that strip_path did not work on RT disk chunks
                                            • -
                                            • fixed that exclude filters were not properly logged in query_log_format=sphinxql mode
                                            • -
                                            • fixed that plain string attribute check in indextool --check was broken
                                            • -
                                            • fixed that Java API did not let specify a connection timeout
                                            • -
                                            • fixed that ordinal and wordcount attributes could not be fetched via SphinxQL
                                            • -
                                            • fixed that in a rare edge case OR/ORDER would not match properly
                                            • -
                                            • fixed that sending (huge) query response did not handle EINTR properly
                                            • -
                                            • fixed that SPH04 ranker could yield incorrectly high weight in some cases
                                            • -
                                            • fixed that C API did not let zero out cutoff, max_matches settings
                                            • -
                                            • fixed that on a persistent connection there were occasionally issues handling signals while doing network reads/waitss
                                            • -
                                            • fixed that in a rare edge case (field start modifier in a certain complex query) querying crashed
                                            • -
                                            • fixed that snippets did not support dist_threads with load_files=0
                                            • -
                                            • fixed that in some extremely rare edge cases tiny parts of an index could end up corrupted with dict=keywords
                                            • -
                                            • fixed that field/zone conditions were not propagated to expanded keywords with dict=keywords
                                            • +

                                              A.1. Version 2.0.4-release, 02 mar 2012

                                              +

                                              Bug fixes

                                              • fixed #605, pack vs mysql compress

                                              • +
                                              • fixed #783, #862, #917, #985, #990, #1032 documentation bugs

                                              • +
                                              • fixed #885, bitwise AND/OR were not available via API

                                              • +
                                              • fixed #984, crash on indexing data with MAGIC_CODE_ZONE symbol

                                              • +
                                              • fixed #1004, RT index loses words from dictionary on segments merging with id64 enabled

                                              • +
                                              • fixed #1035, daemon doesn't properly handle FDs in case of socket overflow FD_SETSIZE ( *nix, preopen_indexes=0, worker=threads )

                                              • +
                                              • fixed #1038, quoted string for API select

                                              • +
                                              • fixed #1046, head SPZ overflow, snippet generation at non fast with SPZ

                                              • +
                                              • fixed #1048, distributed index can't sort \ filter because of missed attributes

                                              • +
                                              • fixed #1050, expression ranker vs agents

                                              • +
                                              • fixed #1051, added MVA64 support to UDFs

                                              • +
                                              • fixed #1054, max_query_time not handled properly on searching at RT index

                                              • +
                                              • fixed #1055, expansion_limit on searching at RT disk chunks

                                              • +
                                              • fixed #1057, daemon crashes on generating snippet with 0 documents provided

                                              • +
                                              • fixed #1060, load_files_scattered don't work

                                              • +
                                              • fixed #1065, libsphinxclient vs distribute index (agents)

                                              • +
                                              • fixed #1067, modifiers were not escaped in legacy query emulation

                                              • +
                                              • fixed #1071, master - agent communication got slower for a large query

                                              • +
                                              • fixed #1076, #1077, (redundant copying, and a possible mutex leak with uservars)

                                              • +
                                              • fixed #1078, blended vs FIELD_END

                                              • +
                                              • fixed #1084 crash \ index corruption on loading persist MVA

                                              • +
                                              • fixed #1091, RT attach of plain index with string \ MVA attributes prior regular attributes

                                              • +
                                              • fixed #1092, update got binloged with wrong TID

                                              • +
                                              • fixed #1098, crash on creating large expression

                                              • +
                                              • fixed #1099, cleaning up temporary files on fail of indexing

                                              • +
                                              • fixed #1100, missing xmlpipe_attr_bigint config directive

                                              • +
                                              • fixed #1101, now ignoring dashes within keywords when dash is not in charset_table

                                              • +
                                              • fixed #1103, ZONE operator incorrectly works on more than one keywords in a simple zone

                                              • +
                                              • fixed #1106, optimized WHERE id=value, WHERE id IN (values_list) clauses used in SELECT, UPDATE statements

                                              • +
                                              • fixed #1112, Sphinx doesn't work out-of-the-box because the collision of binlog_path option

                                              • +
                                              • fixed #1116, crash on FLUSH RTINDEX unknown-index-name

                                              • +
                                              • fixed #1117, occasional RT headers corruption (leading to crashes and/or missing results)

                                              • +
                                              • fixed #1119, missing expression ranker support in SphinxSE

                                              • +
                                              • fixed #1120, negative total_found, docs and hits counter on huge indexes

                                              • +
                                              +

                                              A.2. Version 2.0.3-release, 23 dec 2011

                                              +

                                              Bug fixes

                                              • fixed #1031, SphinxQL parsing syntax for MVA at insert \ replace statements

                                              • +
                                              • fixed #1027, stalls on attribute update in high-concurrency load

                                              • +
                                              • fixed #1026, daemon crash on malformed API command

                                              • +
                                              • fixed #1021, max_children option has been ignored with worker=threads

                                              • +
                                              • fixed #1020, crash on large attribute files loading

                                              • +
                                              • fixed #1014, crash on rotation when index has been removed from config file (worker=threads, *nix box)

                                              • +
                                              • fixed #1001, broken MVA files in RT index while saving disk chunk

                                              • +
                                              • fixed #995, crash on empty MVA updates

                                              • +
                                              • fixed #994, crash on daemon shutdown with seamless_rotate=0 and workers=threads

                                              • +
                                              • fixed #993, #998, crash on replay DELETE statement vs RT index with dict=keywords, fixed sequential INSERT into dict=keywords index right after INSERT into dict=crc index

                                              • +
                                              • fixed #991, crash on indexing mssql source with mssql_unicode enabled

                                              • +
                                              • fixed #983, #950, crash on host name lookup (SphinxSE with MySQL 5.5)

                                              • +
                                              • fixed #981, snippet inconsistency with allow_empty=0

                                              • +
                                              • fixed #980, broken index produced by index merge in rare cases

                                              • +
                                              • fixed #971, absent error message at master on agent "maxed out"

                                              • +
                                              • fixed #695, #815, #835, #866, malformed warnings in SphinxQL

                                              • +
                                              • fixed build of SphinxSE with MySQL 5.1

                                              • +
                                              • fixed crash log for 'fork' and 'prefork' workers

                                              • +
                                              +

                                              A.3. Version 2.0.2-beta, 15 nov 2011

                                              +

                                              Major new features

                                              +

                                              New features

                                              • added support for upto 256 searchable fields (was upto 32 before)

                                              • +
                                              • added FIBONACCI() function to expressions

                                              • +
                                              • added load_files_scattered option to snippets

                                              • +
                                              • added implicit attribute type promotions in multi-index result sets (#939)

                                              • +
                                              • added index names to indexer progress message on merge (#928)

                                              • +
                                              • added --replay-flags switch to searchd

                                              • +
                                              • added string attribute support and a few previously missing snippets options to SphinxSE

                                              • +
                                              • added previously missing Status(), SetConnectTimeout() API calls to Python API

                                              • +
                                              • added ORDER BY RAND() support to SELECT statement

                                              • +
                                              • added Sphinx version to Windows crash log

                                              • +
                                              • added RT index support to indextool --check (checks disk chunks only) (#877)

                                              • +
                                              • added prefork_rotation_throttle directive (preforked children restart delay, in milliseconds) (#873)

                                              • +
                                              • added on_file_field_error directive (different sql_file_field handling modes)

                                              • +
                                              • added manpages for all the programs

                                              • +
                                              • added syslog logging support

                                              • +
                                              • added sentence, paragraph, and zone support in html_strip_mode=retain mode to snippets

                                              • +
                                              • optimized search performance with many ZONE operators

                                              • +
                                              • improved suggestion tool (added Levenshtein limit, removed extra DB fetch)

                                              • +
                                              • improved sentence extraction (handles salutations, starting initials better now)

                                              • +
                                              • changed max_filter_values sanity check to 10M values

                                              • +
                                              +

                                              New SphinxQL features

                                              • added FLUSH RTINDEX statement

                                              • +
                                              • added dist_threads directive (parallel processing), load_files, load_files_scattered, batch syntax (multiple documents) support to CALL SNIPPETS statement

                                              • +
                                              • added OPTION comment='...' support to SELECT statement (#944)

                                              • +
                                              • added SHOW VARIABLES statement

                                              • +
                                              • added dummy handlers for SET TRANSACTION, SET NAMES, SELECT @@sysvar statements, and for sql_auto_is_null, sql_mode, and @@-style variables (like @@tx_isolation) in SET statement (better MySQL frameworks/connectors support)

                                              • +
                                              • added complete SphinxQL error logging (all errors are logged now, not just SELECTs)

                                              • +
                                              • improved SELECT statement syntax, made expressions aliases optional

                                              • +
                                              +

                                              Bug fixes

                                              • fixed #982, empty binlogs prevented upgraded daemon from starting up

                                              • +
                                              • fixed #978, libsphinxclient build failed on sparc/sparc64 solaris

                                              • +
                                              • fixed #977, eliminated (most) compiler warnings

                                              • +
                                              • fixed #969, broken expression MVA/string argument type check prevented IF(IN(mva..)) and other valid expressions from working

                                              • +
                                              • fixed #966, NOT IN @global_var syntax was not supported

                                              • +
                                              • fixed #958, mem_limit over INT_MAX was not clamped

                                              • +
                                              • fixed #954, UTF-8 snippets could crash on malformed data

                                              • +
                                              • fixed #951, UTF-8 snippets could hang on malformed data

                                              • +
                                              • fixed #947, bad float column type was reported via SphinxQL, breaking some clients

                                              • +
                                              • fixed #940, group-by with a small enough max_matches limit could occasionaly crash and/or sort wrongly

                                              • +
                                              • fixed #932, sending huge queries to agents occasionally failed (mainly on Windows)

                                              • +
                                              • fixed #926, snippets did not highlight widlcard matches with morphology enabled

                                              • +
                                              • fixed #918, crash logger did not report a proper query in dist_threads case

                                              • +
                                              • fixed #916, watchdog caused (endless) respawns if there was a crash during shutdown

                                              • +
                                              • fixed #904, attribute names were not forcibly case-folded in some API calls (eg. SetGroupDistinct)

                                              • +
                                              • fixed #902, query parser did not support stopword_step=0

                                              • +
                                              • fixed #897, network sockets dangled (open but unattended) while replaying binlog

                                              • +
                                              • fixed #855, allow_empty option in snippets did not always work correctly

                                              • +
                                              • fixed #854, indexing with many bigint attributes and docinfo=inline crashed

                                              • +
                                              • fixed #838, RT MVA insertion did not sort MVA values, caused matching issues

                                              • +
                                              • fixed #833, duplicate MVA values were not eliminated on update

                                              • +
                                              • fixed #832, certain (overshort/incorrect) documents crashed indexing MS SQL Unicode columns

                                              • +
                                              • fixed #829, query parser did not properly handle numerics with blend_chars

                                              • +
                                              • fixed #814, group-by string attributes in RT indexes dit not always work correctly

                                              • +
                                              • fixed #812, utf8 stemming produced unexpected stems on words with single-byte chars

                                              • +
                                              • fixed #808, huge queries crashed logging with query_log_format=sphinxql

                                              • +
                                              • fixed #806, stray single-star keyword crashed on querying

                                              • +
                                              • fixed #798, snippets ignored index_exact_words in query_mode

                                              • +
                                              • fixed #797, RT klist loader had an occasional off-by-one crash

                                              • +
                                              • fixed #791, preopen_indexes erroneously defaulted to 0 on Windows

                                              • +
                                              • fixed #790, huge dictionaries (over 4 GB) did not work

                                              • +
                                              • fixed #786, inplace_enable could occasionally corrupt the indexes

                                              • +
                                              • fixed #775, doc had a typo (soundex vs metaphone)

                                              • +
                                              • fixed #772, snippets duplicated blended chars on a SPZ boundary

                                              • +
                                              • fixed #762, query parser truncated digit-only keywords over 15 digits

                                              • +
                                              • fixed #736, query parser dit not properly handle blended/special char sequence

                                              • +
                                              • fixed #726, rotation of an index with a changed attribute count crashed

                                              • +
                                              • fixed #687, querying multiple indexes with index weights and sort-by expression produced incorrect (unadjusted) weights

                                              • +
                                              • fixed #585, (unsupported) string ordinals were silently zeroed out with docinfo=inline (instead of failing)

                                              • +
                                              • fixed #583, certain keywords could occasionally crash multiforms

                                              • +
                                              • fixed that concurrent MVA updates could crash

                                              • +
                                              • fixed that query parser did not ignore a pure blended token with a leading modifier

                                              • +
                                              • fixed that query parser did not properly handle a modifier followed by a dash

                                              • +
                                              • fixed that substring indexing with dict=crc did not support index_exact_words and zones

                                              • +
                                              • fixed that in a rare edge case common subtree cache could crash

                                              • +
                                              • fixed that empty result set returned the full schema (rather than SELECT-ed columns)

                                              • +
                                              • fixed that SphinxQL did not have a sanity check for (currently unsupported) result set schemas over 250 attributes

                                              • +
                                              • fixed that updates on regular indexes were not binlogged

                                              • +
                                              • fixed that multi-query optimization check for expressions did not handle multi-index case

                                              • +
                                              • fixed that SphinxSE did not build vs MySQL 5.5 release

                                              • +
                                              • fixed that proximity_bm25 ranker could yield incorrect weight on duplicated keywords

                                              • +
                                              • fixed that prefix expansion with dict=keyword occasionally crashed

                                              • +
                                              • fixed that strip_path did not work on RT disk chunks

                                              • +
                                              • fixed that exclude filters were not properly logged in query_log_format=sphinxql mode

                                              • +
                                              • fixed that plain string attribute check in indextool --check was broken

                                              • +
                                              • fixed that Java API did not let specify a connection timeout

                                              • +
                                              • fixed that ordinal and wordcount attributes could not be fetched via SphinxQL

                                              • +
                                              • fixed that in a rare edge case OR/ORDER would not match properly

                                              • +
                                              • fixed that sending (huge) query response did not handle EINTR properly

                                              • +
                                              • fixed that SPH04 ranker could yield incorrectly high weight in some cases

                                              • +
                                              • fixed that C API did not let zero out cutoff, max_matches settings

                                              • +
                                              • fixed that on a persistent connection there were occasionally issues handling signals while doing network reads/waitss

                                              • +
                                              • fixed that in a rare edge case (field start modifier in a certain complex query) querying crashed

                                              • +
                                              • fixed that snippets did not support dist_threads with load_files=0

                                              • +
                                              • fixed that in some extremely rare edge cases tiny parts of an index could end up corrupted with dict=keywords

                                              • +
                                              • fixed that field/zone conditions were not propagated to expanded keywords with dict=keywords

                                              -

                                              A.2. Version 2.0.1-beta, 22 apr 2011

                                              -

                                              New general features

                                              -

                                              New SphinxQL features

                                              -

                                              New command-line switches

                                              • added --print-queries switch to indexer that dumps SQL queries it runs
                                              • -
                                              • added --sighup-each switch to indexer that rotates indexes one by one
                                              • -
                                              • added --strip-path switch to searchd that skips file paths embedded in the index(-es)
                                              • -
                                              • added --dumpconfig switch to indextool that dumps an index header in sphinx.conf format
                                              • -
                                              -

                                              Major changes and optimizations

                                              • changed default preopen_indexes value to 1
                                              • -
                                              • optimized English stemmer (results in 1.3x faster snippets and indexing with morphology=stem_en)
                                              • -
                                              • optimized snippets, 1.6x general speedup
                                              • -
                                              • optimized const-list parsing in SphinxQL
                                              • -
                                              • optimized full-document highlighting CPU/RAM use
                                              • -
                                              • optimized binlog replay (improved performance on K-list update)
                                              • -
                                              -

                                              Bug fixes

                                              • fixed #767, joined fields vs ODBC sources
                                              • -
                                              • fixed #757, wordforms shared by indexes with different settings
                                              • -
                                              • fixed #733, loading of indexes in formats prior to v.14
                                              • -
                                              • fixed #763, occasional snippets failures
                                              • -
                                              • fixed #648, occasionally missed rotations on multiple SIGHUPs
                                              • -
                                              • fixed #750, an RT segment merge leading to false positives and/or crashes in some cases
                                              • -
                                              • fixed #755, zones in snippets output
                                              • -
                                              • fixed #754, stopwords counting at snippet passage generation
                                              • -
                                              • fixed #723, fork/prefork index rotation in children processes
                                              • -
                                              • fixed #696, freeze on zero threshold in quorum operator
                                              • -
                                              • fixed #732, query escaping in SphinxSE
                                              • -
                                              • fixed #739, occasional crashes in MT mode on result set send
                                              • -
                                              • fixed #746, crash with a named list in SphinxQL option
                                              • -
                                              • fixed #674, AVG vs group order
                                              • -
                                              • fixed #734, occasional crashes attempting to report NULL errors
                                              • -
                                              • fixed #829, tail hits within field position modifier
                                              • -
                                              • fixed #712, missing query_mode, force_all_words snippet option defaults in Java API
                                              • -
                                              • fixed #721, added dupe removal on RT batch INSERT/REPLACE
                                              • -
                                              • fixed #720, potential extraneous highlighting after a blended keyword
                                              • -
                                              • fixed #702, exceptions vs star search
                                              • -
                                              • fixed #666, ext2 query grouping vs exceptions
                                              • -
                                              • fixed #688, WITHIN GROUP ORDER BY related crash
                                              • -
                                              • fixed #660, multi-queue batches vs dist_threads
                                              • -
                                              • fixed #678, crash on dict=keywords vs xmlpipe vs min_prefix_len
                                              • -
                                              • fixed #596, ECHILD vs scripted configs
                                              • -
                                              • fixed #653, dependency in expression, sorting, grouping
                                              • -
                                              • fixed #661, concurrent distributed searches vs workers=threads
                                              • -
                                              • fixed #646, crash on status query via UNIX socket
                                              • -
                                              • fixed #589, libexpat.dll missing from some Win32 build types
                                              • -
                                              • fixed #574, quorum match order
                                              • -
                                              • fixed multiple documentation issues (#372, #483, #495, #601, #623, #632, #654)
                                              • -
                                              • fixed that ondisk_dict did not affect RT indexes
                                              • -
                                              • fixed that string attributes check in indextool --check was erroneously sensitive to string data order
                                              • -
                                              • fixed a rare crash when using BEFORE operator
                                              • -
                                              • fixed an issue with multiforms vs BuildKeywords()
                                              • -
                                              • fixed an edge case in OR operator (emitted wrong hits order sometimes)
                                              • -
                                              • fixed aliasing in docinfo accessors that lead to very rare crashes and/or missing results
                                              • -
                                              • fixed a syntax error on a short token at the end of a query
                                              • -
                                              • fixed id64 filtering and performance degradation with range filters
                                              • -
                                              • fixed missing rankers in libsphinxclient
                                              • -
                                              • fixed missing SPH04 ranker in SphinxSE
                                              • -
                                              • fixed column names in sql_attr_multi sample (works with example.sql now)
                                              • -
                                              • fixed an issue with distributed local+remote setup vs aggregate functions
                                              • -
                                              • fixed case sensitive columns names in RT indexes
                                              • -
                                              • fixed a crash vs strings from multiple indexes in result set
                                              • -
                                              • fixed blended keywords vs snippets
                                              • -
                                              • fixed secure_connection vs MySQL protocol vs MySQL.NET connector
                                              • -
                                              • fixed that Python API did not works with Python 2.3
                                              • -
                                              • fixed overshort_step vs snippets
                                              • -
                                              • fixed keyword staistics vs dist_threads searching
                                              • -
                                              • fixed multiforms vs query parsing (vs quorum)
                                              • -
                                              • fixed missed quorum words vs RT segments
                                              • -
                                              • fixed blended keywords occasionally skipping extra character when querying (eg "abc[]")
                                              • -
                                              • fixed Python API to handle int32 values
                                              • -
                                              • fixed prefix and infix indexing of joined fields
                                              • -
                                              • fixed MVA ranged query
                                              • -
                                              • fixed missing blended state reset on document boundary
                                              • -
                                              • fixed a crash on missing index while replaying binlog
                                              • -
                                              • fixed an error message on filter values overrun
                                              • -
                                              • fixed passage duplication in snippets in weight_order mode
                                              • -
                                              • fixed select clauses over 1K vs remote agents
                                              • -
                                              • fixed overshort accounting vs soft-whitespace tokens
                                              • -
                                              • fixed rotation vs workers=threads
                                              • -
                                              • fixed schema issues vs distributed indexes
                                              • -
                                              • fixed blended-escaped sequence parsing issue
                                              • -
                                              • fixed MySQL IN clause (values order etc)
                                              • -
                                              • fixed that post_index did not execute when 0 documents were succesfully indexed
                                              • -
                                              • fixed field position limit vs many hits
                                              • -
                                              • fixed that joined fields missed an end marker at field end
                                              • -
                                              • fixed that xxx_step settings were missing from .sph index header
                                              • -
                                              • fixed libsphinxclient missing request cleanup in sphinx_query() (eg after network errors)
                                              • -
                                              • fixed that index_weights were ignored when grouping
                                              • -
                                              • fixed multi wordforms vs blend_chars
                                              • -
                                              • fixed broken MVA output in SphinxQL
                                              • -
                                              • fixed a few RT leaks
                                              • -
                                              • fixed an issue with RT string storage going missing
                                              • -
                                              • fixed an issue with repeated queries vs dist_threads
                                              • -
                                              • fixed an issue with string attributes vs buffer overrun in SphinxQL
                                              • -
                                              • fixed unexpected character data warnings within ignored xmlpipe tags
                                              • -
                                              • fixed a crash in snippets with NEAR syntax query
                                              • -
                                              • fixed passage duplication in snippets
                                              • -
                                              • fixed libsphinxclient SIGPIPE handling
                                              • -
                                              • fixed libsphinxclient vs VS2003 compiler bug
                                              • +

                                                A.4. Version 2.0.1-beta, 22 apr 2011

                                                +

                                                New general features

                                                +

                                                New SphinxQL features

                                                +

                                                New command-line switches

                                                • added --print-queries switch to indexer that dumps SQL queries it runs

                                                • +
                                                • added --sighup-each switch to indexer that rotates indexes one by one

                                                • +
                                                • added --strip-path switch to searchd that skips file paths embedded in the index(-es)

                                                • +
                                                • added --dumpconfig switch to indextool that dumps an index header in sphinx.conf format

                                                • +
                                                +

                                                Major changes and optimizations

                                                • changed default preopen_indexes value to 1

                                                • +
                                                • optimized English stemmer (results in 1.3x faster snippets and indexing with morphology=stem_en)

                                                • +
                                                • optimized snippets, 1.6x general speedup

                                                • +
                                                • optimized const-list parsing in SphinxQL

                                                • +
                                                • optimized full-document highlighting CPU/RAM use

                                                • +
                                                • optimized binlog replay (improved performance on K-list update)

                                                • +
                                                +

                                                Bug fixes

                                                • fixed #767, joined fields vs ODBC sources

                                                • +
                                                • fixed #757, wordforms shared by indexes with different settings

                                                • +
                                                • fixed #733, loading of indexes in formats prior to v.14

                                                • +
                                                • fixed #763, occasional snippets failures

                                                • +
                                                • fixed #648, occasionally missed rotations on multiple SIGHUPs

                                                • +
                                                • fixed #750, an RT segment merge leading to false positives and/or crashes in some cases

                                                • +
                                                • fixed #755, zones in snippets output

                                                • +
                                                • fixed #754, stopwords counting at snippet passage generation

                                                • +
                                                • fixed #723, fork/prefork index rotation in children processes

                                                • +
                                                • fixed #696, freeze on zero threshold in quorum operator

                                                • +
                                                • fixed #732, query escaping in SphinxSE

                                                • +
                                                • fixed #739, occasional crashes in MT mode on result set send

                                                • +
                                                • fixed #746, crash with a named list in SphinxQL option

                                                • +
                                                • fixed #674, AVG vs group order

                                                • +
                                                • fixed #734, occasional crashes attempting to report NULL errors

                                                • +
                                                • fixed #829, tail hits within field position modifier

                                                • +
                                                • fixed #712, missing query_mode, force_all_words snippet option defaults in Java API

                                                • +
                                                • fixed #721, added dupe removal on RT batch INSERT/REPLACE

                                                • +
                                                • fixed #720, potential extraneous highlighting after a blended keyword

                                                • +
                                                • fixed #702, exceptions vs star search

                                                • +
                                                • fixed #666, ext2 query grouping vs exceptions

                                                • +
                                                • fixed #688, WITHIN GROUP ORDER BY related crash

                                                • +
                                                • fixed #660, multi-queue batches vs dist_threads

                                                • +
                                                • fixed #678, crash on dict=keywords vs xmlpipe vs min_prefix_len

                                                • +
                                                • fixed #596, ECHILD vs scripted configs

                                                • +
                                                • fixed #653, dependency in expression, sorting, grouping

                                                • +
                                                • fixed #661, concurrent distributed searches vs workers=threads

                                                • +
                                                • fixed #646, crash on status query via UNIX socket

                                                • +
                                                • fixed #589, libexpat.dll missing from some Win32 build types

                                                • +
                                                • fixed #574, quorum match order

                                                • +
                                                • fixed multiple documentation issues (#372, #483, #495, #601, #623, #632, #654)

                                                • +
                                                • fixed that ondisk_dict did not affect RT indexes

                                                • +
                                                • fixed that string attributes check in indextool --check was erroneously sensitive to string data order

                                                • +
                                                • fixed a rare crash when using BEFORE operator

                                                • +
                                                • fixed an issue with multiforms vs BuildKeywords()

                                                • +
                                                • fixed an edge case in OR operator (emitted wrong hits order sometimes)

                                                • +
                                                • fixed aliasing in docinfo accessors that lead to very rare crashes and/or missing results

                                                • +
                                                • fixed a syntax error on a short token at the end of a query

                                                • +
                                                • fixed id64 filtering and performance degradation with range filters

                                                • +
                                                • fixed missing rankers in libsphinxclient

                                                • +
                                                • fixed missing SPH04 ranker in SphinxSE

                                                • +
                                                • fixed column names in sql_attr_multi sample (works with example.sql now)

                                                • +
                                                • fixed an issue with distributed local+remote setup vs aggregate functions

                                                • +
                                                • fixed case sensitive columns names in RT indexes

                                                • +
                                                • fixed a crash vs strings from multiple indexes in result set

                                                • +
                                                • fixed blended keywords vs snippets

                                                • +
                                                • fixed secure_connection vs MySQL protocol vs MySQL.NET connector

                                                • +
                                                • fixed that Python API did not works with Python 2.3

                                                • +
                                                • fixed overshort_step vs snippets

                                                • +
                                                • fixed keyword staistics vs dist_threads searching

                                                • +
                                                • fixed multiforms vs query parsing (vs quorum)

                                                • +
                                                • fixed missed quorum words vs RT segments

                                                • +
                                                • fixed blended keywords occasionally skipping extra character when querying (eg "abc[]")

                                                • +
                                                • fixed Python API to handle int32 values

                                                • +
                                                • fixed prefix and infix indexing of joined fields

                                                • +
                                                • fixed MVA ranged query

                                                • +
                                                • fixed missing blended state reset on document boundary

                                                • +
                                                • fixed a crash on missing index while replaying binlog

                                                • +
                                                • fixed an error message on filter values overrun

                                                • +
                                                • fixed passage duplication in snippets in weight_order mode

                                                • +
                                                • fixed select clauses over 1K vs remote agents

                                                • +
                                                • fixed overshort accounting vs soft-whitespace tokens

                                                • +
                                                • fixed rotation vs workers=threads

                                                • +
                                                • fixed schema issues vs distributed indexes

                                                • +
                                                • fixed blended-escaped sequence parsing issue

                                                • +
                                                • fixed MySQL IN clause (values order etc)

                                                • +
                                                • fixed that post_index did not execute when 0 documents were succesfully indexed

                                                • +
                                                • fixed field position limit vs many hits

                                                • +
                                                • fixed that joined fields missed an end marker at field end

                                                • +
                                                • fixed that xxx_step settings were missing from .sph index header

                                                • +
                                                • fixed libsphinxclient missing request cleanup in sphinx_query() (eg after network errors)

                                                • +
                                                • fixed that index_weights were ignored when grouping

                                                • +
                                                • fixed multi wordforms vs blend_chars

                                                • +
                                                • fixed broken MVA output in SphinxQL

                                                • +
                                                • fixed a few RT leaks

                                                • +
                                                • fixed an issue with RT string storage going missing

                                                • +
                                                • fixed an issue with repeated queries vs dist_threads

                                                • +
                                                • fixed an issue with string attributes vs buffer overrun in SphinxQL

                                                • +
                                                • fixed unexpected character data warnings within ignored xmlpipe tags

                                                • +
                                                • fixed a crash in snippets with NEAR syntax query

                                                • +
                                                • fixed passage duplication in snippets

                                                • +
                                                • fixed libsphinxclient SIGPIPE handling

                                                • +
                                                • fixed libsphinxclient vs VS2003 compiler bug

                                                -

                                                A.3. Version 1.10-beta, 19 jul 2010

                                                -
                                                • added RT indexes support (Chapter 4, Real-time indexes)
                                                • -
                                                • added prefork and threads support (workers directives)
                                                • -
                                                • added multi-threaded local searches in distributed indexes (dist_threads directive)
                                                • -
                                                • added common subquery cache (subtree_docs_cache, - subtree_hits_cache directives)
                                                • -
                                                • added string attributes support (sql_attr_string, - sql_field_string, - xml_attr_string, - xml_field_string directives)
                                                • -
                                                • added indexing-time word counter (sql_attr_str2wordcount, - sql_field_str2wordcount directives)
                                                • -
                                                • added CALL SNIPPETS(), - CALL KEYWORDS() SphinxQL statements
                                                • -
                                                • added field_weights, index_weights options to - SphinxQL SELECT statement
                                                • -
                                                • added insert-only SphinxQL-talking tables to SphinxSE (connection='sphinxql://host[:port]/index')
                                                • -
                                                • added select option to SphinxSE queries
                                                • -
                                                • added backtrace on crash to searchd
                                                • -
                                                • added SQL+FS indexing, aka loading files by names fetched from SQL - (sql_file_field directive)
                                                • -
                                                • added a watchdog in threads mode to searchd
                                                • -
                                                • added automatic row phantoms elimination to index merge
                                                • -
                                                • added hitless indexing support (hitless_words directive)
                                                • -
                                                • added --check, --strip-path, --htmlstrip, --dumphitlist ... --wordid switches to indextool
                                                • -
                                                • added --stopwait, --logdebug switches to searchd
                                                • -
                                                • added --dump-rows, --verbose switches to indexer
                                                • -
                                                • added "blended" characters indexing support (blend_chars directive)
                                                • -
                                                • added joined/payload field indexing (sql_joined_field directive)
                                                • -
                                                • added FlushAttributes() API call
                                                • -
                                                • added query_mode, force_all_words, limit_passages, limit_words, start_passage_id, load_files, html_strip_mode, +

                                                  A.5. Version 1.10-beta, 19 jul 2010

                                                  +
                                                  • added RT indexes support (Chapter 4, Real-time indexes)

                                                  • +
                                                  • added prefork and threads support (workers directives)

                                                  • +
                                                  • added multi-threaded local searches in distributed indexes (dist_threads directive)

                                                  • +
                                                  • added common subquery cache (subtree_docs_cache, + subtree_hits_cache directives)

                                                  • +
                                                  • added string attributes support (sql_attr_string, + sql_field_string, + xml_attr_string, + xml_field_string directives)

                                                  • +
                                                  • added indexing-time word counter (sql_attr_str2wordcount, + sql_field_str2wordcount directives)

                                                  • +
                                                  • added CALL SNIPPETS(), + CALL KEYWORDS() SphinxQL statements

                                                  • +
                                                  • added field_weights, index_weights options to + SphinxQL SELECT statement

                                                  • +
                                                  • added insert-only SphinxQL-talking tables to SphinxSE (connection='sphinxql://host[:port]/index')

                                                  • +
                                                  • added select option to SphinxSE queries

                                                  • +
                                                  • added backtrace on crash to searchd

                                                  • +
                                                  • added SQL+FS indexing, aka loading files by names fetched from SQL + (sql_file_field directive)

                                                  • +
                                                  • added a watchdog in threads mode to searchd

                                                  • +
                                                  • added automatic row phantoms elimination to index merge

                                                  • +
                                                  • added hitless indexing support (hitless_words directive)

                                                  • +
                                                  • added --check, --strip-path, --htmlstrip, --dumphitlist ... --wordid switches to indextool

                                                  • +
                                                  • added --stopwait, --logdebug switches to searchd

                                                  • +
                                                  • added --dump-rows, --verbose switches to indexer

                                                  • +
                                                  • added "blended" characters indexing support (blend_chars directive)

                                                  • +
                                                  • added joined/payload field indexing (sql_joined_field directive)

                                                  • +
                                                  • added FlushAttributes() API call

                                                  • +
                                                  • added query_mode, force_all_words, limit_passages, limit_words, start_passage_id, load_files, html_strip_mode, allow_empty options, and %PASSAGE_ID% macro in before_match, after_match options - to BuildExcerpts() API call

                                                  • -
                                                  • added @groupby/@count/@distinct columns support to SELECT (but not to expressions)
                                                  • -
                                                  • added query-time keyword expansion support (expand_keywords directive, - SPH_RANK_SPH04 ranker)
                                                  • -
                                                  • added query batch size limit option (max_batch_queries directive; was hardcoded)
                                                  • -
                                                  • added SINT() function to expressions
                                                  • -
                                                  • improved SphinxQL syntax error reporting
                                                  • -
                                                  • improved expression optimizer (better constant handling)
                                                  • -
                                                  • improved dash handling within keywords (no longer treated as an operator)
                                                  • -
                                                  • improved snippets (better passage selection/trimming, around option now a hard limit)
                                                  • -
                                                  • optimized index format that yields ~20-30% smaller indexes
                                                  • -
                                                  • optimized sorting code (indexing time 1-5% faster on average; 100x faster in worst case)
                                                  • -
                                                  • optimized searchd startup time (moved .spa preindexing to indexer), added a progress bar
                                                  • -
                                                  • optimized queries against indexes with many attributes (eliminated redundant copying)
                                                  • -
                                                  • optimized 1-keyword queries (performace regression introduced in 0.9.9)
                                                  • -
                                                  • optimized SphinxQL protocol overheads, and performance on bigger result sets
                                                  • -
                                                  • optimized unbuffered attributes writes on index merge
                                                  • -
                                                  • changed attribute handling, duplicate names are strictly forbidden now
                                                  • -
                                                  • fixed that SphinxQL sessions could stall shutdown
                                                  • -
                                                  • fixed consts with leading minus in SphinxQL
                                                  • -
                                                  • fixed AND/OR precedence in expressions
                                                  • -
                                                  • fixed #334, AVG() on integers was not computed in floats
                                                  • -
                                                  • fixed #371, attribute flush vs 2+ GB files
                                                  • -
                                                  • fixed #373, segfault on distributed queries vs certain libc versions
                                                  • -
                                                  • fixed #398, stopwords not stopped in prefix/infix indexes
                                                  • -
                                                  • fixed #404, erroneous MVA failures in indextool --check
                                                  • -
                                                  • fixed #408, segfault on certain query batches (regular scan, plus a scan with MVA groupby)
                                                  • -
                                                  • fixed #431, occasional shutdown hangs in preforked workers
                                                  • -
                                                  • fixed #436, trunk checkout builds vs Solaris sh
                                                  • -
                                                  • fixed #440, escaping vs parentheses declared as valid in charset_table
                                                  • -
                                                  • fixed #442, occasional non-aligned free in MVA indexing
                                                  • -
                                                  • fixed #447, occasional crashes in MVA indexing
                                                  • -
                                                  • fixed #449, pconn busyloop on aborted clients on certain arches
                                                  • -
                                                  • fixed #465, build issue on Alpha
                                                  • -
                                                  • fixed #468, build issue in libsphinxclient
                                                  • -
                                                  • fixed #472, multiple stopword files failing to load
                                                  • -
                                                  • fixed #489, buffer overflow in query logging
                                                  • -
                                                  • fixed #493, Python API assertion after error returned from Query()
                                                  • -
                                                  • fixed #500, malformed MySQL packet when sending MVAs
                                                  • -
                                                  • fixed #504, SIGPIPE in libsphinxclient
                                                  • -
                                                  • fixed #506, better MySQL protocol commands support in SphinxQL (PING etc)
                                                  • -
                                                  • fixed #509, indexing ranged results from stored procedures
                                                  • + to BuildExcerpts() API call

                                                    +
                                                  • added @groupby/@count/@distinct columns support to SELECT (but not to expressions)

                                                  • +
                                                  • added query-time keyword expansion support (expand_keywords directive, + SPH_RANK_SPH04 ranker)

                                                  • +
                                                  • added query batch size limit option (max_batch_queries directive; was hardcoded)

                                                  • +
                                                  • added SINT() function to expressions

                                                  • +
                                                  • improved SphinxQL syntax error reporting

                                                  • +
                                                  • improved expression optimizer (better constant handling)

                                                  • +
                                                  • improved dash handling within keywords (no longer treated as an operator)

                                                  • +
                                                  • improved snippets (better passage selection/trimming, around option now a hard limit)

                                                  • +
                                                  • optimized index format that yields ~20-30% smaller indexes

                                                  • +
                                                  • optimized sorting code (indexing time 1-5% faster on average; 100x faster in worst case)

                                                  • +
                                                  • optimized searchd startup time (moved .spa preindexing to indexer), added a progress bar

                                                  • +
                                                  • optimized queries against indexes with many attributes (eliminated redundant copying)

                                                  • +
                                                  • optimized 1-keyword queries (performace regression introduced in 0.9.9)

                                                  • +
                                                  • optimized SphinxQL protocol overheads, and performance on bigger result sets

                                                  • +
                                                  • optimized unbuffered attributes writes on index merge

                                                  • +
                                                  • changed attribute handling, duplicate names are strictly forbidden now

                                                  • +
                                                  • fixed that SphinxQL sessions could stall shutdown

                                                  • +
                                                  • fixed consts with leading minus in SphinxQL

                                                  • +
                                                  • fixed AND/OR precedence in expressions

                                                  • +
                                                  • fixed #334, AVG() on integers was not computed in floats

                                                  • +
                                                  • fixed #371, attribute flush vs 2+ GB files

                                                  • +
                                                  • fixed #373, segfault on distributed queries vs certain libc versions

                                                  • +
                                                  • fixed #398, stopwords not stopped in prefix/infix indexes

                                                  • +
                                                  • fixed #404, erroneous MVA failures in indextool --check

                                                  • +
                                                  • fixed #408, segfault on certain query batches (regular scan, plus a scan with MVA groupby)

                                                  • +
                                                  • fixed #431, occasional shutdown hangs in preforked workers

                                                  • +
                                                  • fixed #436, trunk checkout builds vs Solaris sh

                                                  • +
                                                  • fixed #440, escaping vs parentheses declared as valid in charset_table

                                                  • +
                                                  • fixed #442, occasional non-aligned free in MVA indexing

                                                  • +
                                                  • fixed #447, occasional crashes in MVA indexing

                                                  • +
                                                  • fixed #449, pconn busyloop on aborted clients on certain arches

                                                  • +
                                                  • fixed #465, build issue on Alpha

                                                  • +
                                                  • fixed #468, build issue in libsphinxclient

                                                  • +
                                                  • fixed #472, multiple stopword files failing to load

                                                  • +
                                                  • fixed #489, buffer overflow in query logging

                                                  • +
                                                  • fixed #493, Python API assertion after error returned from Query()

                                                  • +
                                                  • fixed #500, malformed MySQL packet when sending MVAs

                                                  • +
                                                  • fixed #504, SIGPIPE in libsphinxclient

                                                  • +
                                                  • fixed #506, better MySQL protocol commands support in SphinxQL (PING etc)

                                                  • +
                                                  • fixed #509, indexing ranged results from stored procedures

                                                  -

                                                  A.4. Version 0.9.9-release, 02 dec 2009

                                                  -
                                                  • added Open, Close, Status calls to libsphinxclient (C API)
                                                  • -
                                                  • added automatic persistent connection reopening to PHP, Python APIs
                                                  • -
                                                  • added 64-bit value/range filters, fullscan mode support to SphinxSE
                                                  • -
                                                  • MAJOR CHANGE, our IANA assigned ports are 9312 and 9306 respectively (goodbye, trusty 3312)
                                                  • -
                                                  • MAJOR CHANGE, erroneous filters now fail with an error (were silently ignored before)
                                                  • -
                                                  • optimized unbuffered .spa writes on merge
                                                  • -
                                                  • optimized 1-keyword queries ranking in extended2 mode
                                                  • -
                                                  • fixed #441 (IO race in case of highly conccurent load on a preopened)
                                                  • -
                                                  • fixed #434 (distrubuted indexes were not searchable via MySQL protocol)
                                                  • -
                                                  • fixed #317 (indexer MVA progress counter)
                                                  • -
                                                  • fixed #398 (stopwords not removed from search query)
                                                  • -
                                                  • fixed #328 (broken cutoff)
                                                  • -
                                                  • fixed #250 (now quoting paths w/spaces when installing Windows service)
                                                  • -
                                                  • fixed #348 (K-list was not updated on merge)
                                                  • -
                                                  • fixed #357 (destination index were not K-list-filtered on merge)
                                                  • -
                                                  • fixed #369 (precaching .spi files over 2 GBs)
                                                  • -
                                                  • fixed #438 (missing boundary proximity matches)
                                                  • -
                                                  • fixed #371 (.spa flush in case of files over 2 GBs)
                                                  • -
                                                  • fixed #373 (crashes on distributed queries via mysql proto)
                                                  • -
                                                  • fixed critical bugs in hit merging code
                                                  • -
                                                  • fixed #424 (ordinals could be misplaced during indexing in case of bitfields etc)
                                                  • -
                                                  • fixed #426 (failing SE build on Solaris; thanks to Ben Beecher)
                                                  • -
                                                  • fixed #423 (typo in SE caused crash on SHOW STATUS)
                                                  • -
                                                  • fixed #363 (handling of read_timeout over 2147 seconds)
                                                  • -
                                                  • fixed #376 (minor error message mismatch)
                                                  • -
                                                  • fixed #413 (minus in SphinxQL)
                                                  • -
                                                  • fixed #417 (floats w/o leading digit in SphinxQL)
                                                  • -
                                                  • fixed #403 (typo in SetFieldWeights name in Java API)
                                                  • -
                                                  • fixed index rotation vs persistent connections
                                                  • -
                                                  • fixed backslash handling in SphinxQL parser
                                                  • -
                                                  • fixed uint unpacking vs. PHP 5.2.9 (possibly other versions)
                                                  • -
                                                  • fixed #325 (filter settings send from SphinxSE)
                                                  • -
                                                  • fixed #352 (removed mysql wrapper around close() in SphinxSE)
                                                  • -
                                                  • fixed #389 (display error messages through SphinxSE status variable)
                                                  • -
                                                  • fixed linking with port-installed iconv on OS X
                                                  • -
                                                  • fixed negative 64-bit unpacking in PHP API
                                                  • -
                                                  • fixed #349 (escaping backslash in query emulation mode)
                                                  • -
                                                  • fixed #320 (disabled multi-query route when select items differ)
                                                  • -
                                                  • fixed #353 (better quorum counts check)
                                                  • -
                                                  • fixed #341 (merging of trailing hits; maybe other ranking issues too)
                                                  • -
                                                  • fixed #368 (partially; @field "" caused crashes; now resets field limit)
                                                  • -
                                                  • fixed #365 (field mask was leaking on field-limited terms)
                                                  • -
                                                  • fixed #339 (updated debug query dumper)
                                                  • -
                                                  • fixed #361 (added SetConnectTimeout() to Java API)
                                                  • -
                                                  • fixed #338 (added missing fullscan to mode check in Java API)
                                                  • -
                                                  • fixed #323 (added floats support to SphinxQL)
                                                  • -
                                                  • fixed #340 (support listen=port:proto syntax too)
                                                  • -
                                                  • fixed #332 (\r is legal SphinxQL space now)
                                                  • -
                                                  • fixed xmlpipe2 K-lists
                                                  • -
                                                  • fixed #322 (safety gaps in mysql protocol row buffer)
                                                  • -
                                                  • fixed #313 (return keyword stats for empty indexes too)
                                                  • -
                                                  • fixed #344 (invalid checkpoints after merge)
                                                  • -
                                                  • fixed #326 (missing CLOCK_xxx on FreeBSD)
                                                  • +

                                                    A.6. Version 0.9.9-release, 02 dec 2009

                                                    +
                                                    • added Open, Close, Status calls to libsphinxclient (C API)

                                                    • +
                                                    • added automatic persistent connection reopening to PHP, Python APIs

                                                    • +
                                                    • added 64-bit value/range filters, fullscan mode support to SphinxSE

                                                    • +
                                                    • MAJOR CHANGE, our IANA assigned ports are 9312 and 9306 respectively (goodbye, trusty 3312)

                                                    • +
                                                    • MAJOR CHANGE, erroneous filters now fail with an error (were silently ignored before)

                                                    • +
                                                    • optimized unbuffered .spa writes on merge

                                                    • +
                                                    • optimized 1-keyword queries ranking in extended2 mode

                                                    • +
                                                    • fixed #441 (IO race in case of highly conccurent load on a preopened)

                                                    • +
                                                    • fixed #434 (distrubuted indexes were not searchable via MySQL protocol)

                                                    • +
                                                    • fixed #317 (indexer MVA progress counter)

                                                    • +
                                                    • fixed #398 (stopwords not removed from search query)

                                                    • +
                                                    • fixed #328 (broken cutoff)

                                                    • +
                                                    • fixed #250 (now quoting paths w/spaces when installing Windows service)

                                                    • +
                                                    • fixed #348 (K-list was not updated on merge)

                                                    • +
                                                    • fixed #357 (destination index were not K-list-filtered on merge)

                                                    • +
                                                    • fixed #369 (precaching .spi files over 2 GBs)

                                                    • +
                                                    • fixed #438 (missing boundary proximity matches)

                                                    • +
                                                    • fixed #371 (.spa flush in case of files over 2 GBs)

                                                    • +
                                                    • fixed #373 (crashes on distributed queries via mysql proto)

                                                    • +
                                                    • fixed critical bugs in hit merging code

                                                    • +
                                                    • fixed #424 (ordinals could be misplaced during indexing in case of bitfields etc)

                                                    • +
                                                    • fixed #426 (failing SE build on Solaris; thanks to Ben Beecher)

                                                    • +
                                                    • fixed #423 (typo in SE caused crash on SHOW STATUS)

                                                    • +
                                                    • fixed #363 (handling of read_timeout over 2147 seconds)

                                                    • +
                                                    • fixed #376 (minor error message mismatch)

                                                    • +
                                                    • fixed #413 (minus in SphinxQL)

                                                    • +
                                                    • fixed #417 (floats w/o leading digit in SphinxQL)

                                                    • +
                                                    • fixed #403 (typo in SetFieldWeights name in Java API)

                                                    • +
                                                    • fixed index rotation vs persistent connections

                                                    • +
                                                    • fixed backslash handling in SphinxQL parser

                                                    • +
                                                    • fixed uint unpacking vs. PHP 5.2.9 (possibly other versions)

                                                    • +
                                                    • fixed #325 (filter settings send from SphinxSE)

                                                    • +
                                                    • fixed #352 (removed mysql wrapper around close() in SphinxSE)

                                                    • +
                                                    • fixed #389 (display error messages through SphinxSE status variable)

                                                    • +
                                                    • fixed linking with port-installed iconv on OS X

                                                    • +
                                                    • fixed negative 64-bit unpacking in PHP API

                                                    • +
                                                    • fixed #349 (escaping backslash in query emulation mode)

                                                    • +
                                                    • fixed #320 (disabled multi-query route when select items differ)

                                                    • +
                                                    • fixed #353 (better quorum counts check)

                                                    • +
                                                    • fixed #341 (merging of trailing hits; maybe other ranking issues too)

                                                    • +
                                                    • fixed #368 (partially; @field "" caused crashes; now resets field limit)

                                                    • +
                                                    • fixed #365 (field mask was leaking on field-limited terms)

                                                    • +
                                                    • fixed #339 (updated debug query dumper)

                                                    • +
                                                    • fixed #361 (added SetConnectTimeout() to Java API)

                                                    • +
                                                    • fixed #338 (added missing fullscan to mode check in Java API)

                                                    • +
                                                    • fixed #323 (added floats support to SphinxQL)

                                                    • +
                                                    • fixed #340 (support listen=port:proto syntax too)

                                                    • +
                                                    • fixed #332 (\r is legal SphinxQL space now)

                                                    • +
                                                    • fixed xmlpipe2 K-lists

                                                    • +
                                                    • fixed #322 (safety gaps in mysql protocol row buffer)

                                                    • +
                                                    • fixed #313 (return keyword stats for empty indexes too)

                                                    • +
                                                    • fixed #344 (invalid checkpoints after merge)

                                                    • +
                                                    • fixed #326 (missing CLOCK_xxx on FreeBSD)

                                                    -

                                                    A.5. Version 0.9.9-rc2, 08 apr 2009

                                                    -
                                                    • added IsConnectError(), Open(), Close() calls to Java API (bug #240)
                                                    • -
                                                    • added read_buffer, read_unhinted directives
                                                    • -
                                                    • added checks for build options returned by mysql_config (builds on Solaris now)
                                                    • -
                                                    • added fixed-RAM index merge (bug #169)
                                                    • -
                                                    • added logging chained queries count in case of (optimized) multi-queries
                                                    • -
                                                    • added GEODIST() function
                                                    • -
                                                    • added --status switch to searchd
                                                    • -
                                                    • added MySpell (OpenOffice) affix file support (bug #281)
                                                    • -
                                                    • added ODBC support (both Windows and UnixODBC)
                                                    • -
                                                    • added support for @id in IN() (bug #292)
                                                    • -
                                                    • added support for aggregate functions in GROUP BY (namely AVG, MAX, MIN, SUM)
                                                    • -
                                                    • added MySQL UDF that builds snippets using searchd
                                                    • -
                                                    • added write_buffer directive (defaults to 1M)
                                                    • -
                                                    • added xmlpipe_fixup_utf8 directive
                                                    • -
                                                    • added suggestions sample
                                                    • -
                                                    • added microsecond precision int64 timer (bug #282)
                                                    • -
                                                    • added listen_backlog directive
                                                    • -
                                                    • added max_xmlpipe2_field directive
                                                    • -
                                                    • added initial SphinxQL support to mysql41 handler, SELECT .../SHOW WARNINGS/STATUS/META are handled
                                                    • -
                                                    • added support for different network protocols, and mysql41 protocol
                                                    • -
                                                    • added fieldmask ranker, updated SphinxSE list of rankers
                                                    • -
                                                    • added mysql_ssl_xxx directives
                                                    • -
                                                    • added --cpustats (requires clock_gettime()) and --status switches to searchd
                                                    • -
                                                    • added performance counters, Status() API call
                                                    • -
                                                    • added overshort_step and stopword_step directives
                                                    • -
                                                    • added strict order operator (aka operator before, eg. "one << two << three")
                                                    • -
                                                    • added indextool utility, moved --dumpheader there, added --debugdocids, --dumphitlist options
                                                    • -
                                                    • added own RNG, reseeded on @random sort query (bug #183)
                                                    • -
                                                    • added field-start and field-end modifiers support (syntax is "^hello world$"; field-end requires reindex)
                                                    • -
                                                    • added MVA attribute support to IN() function
                                                    • -
                                                    • added AND, OR, and NOT support to expressions
                                                    • -
                                                    • improved logging of (optimized) multi-queries (now logging chained query count)
                                                    • -
                                                    • improved handshake error handling, fixed protocol version byte order (omg)
                                                    • -
                                                    • updated SphinxSE to protocol 1.22
                                                    • -
                                                    • allowed phrase_boundary_step=-1 (trick to emulate keyword expansion)
                                                    • -
                                                    • removed SPH_MAX_QUERY_WORDS limit
                                                    • -
                                                    • fixed CLI search vs documents missing from DB (bug #257)
                                                    • -
                                                    • fixed libsphinxclient results leak on subsequent sphinx_run_queries call (bug #256)
                                                    • -
                                                    • fixed libsphinxclient handling of zero max_matches and cutoff (bug #208)
                                                    • -
                                                    • fixed Java API over-64K string reads (eg. big snippets) in Java API (bug #181)
                                                    • -
                                                    • fixed Java API 2nd Query() after network error in 1st Query() call (bug #308)
                                                    • -
                                                    • fixed typo-class bugs in SetFilterFloatRange (bug #259), SetSortMode (bug #248)
                                                    • -
                                                    • fixed missing @@relaxed support (bug #276), fixed missing error on @nosuchfield queries, documented @@relaxed
                                                    • -
                                                    • fixed UNIX socket permissions to 0777 (bug #288)
                                                    • -
                                                    • fixed xmlpipe2 crash on schemas with no fields, added better document structure checks
                                                    • -
                                                    • fixed (and optimized) expr parser vs IN() with huge (10K+) args count
                                                    • -
                                                    • fixed double EarlyCalc() in fullscan mode (minor performance impact)
                                                    • -
                                                    • fixed phrase boundary handling in some cases (on buffer end, on trailing whitespace)
                                                    • -
                                                    • fixes in snippets (aka excerpts) generation
                                                    • -
                                                    • fixed inline attrs vs id64 index corruption
                                                    • -
                                                    • fixed head searchd crash on config re-parse failure
                                                    • -
                                                    • fixed handling of numeric keywords with leading zeroes such as "007" (bug #251)
                                                    • -
                                                    • fixed junk in SphinxSE status variables (bug #304)
                                                    • -
                                                    • fixed wordlist checkpoints serialization (bug #236)
                                                    • -
                                                    • fixed unaligned docinfo id access (bug #230)
                                                    • -
                                                    • fixed GetRawBytes() vs oversized blocks (headers with over 32K charset_table should now work, bug #300)
                                                    • -
                                                    • fixed buffer overflow caused by too long dest wordform, updated tests
                                                    • -
                                                    • fixed IF() return type (was always int, is deduced now)
                                                    • -
                                                    • fixed legacy queries vs. special chars vs. multiple indexes
                                                    • -
                                                    • fixed write-write-read socket access pattern vs Nagle vs delays vs FreeBSD (oh wow)
                                                    • -
                                                    • fixed exceptions vs query-parser issue
                                                    • -
                                                    • fixed late calc vs @weight in expressions (bug #285)
                                                    • -
                                                    • fixed early lookup/calc vs filters (bug #284)
                                                    • -
                                                    • fixed emulated MATCH_ANY queries (empty proximity and phrase queries are allowed now)
                                                    • -
                                                    • fixed MATCH_ANY ranker vs fields with no matches
                                                    • -
                                                    • fixed index file size vs inplace_enable (bug #245)
                                                    • -
                                                    • fixed that old logs were not closed on USR1 (bug #221)
                                                    • -
                                                    • fixed handling of '!' alias to NOT operator (bug #237)
                                                    • -
                                                    • fixed error handling vs query steps (step failure was not reported)
                                                    • -
                                                    • fixed querying vs inline attributes
                                                    • -
                                                    • fixed stupid bug in escaping code, fixed EscapeString() and made it static
                                                    • -
                                                    • fixed parser vs @field -keyword, foo|@field bar, "" queries (bug #310)
                                                    • +

                                                      A.7. Version 0.9.9-rc2, 08 apr 2009

                                                      +
                                                      • added IsConnectError(), Open(), Close() calls to Java API (bug #240)

                                                      • +
                                                      • added read_buffer, read_unhinted directives

                                                      • +
                                                      • added checks for build options returned by mysql_config (builds on Solaris now)

                                                      • +
                                                      • added fixed-RAM index merge (bug #169)

                                                      • +
                                                      • added logging chained queries count in case of (optimized) multi-queries

                                                      • +
                                                      • added GEODIST() function

                                                      • +
                                                      • added --status switch to searchd

                                                      • +
                                                      • added MySpell (OpenOffice) affix file support (bug #281)

                                                      • +
                                                      • added ODBC support (both Windows and UnixODBC)

                                                      • +
                                                      • added support for @id in IN() (bug #292)

                                                      • +
                                                      • added support for aggregate functions in GROUP BY (namely AVG, MAX, MIN, SUM)

                                                      • +
                                                      • added MySQL UDF that builds snippets using searchd

                                                      • +
                                                      • added write_buffer directive (defaults to 1M)

                                                      • +
                                                      • added xmlpipe_fixup_utf8 directive

                                                      • +
                                                      • added suggestions sample

                                                      • +
                                                      • added microsecond precision int64 timer (bug #282)

                                                      • +
                                                      • added listen_backlog directive

                                                      • +
                                                      • added max_xmlpipe2_field directive

                                                      • +
                                                      • added initial SphinxQL support to mysql41 handler, SELECT .../SHOW WARNINGS/STATUS/META are handled

                                                      • +
                                                      • added support for different network protocols, and mysql41 protocol

                                                      • +
                                                      • added fieldmask ranker, updated SphinxSE list of rankers

                                                      • +
                                                      • added mysql_ssl_xxx directives

                                                      • +
                                                      • added --cpustats (requires clock_gettime()) and --status switches to searchd

                                                      • +
                                                      • added performance counters, Status() API call

                                                      • +
                                                      • added overshort_step and stopword_step directives

                                                      • +
                                                      • added strict order operator (aka operator before, eg. "one << two << three")

                                                      • +
                                                      • added indextool utility, moved --dumpheader there, added --debugdocids, --dumphitlist options

                                                      • +
                                                      • added own RNG, reseeded on @random sort query (bug #183)

                                                      • +
                                                      • added field-start and field-end modifiers support (syntax is "^hello world$"; field-end requires reindex)

                                                      • +
                                                      • added MVA attribute support to IN() function

                                                      • +
                                                      • added AND, OR, and NOT support to expressions

                                                      • +
                                                      • improved logging of (optimized) multi-queries (now logging chained query count)

                                                      • +
                                                      • improved handshake error handling, fixed protocol version byte order (omg)

                                                      • +
                                                      • updated SphinxSE to protocol 1.22

                                                      • +
                                                      • allowed phrase_boundary_step=-1 (trick to emulate keyword expansion)

                                                      • +
                                                      • removed SPH_MAX_QUERY_WORDS limit

                                                      • +
                                                      • fixed CLI search vs documents missing from DB (bug #257)

                                                      • +
                                                      • fixed libsphinxclient results leak on subsequent sphinx_run_queries call (bug #256)

                                                      • +
                                                      • fixed libsphinxclient handling of zero max_matches and cutoff (bug #208)

                                                      • +
                                                      • fixed Java API over-64K string reads (eg. big snippets) in Java API (bug #181)

                                                      • +
                                                      • fixed Java API 2nd Query() after network error in 1st Query() call (bug #308)

                                                      • +
                                                      • fixed typo-class bugs in SetFilterFloatRange (bug #259), SetSortMode (bug #248)

                                                      • +
                                                      • fixed missing @@relaxed support (bug #276), fixed missing error on @nosuchfield queries, documented @@relaxed

                                                      • +
                                                      • fixed UNIX socket permissions to 0777 (bug #288)

                                                      • +
                                                      • fixed xmlpipe2 crash on schemas with no fields, added better document structure checks

                                                      • +
                                                      • fixed (and optimized) expr parser vs IN() with huge (10K+) args count

                                                      • +
                                                      • fixed double EarlyCalc() in fullscan mode (minor performance impact)

                                                      • +
                                                      • fixed phrase boundary handling in some cases (on buffer end, on trailing whitespace)

                                                      • +
                                                      • fixes in snippets (aka excerpts) generation

                                                      • +
                                                      • fixed inline attrs vs id64 index corruption

                                                      • +
                                                      • fixed head searchd crash on config re-parse failure

                                                      • +
                                                      • fixed handling of numeric keywords with leading zeroes such as "007" (bug #251)

                                                      • +
                                                      • fixed junk in SphinxSE status variables (bug #304)

                                                      • +
                                                      • fixed wordlist checkpoints serialization (bug #236)

                                                      • +
                                                      • fixed unaligned docinfo id access (bug #230)

                                                      • +
                                                      • fixed GetRawBytes() vs oversized blocks (headers with over 32K charset_table should now work, bug #300)

                                                      • +
                                                      • fixed buffer overflow caused by too long dest wordform, updated tests

                                                      • +
                                                      • fixed IF() return type (was always int, is deduced now)

                                                      • +
                                                      • fixed legacy queries vs. special chars vs. multiple indexes

                                                      • +
                                                      • fixed write-write-read socket access pattern vs Nagle vs delays vs FreeBSD (oh wow)

                                                      • +
                                                      • fixed exceptions vs query-parser issue

                                                      • +
                                                      • fixed late calc vs @weight in expressions (bug #285)

                                                      • +
                                                      • fixed early lookup/calc vs filters (bug #284)

                                                      • +
                                                      • fixed emulated MATCH_ANY queries (empty proximity and phrase queries are allowed now)

                                                      • +
                                                      • fixed MATCH_ANY ranker vs fields with no matches

                                                      • +
                                                      • fixed index file size vs inplace_enable (bug #245)

                                                      • +
                                                      • fixed that old logs were not closed on USR1 (bug #221)

                                                      • +
                                                      • fixed handling of '!' alias to NOT operator (bug #237)

                                                      • +
                                                      • fixed error handling vs query steps (step failure was not reported)

                                                      • +
                                                      • fixed querying vs inline attributes

                                                      • +
                                                      • fixed stupid bug in escaping code, fixed EscapeString() and made it static

                                                      • +
                                                      • fixed parser vs @field -keyword, foo|@field bar, "" queries (bug #310)

                                                      -

                                                      A.6. Version 0.9.9-rc1, 17 nov 2008

                                                      -
                                                      • added min_stemming_len directive
                                                      • -
                                                      • added IsConnectError() API call (helps distingusih API vs remote errors)
                                                      • -
                                                      • added duplicate log messages filter to searchd
                                                      • -
                                                      • added --nodetach debugging switch to searchd
                                                      • -
                                                      • added blackhole agents support for debugging/testing (agent_blackhole directive)
                                                      • -
                                                      • added max_filters, max_filter_values directives (were hardcoded before)
                                                      • -
                                                      • added int64 expression evaluation path, automatic inference, and BIGINT() enforcer function
                                                      • -
                                                      • added crash handler for debugging (crash_log_path directive)
                                                      • -
                                                      • added MS SQL (aka SQL Server) source support (Windows only, mssql_winauth and mssql_unicode directives)
                                                      • -
                                                      • added indexer-side column unpacking feature (unpack_zlib, unpack_mysqlcompress directives)
                                                      • -
                                                      • added nested brackers and NOTs support to query language, rewritten query parser
                                                      • -
                                                      • added persistent connections support (Open() and Close() API calls)
                                                      • -
                                                      • added index_exact_words feature, and exact form operator to query language ("hello =world")
                                                      • -
                                                      • added status variables support to SphinxSE (SHOW STATUS LIKE 'sphinx_%')
                                                      • -
                                                      • added max_packet_size directive (was hardcoded at 8M before)
                                                      • -
                                                      • added UNIX socket support, and multi-interface support (listen directive)
                                                      • -
                                                      • added star-syntax support to BuildExcerpts() API call
                                                      • -
                                                      • added inplace inversion of .spa and .spp (inplace_enable directive, 1.5-2x less disk space for indexing)
                                                      • -
                                                      • added builtin Czech stemmer (morphology=stem_cz)
                                                      • -
                                                      • added IDIV(), NOW(), INTERVAL(), IN() functions to expressions
                                                      • -
                                                      • added index-level early-reject based on filters
                                                      • -
                                                      • added MVA updates feature (mva_updates_pool directive)
                                                      • -
                                                      • added select-list feature with computed expressions support (see SetSelect() API call, test.php --select switch), protocol 1.22
                                                      • -
                                                      • added integer expressions support (2x faster than float)
                                                      • -
                                                      • added multiforms support (multiple source words in wordforms file)
                                                      • -
                                                      • added legacy rankers (MATCH_ALL/MATCH_ANY/etc), removed legacy matching code (everything runs on V2 engine now)
                                                      • -
                                                      • added field position limit modifier to field operator (syntax: @title[50] hello world)
                                                      • -
                                                      • added killlist support (sql_query_killlist directive, --merge-killlists switch)
                                                      • -
                                                      • added on-disk SPI support (ondisk_dict directive)
                                                      • -
                                                      • added indexer IO stats
                                                      • -
                                                      • added periodic .spa flush (attr_flush_period directive)
                                                      • -
                                                      • added config reload on SIGHUP
                                                      • -
                                                      • added per-query attribute overrides feature (see SetOverride() API call); protocol 1.21
                                                      • -
                                                      • added signed 64bit attrs support (sql_attr_bigint directive)
                                                      • -
                                                      • improved HTML stripper to also skip PIs (<? ... ?>, such as <?php ... ?>)
                                                      • -
                                                      • improved excerpts speed (upto 50x faster on big documents)
                                                      • -
                                                      • fixed a short window of searchd inaccessibility on startup (started listen()ing too early before)
                                                      • -
                                                      • fixed .spa loading on systems where read() is 2GB capped
                                                      • -
                                                      • fixed infixes vs morphology issues
                                                      • -
                                                      • fixed backslash escaping, added backslash to EscapeString()
                                                      • -
                                                      • fixed handling of over-2GB dictionary files (.spi)
                                                      • +

                                                        A.8. Version 0.9.9-rc1, 17 nov 2008

                                                        +
                                                        • added min_stemming_len directive

                                                        • +
                                                        • added IsConnectError() API call (helps distingusih API vs remote errors)

                                                        • +
                                                        • added duplicate log messages filter to searchd

                                                        • +
                                                        • added --nodetach debugging switch to searchd

                                                        • +
                                                        • added blackhole agents support for debugging/testing (agent_blackhole directive)

                                                        • +
                                                        • added max_filters, max_filter_values directives (were hardcoded before)

                                                        • +
                                                        • added int64 expression evaluation path, automatic inference, and BIGINT() enforcer function

                                                        • +
                                                        • added crash handler for debugging (crash_log_path directive)

                                                        • +
                                                        • added MS SQL (aka SQL Server) source support (Windows only, mssql_winauth and mssql_unicode directives)

                                                        • +
                                                        • added indexer-side column unpacking feature (unpack_zlib, unpack_mysqlcompress directives)

                                                        • +
                                                        • added nested brackers and NOTs support to query language, rewritten query parser

                                                        • +
                                                        • added persistent connections support (Open() and Close() API calls)

                                                        • +
                                                        • added index_exact_words feature, and exact form operator to query language ("hello =world")

                                                        • +
                                                        • added status variables support to SphinxSE (SHOW STATUS LIKE 'sphinx_%')

                                                        • +
                                                        • added max_packet_size directive (was hardcoded at 8M before)

                                                        • +
                                                        • added UNIX socket support, and multi-interface support (listen directive)

                                                        • +
                                                        • added star-syntax support to BuildExcerpts() API call

                                                        • +
                                                        • added inplace inversion of .spa and .spp (inplace_enable directive, 1.5-2x less disk space for indexing)

                                                        • +
                                                        • added builtin Czech stemmer (morphology=stem_cz)

                                                        • +
                                                        • added IDIV(), NOW(), INTERVAL(), IN() functions to expressions

                                                        • +
                                                        • added index-level early-reject based on filters

                                                        • +
                                                        • added MVA updates feature (mva_updates_pool directive)

                                                        • +
                                                        • added select-list feature with computed expressions support (see SetSelect() API call, test.php --select switch), protocol 1.22

                                                        • +
                                                        • added integer expressions support (2x faster than float)

                                                        • +
                                                        • added multiforms support (multiple source words in wordforms file)

                                                        • +
                                                        • added legacy rankers (MATCH_ALL/MATCH_ANY/etc), removed legacy matching code (everything runs on V2 engine now)

                                                        • +
                                                        • added field position limit modifier to field operator (syntax: @title[50] hello world)

                                                        • +
                                                        • added killlist support (sql_query_killlist directive, --merge-killlists switch)

                                                        • +
                                                        • added on-disk SPI support (ondisk_dict directive)

                                                        • +
                                                        • added indexer IO stats

                                                        • +
                                                        • added periodic .spa flush (attr_flush_period directive)

                                                        • +
                                                        • added config reload on SIGHUP

                                                        • +
                                                        • added per-query attribute overrides feature (see SetOverride() API call); protocol 1.21

                                                        • +
                                                        • added signed 64bit attrs support (sql_attr_bigint directive)

                                                        • +
                                                        • improved HTML stripper to also skip PIs (<? ... ?>, such as <?php ... ?>)

                                                        • +
                                                        • improved excerpts speed (upto 50x faster on big documents)

                                                        • +
                                                        • fixed a short window of searchd inaccessibility on startup (started listen()ing too early before)

                                                        • +
                                                        • fixed .spa loading on systems where read() is 2GB capped

                                                        • +
                                                        • fixed infixes vs morphology issues

                                                        • +
                                                        • fixed backslash escaping, added backslash to EscapeString()

                                                        • +
                                                        • fixed handling of over-2GB dictionary files (.spi)

                                                        -

                                                        A.7. Version 0.9.8.1, 30 oct 2008

                                                        -
                                                        • added configure script to libsphinxclient
                                                        • -
                                                        • changed proximity/quorum operator syntax to require whitespace after length
                                                        • -
                                                        • fixed potential head process crash on SIGPIPE during "maxed out" message
                                                        • -
                                                        • fixed handling of incomplete remote replies (caused over-degraded distributed results, in rare cases)
                                                        • -
                                                        • fixed sending of big remote requests (caused distributed requests to fail, in rare cases)
                                                        • -
                                                        • fixed FD_SET() overflow (caused searchd to crash on startup, in rare cases)
                                                        • -
                                                        • fixed MVA vs distributed indexes (caused loss of 1st MVA value in result set)
                                                        • -
                                                        • fixed tokenizing of exceptions terminated by specials (eg. "GPS AT&T" in extended mode)
                                                        • -
                                                        • fixed buffer overrun in stemmer on overlong tokens occasionally emitted by proximity/quorum operator parser (caused crashes on certain proximity/quorum queries)
                                                        • -
                                                        • fixed wordcount ranker (could be dropping hits)
                                                        • -
                                                        • fixed --merge feature (numerous different fixes, caused broken indexes)
                                                        • -
                                                        • fixed --merge-dst-range performance
                                                        • -
                                                        • fixed prefix/infix generation for stopwords
                                                        • -
                                                        • fixed ignore_chars vs specials
                                                        • -
                                                        • fixed misplaced F_SETLKW check (caused certain build types, eg. RPM build on FC8, to fail)
                                                        • -
                                                        • fixed dictionary-defined charsets support in spelldump, added \x-style wordchars support
                                                        • -
                                                        • fixed Java API to properly send long strings (over 64K; eg. long document bodies for excerpts)
                                                        • -
                                                        • fixed Python API to accept offset/limit of 'long' type
                                                        • -
                                                        • fixed default ID range (that filtered out all 64-bit values) in Java and Python APIs
                                                        • +

                                                          A.9. Version 0.9.8.1, 30 oct 2008

                                                          +
                                                          • added configure script to libsphinxclient

                                                          • +
                                                          • changed proximity/quorum operator syntax to require whitespace after length

                                                          • +
                                                          • fixed potential head process crash on SIGPIPE during "maxed out" message

                                                          • +
                                                          • fixed handling of incomplete remote replies (caused over-degraded distributed results, in rare cases)

                                                          • +
                                                          • fixed sending of big remote requests (caused distributed requests to fail, in rare cases)

                                                          • +
                                                          • fixed FD_SET() overflow (caused searchd to crash on startup, in rare cases)

                                                          • +
                                                          • fixed MVA vs distributed indexes (caused loss of 1st MVA value in result set)

                                                          • +
                                                          • fixed tokenizing of exceptions terminated by specials (eg. "GPS AT&T" in extended mode)

                                                          • +
                                                          • fixed buffer overrun in stemmer on overlong tokens occasionally emitted by proximity/quorum operator parser (caused crashes on certain proximity/quorum queries)

                                                          • +
                                                          • fixed wordcount ranker (could be dropping hits)

                                                          • +
                                                          • fixed --merge feature (numerous different fixes, caused broken indexes)

                                                          • +
                                                          • fixed --merge-dst-range performance

                                                          • +
                                                          • fixed prefix/infix generation for stopwords

                                                          • +
                                                          • fixed ignore_chars vs specials

                                                          • +
                                                          • fixed misplaced F_SETLKW check (caused certain build types, eg. RPM build on FC8, to fail)

                                                          • +
                                                          • fixed dictionary-defined charsets support in spelldump, added \x-style wordchars support

                                                          • +
                                                          • fixed Java API to properly send long strings (over 64K; eg. long document bodies for excerpts)

                                                          • +
                                                          • fixed Python API to accept offset/limit of 'long' type

                                                          • +
                                                          • fixed default ID range (that filtered out all 64-bit values) in Java and Python APIs

                                                          -

                                                          A.8. Version 0.9.8, 14 jul 2008

                                                          -

                                                          Indexing

                                                          • added support for 64-bit document and keyword IDs, --enable-id64 switch to configure
                                                          • -
                                                          • added support for floating point attributes
                                                          • -
                                                          • added support for bitfields in attributes, sql_attr_bool directive and bit-widths part in sql_attr_uint directive
                                                          • -
                                                          • added support for multi-valued attributes (MVA)
                                                          • -
                                                          • added metaphone preprocessor
                                                          • -
                                                          • added libstemmer library support, provides stemmers for a number of additional languages
                                                          • -
                                                          • added xmlpipe2 source type, that supports arbitrary fields and attributes
                                                          • -
                                                          • added word form dictionaries, wordforms directive (and spelldump utility)
                                                          • -
                                                          • added tokenizing exceptions, exceptions directive
                                                          • -
                                                          • added an option to fully remove element contents to HTML stripper, html_remove_elements directive
                                                          • -
                                                          • added HTML entities decoder (with full XHTML1 set support) to HTML stripper
                                                          • -
                                                          • added per-index HTML stripping settings, html_strip, html_index_attrs, and html_remove_elements directives
                                                          • -
                                                          • added IO load throttling, max_iops and max_iosize directives
                                                          • -
                                                          • added SQL load throttling, sql_ranged_throttle directive
                                                          • -
                                                          • added an option to index prefixes/infixes for given fields only, prefix_fields and infix_fields directives
                                                          • -
                                                          • added an option to ignore certain characters (instead of just treating them as whitespace), ignore_chars directive
                                                          • -
                                                          • added an option to increment word position on phrase boundary characters, phrase_boundary and phrase_boundary_step directives
                                                          • -
                                                          • added --merge-dst-range switch (and filters) to index merging feature (--merge switch)
                                                          • -
                                                          • added mysql_connect_flags directive (eg. to reduce indexing time MySQL network traffic and/or time)
                                                          • -
                                                          • improved ordinals sorting; now runs in fixed RAM
                                                          • -
                                                          • improved handling of documents with zero/NULL ids, now skipping them instead of aborting
                                                          • -
                                                          -

                                                          Search daemon

                                                          • added an option to unlink old index on succesful rotation, unlink_old directive
                                                          • -
                                                          • added an option to keep index files open at all times (fixes subtle races on rotation), preopen and preopen_indexes directives
                                                          • -
                                                          • added an option to profile searchd disk I/O, --iostats command-line option
                                                          • -
                                                          • added an option to rotate index seamlessly (fully avoids query stalls), seamless_rotate directive
                                                          • -
                                                          • added HTML stripping support to excerpts (uses per-index settings)
                                                          • -
                                                          • added 'exact_phrase', 'single_passage', 'use_boundaries', 'weight_order 'options to BuildExcerpts() API call
                                                          • -
                                                          • added distributed attribute updates propagation
                                                          • -
                                                          • added distributed retries on master node side
                                                          • -
                                                          • added log reopen on SIGUSR1
                                                          • -
                                                          • added --stop switch (sends SIGTERM to running instance)
                                                          • -
                                                          • added Windows service mode, and --servicename switch
                                                          • -
                                                          • added Windows --rotate support
                                                          • -
                                                          • improved log timestamping, now with millisecond precision
                                                          • -
                                                          -

                                                          Querying

                                                          • added extended engine V2 (faster, cleaner, better; SPH_MATCH_EXTENDED2 mode)
                                                          • -
                                                          • added ranking modes support (V2 engine only; SetRankingMode() API call)
                                                          • -
                                                          • added quorum searching support to query language (V2 engine only; example: "any three of all these words"/3)
                                                          • -
                                                          • added query escaping support to query language, and EscapeString() API call
                                                          • -
                                                          • added multi-field syntax support to query language (example: "@(field1,field2) something"), and @@relaxed field checks option
                                                          • -
                                                          • added optional star-syntax ('word*') support in keywords, enable_star directive (for prefix/infix indexes only)
                                                          • -
                                                          • added full-scan support (query must be fully empty; can perform block-reject optimization)
                                                          • -
                                                          • added COUNT(DISTINCT(attr)) calculation support, SetGroupDistinct() API call
                                                          • -
                                                          • added group-by on MVA support, SetArrayResult() PHP API call
                                                          • -
                                                          • added per-index weights feature, SetIndexWeights() API call
                                                          • -
                                                          • added geodistance support, SetGeoAnchor() API call
                                                          • -
                                                          • added result set sorting by arbitrary expressions in run time (eg. "@weight+log(price)*2.5"), SPH_SORT_EXPR mode
                                                          • -
                                                          • added result set sorting by @custom compile-time sorting function (see src/sphinxcustomsort.inl)
                                                          • -
                                                          • added result set sorting by @random value
                                                          • -
                                                          • added result set merging for indexes with different schemas
                                                          • -
                                                          • added query comments support (3rd arg to Query()/AddQuery() API calls, copied verbatim to query log)
                                                          • -
                                                          • added keyword extraction support, BuildKeywords() API call
                                                          • -
                                                          • added binding field weights by name, SetFieldWeights() API call
                                                          • -
                                                          • added optional limit on query time, SetMaxQueryTime() API call
                                                          • -
                                                          • added optional limit on found matches count (4rd arg to SetLimits() API call, so-called 'cutoff')
                                                          • -
                                                          -

                                                          APIs and SphinxSE

                                                          • added pure C API (libsphinxclient)
                                                          • -
                                                          • added Ruby API (thanks to Dmytro Shteflyuk)
                                                          • -
                                                          • added Java API
                                                          • -
                                                          • added SphinxSE support for MVAs (use varchar), floats (use float), 64bit docids (use bigint)
                                                          • -
                                                          • added SphinxSE options "floatrange", "geoanchor", "fieldweights", "indexweights", "maxquerytime", "comment", "host" and "port"; and support for "expr:CLAUSE"
                                                          • -
                                                          • improved SphinxSE max query size (using MySQL condition pushdown), upto 256K now
                                                          • -
                                                          -

                                                          General

                                                          • added scripting (shebang syntax) support to config files (example: #!/usr/bin/php in the first line)
                                                          • -
                                                          • added unified config handling and validation to all programs
                                                          • -
                                                          • added unified documentation
                                                          • -
                                                          • added .spec file for RPM builds
                                                          • -
                                                          • added automated testing suite
                                                          • -
                                                          • improved index locking, now fcntl()-based instead of buggy file-existence-based
                                                          • -
                                                          • fixed unaligned RAM accesses, now works on SPARC and ARM
                                                          • -
                                                          -

                                                          Changes and fixes since 0.9.8-rc2

                                                          • added pure C API (libsphinxclient)
                                                          • -
                                                          • added Ruby API
                                                          • -
                                                          • added SetConnectTimeout() PHP API call
                                                          • -
                                                          • added allowed type check to UpdateAttributes() handler (bug #174)
                                                          • -
                                                          • added defensive MVA checks on index preload (protection against broken indexes, bug #168)
                                                          • -
                                                          • added sphinx-min.conf sample file
                                                          • -
                                                          • added --without-iconv switch to configure
                                                          • -
                                                          • removed redundant -lz dependency in searchd
                                                          • -
                                                          • removed erroneous "xmlpipe2 deprecated" warning
                                                          • -
                                                          • fixed EINTR handling in piped read (bug #166)
                                                          • -
                                                          • fixup query time before logging and sending to client (bug #153)
                                                          • -
                                                          • fixed attribute updates vs full-scan early-reject index (bug #149)
                                                          • -
                                                          • fixed gcc warnings (bug #160)
                                                          • -
                                                          • fixed mysql connection attempt vs pgsql source type (bug #165)
                                                          • -
                                                          • fixed 32-bit wraparound when preloading over 2 GB files
                                                          • -
                                                          • fixed "out of memory" message vs over 2 GB allocs (bug #116)
                                                          • -
                                                          • fixed unaligned RAM access detection on ARM (where unaligned reads do not crash but produce wrong results)
                                                          • -
                                                          • fixed missing full scan results in some cases
                                                          • -
                                                          • fixed several bugs in --merge, --merge-dst-range
                                                          • -
                                                          • fixed @geodist vs MultiQuery and filters, @expr vs MultiQuery
                                                          • -
                                                          • fixed GetTokenEnd() vs 1-grams (was causing crash in excerpts)
                                                          • -
                                                          • fixed sql_query_range to handle empty strings in addition to NULL strings (Postgres specific)
                                                          • -
                                                          • fixed morphology=none vs infixes
                                                          • -
                                                          • fixed case sensitive attributes names in UpdateAttributes()
                                                          • -
                                                          • fixed ext2 ranking vs. stopwords (now using atompos from query parser)
                                                          • -
                                                          • fixed EscapeString() call
                                                          • -
                                                          • fixed escaped specials (now handled as whitespace if not in charset)
                                                          • -
                                                          • fixed schema minimizer (now handles type/size mismatches)
                                                          • -
                                                          • fixed word stats in extended2; stemmed form is now returned
                                                          • -
                                                          • fixed spelldump case folding vs dictionary-defined character sets
                                                          • -
                                                          • fixed Postgres BOOLEAN handling
                                                          • -
                                                          • fixed enforced "inline" docinfo on empty indexes (normally ok, but index merge was really confused)
                                                          • -
                                                          • fixed rare count(distinct) out-of-bounds issue (it occasionaly caused too high @distinct values)
                                                          • -
                                                          • fixed hangups on documents with id=DOCID_MAX in some cases
                                                          • -
                                                          • fixed rare crash in tokenizer (prefixed synonym vs. input stream eof)
                                                          • -
                                                          • fixed query parser vs "aaa (bbb ccc)|ddd" queries
                                                          • -
                                                          • fixed BuildExcerpts() request in Java API
                                                          • -
                                                          • fixed Postgres specific memory leak
                                                          • -
                                                          • fixed handling of overshort keywords (less than min_word_len)
                                                          • -
                                                          • fixed HTML stripper (now emits space after indexed attributes)
                                                          • -
                                                          • fixed 32-field case in query parser
                                                          • -
                                                          • fixed rare count(distinct) vs. querying multiple local indexes vs. reusable sorter issue
                                                          • -
                                                          • fixed sorting of negative floats in SPH_SORT_EXTENDED mode
                                                          • +

                                                            A.10. Version 0.9.8, 14 jul 2008

                                                            +

                                                            Indexing

                                                            • added support for 64-bit document and keyword IDs, --enable-id64 switch to configure

                                                            • +
                                                            • added support for floating point attributes

                                                            • +
                                                            • added support for bitfields in attributes, sql_attr_bool directive and bit-widths part in sql_attr_uint directive

                                                            • +
                                                            • added support for multi-valued attributes (MVA)

                                                            • +
                                                            • added metaphone preprocessor

                                                            • +
                                                            • added libstemmer library support, provides stemmers for a number of additional languages

                                                            • +
                                                            • added xmlpipe2 source type, that supports arbitrary fields and attributes

                                                            • +
                                                            • added word form dictionaries, wordforms directive (and spelldump utility)

                                                            • +
                                                            • added tokenizing exceptions, exceptions directive

                                                            • +
                                                            • added an option to fully remove element contents to HTML stripper, html_remove_elements directive

                                                            • +
                                                            • added HTML entities decoder (with full XHTML1 set support) to HTML stripper

                                                            • +
                                                            • added per-index HTML stripping settings, html_strip, html_index_attrs, and html_remove_elements directives

                                                            • +
                                                            • added IO load throttling, max_iops and max_iosize directives

                                                            • +
                                                            • added SQL load throttling, sql_ranged_throttle directive

                                                            • +
                                                            • added an option to index prefixes/infixes for given fields only, prefix_fields and infix_fields directives

                                                            • +
                                                            • added an option to ignore certain characters (instead of just treating them as whitespace), ignore_chars directive

                                                            • +
                                                            • added an option to increment word position on phrase boundary characters, phrase_boundary and phrase_boundary_step directives

                                                            • +
                                                            • added --merge-dst-range switch (and filters) to index merging feature (--merge switch)

                                                            • +
                                                            • added mysql_connect_flags directive (eg. to reduce indexing time MySQL network traffic and/or time)

                                                            • +
                                                            • improved ordinals sorting; now runs in fixed RAM

                                                            • +
                                                            • improved handling of documents with zero/NULL ids, now skipping them instead of aborting

                                                            • +
                                                            +

                                                            Search daemon

                                                            • added an option to unlink old index on succesful rotation, unlink_old directive

                                                            • +
                                                            • added an option to keep index files open at all times (fixes subtle races on rotation), preopen and preopen_indexes directives

                                                            • +
                                                            • added an option to profile searchd disk I/O, --iostats command-line option

                                                            • +
                                                            • added an option to rotate index seamlessly (fully avoids query stalls), seamless_rotate directive

                                                            • +
                                                            • added HTML stripping support to excerpts (uses per-index settings)

                                                            • +
                                                            • added 'exact_phrase', 'single_passage', 'use_boundaries', 'weight_order 'options to BuildExcerpts() API call

                                                            • +
                                                            • added distributed attribute updates propagation

                                                            • +
                                                            • added distributed retries on master node side

                                                            • +
                                                            • added log reopen on SIGUSR1

                                                            • +
                                                            • added --stop switch (sends SIGTERM to running instance)

                                                            • +
                                                            • added Windows service mode, and --servicename switch

                                                            • +
                                                            • added Windows --rotate support

                                                            • +
                                                            • improved log timestamping, now with millisecond precision

                                                            • +
                                                            +

                                                            Querying

                                                            • added extended engine V2 (faster, cleaner, better; SPH_MATCH_EXTENDED2 mode)

                                                            • +
                                                            • added ranking modes support (V2 engine only; SetRankingMode() API call)

                                                            • +
                                                            • added quorum searching support to query language (V2 engine only; example: "any three of all these words"/3)

                                                            • +
                                                            • added query escaping support to query language, and EscapeString() API call

                                                            • +
                                                            • added multi-field syntax support to query language (example: "@(field1,field2) something"), and @@relaxed field checks option

                                                            • +
                                                            • added optional star-syntax ('word*') support in keywords, enable_star directive (for prefix/infix indexes only)

                                                            • +
                                                            • added full-scan support (query must be fully empty; can perform block-reject optimization)

                                                            • +
                                                            • added COUNT(DISTINCT(attr)) calculation support, SetGroupDistinct() API call

                                                            • +
                                                            • added group-by on MVA support, SetArrayResult() PHP API call

                                                            • +
                                                            • added per-index weights feature, SetIndexWeights() API call

                                                            • +
                                                            • added geodistance support, SetGeoAnchor() API call

                                                            • +
                                                            • added result set sorting by arbitrary expressions in run time (eg. "@weight+log(price)*2.5"), SPH_SORT_EXPR mode

                                                            • +
                                                            • added result set sorting by @custom compile-time sorting function (see src/sphinxcustomsort.inl)

                                                            • +
                                                            • added result set sorting by @random value

                                                            • +
                                                            • added result set merging for indexes with different schemas

                                                            • +
                                                            • added query comments support (3rd arg to Query()/AddQuery() API calls, copied verbatim to query log)

                                                            • +
                                                            • added keyword extraction support, BuildKeywords() API call

                                                            • +
                                                            • added binding field weights by name, SetFieldWeights() API call

                                                            • +
                                                            • added optional limit on query time, SetMaxQueryTime() API call

                                                            • +
                                                            • added optional limit on found matches count (4rd arg to SetLimits() API call, so-called 'cutoff')

                                                            • +
                                                            +

                                                            APIs and SphinxSE

                                                            • added pure C API (libsphinxclient)

                                                            • +
                                                            • added Ruby API (thanks to Dmytro Shteflyuk)

                                                            • +
                                                            • added Java API

                                                            • +
                                                            • added SphinxSE support for MVAs (use varchar), floats (use float), 64bit docids (use bigint)

                                                            • +
                                                            • added SphinxSE options "floatrange", "geoanchor", "fieldweights", "indexweights", "maxquerytime", "comment", "host" and "port"; and support for "expr:CLAUSE"

                                                            • +
                                                            • improved SphinxSE max query size (using MySQL condition pushdown), upto 256K now

                                                            • +
                                                            +

                                                            General

                                                            • added scripting (shebang syntax) support to config files (example: #!/usr/bin/php in the first line)

                                                            • +
                                                            • added unified config handling and validation to all programs

                                                            • +
                                                            • added unified documentation

                                                            • +
                                                            • added .spec file for RPM builds

                                                            • +
                                                            • added automated testing suite

                                                            • +
                                                            • improved index locking, now fcntl()-based instead of buggy file-existence-based

                                                            • +
                                                            • fixed unaligned RAM accesses, now works on SPARC and ARM

                                                            • +
                                                            +

                                                            Changes and fixes since 0.9.8-rc2

                                                            • added pure C API (libsphinxclient)

                                                            • +
                                                            • added Ruby API

                                                            • +
                                                            • added SetConnectTimeout() PHP API call

                                                            • +
                                                            • added allowed type check to UpdateAttributes() handler (bug #174)

                                                            • +
                                                            • added defensive MVA checks on index preload (protection against broken indexes, bug #168)

                                                            • +
                                                            • added sphinx-min.conf sample file

                                                            • +
                                                            • added --without-iconv switch to configure

                                                            • +
                                                            • removed redundant -lz dependency in searchd

                                                            • +
                                                            • removed erroneous "xmlpipe2 deprecated" warning

                                                            • +
                                                            • fixed EINTR handling in piped read (bug #166)

                                                            • +
                                                            • fixup query time before logging and sending to client (bug #153)

                                                            • +
                                                            • fixed attribute updates vs full-scan early-reject index (bug #149)

                                                            • +
                                                            • fixed gcc warnings (bug #160)

                                                            • +
                                                            • fixed mysql connection attempt vs pgsql source type (bug #165)

                                                            • +
                                                            • fixed 32-bit wraparound when preloading over 2 GB files

                                                            • +
                                                            • fixed "out of memory" message vs over 2 GB allocs (bug #116)

                                                            • +
                                                            • fixed unaligned RAM access detection on ARM (where unaligned reads do not crash but produce wrong results)

                                                            • +
                                                            • fixed missing full scan results in some cases

                                                            • +
                                                            • fixed several bugs in --merge, --merge-dst-range

                                                            • +
                                                            • fixed @geodist vs MultiQuery and filters, @expr vs MultiQuery

                                                            • +
                                                            • fixed GetTokenEnd() vs 1-grams (was causing crash in excerpts)

                                                            • +
                                                            • fixed sql_query_range to handle empty strings in addition to NULL strings (Postgres specific)

                                                            • +
                                                            • fixed morphology=none vs infixes

                                                            • +
                                                            • fixed case sensitive attributes names in UpdateAttributes()

                                                            • +
                                                            • fixed ext2 ranking vs. stopwords (now using atompos from query parser)

                                                            • +
                                                            • fixed EscapeString() call

                                                            • +
                                                            • fixed escaped specials (now handled as whitespace if not in charset)

                                                            • +
                                                            • fixed schema minimizer (now handles type/size mismatches)

                                                            • +
                                                            • fixed word stats in extended2; stemmed form is now returned

                                                            • +
                                                            • fixed spelldump case folding vs dictionary-defined character sets

                                                            • +
                                                            • fixed Postgres BOOLEAN handling

                                                            • +
                                                            • fixed enforced "inline" docinfo on empty indexes (normally ok, but index merge was really confused)

                                                            • +
                                                            • fixed rare count(distinct) out-of-bounds issue (it occasionaly caused too high @distinct values)

                                                            • +
                                                            • fixed hangups on documents with id=DOCID_MAX in some cases

                                                            • +
                                                            • fixed rare crash in tokenizer (prefixed synonym vs. input stream eof)

                                                            • +
                                                            • fixed query parser vs "aaa (bbb ccc)|ddd" queries

                                                            • +
                                                            • fixed BuildExcerpts() request in Java API

                                                            • +
                                                            • fixed Postgres specific memory leak

                                                            • +
                                                            • fixed handling of overshort keywords (less than min_word_len)

                                                            • +
                                                            • fixed HTML stripper (now emits space after indexed attributes)

                                                            • +
                                                            • fixed 32-field case in query parser

                                                            • +
                                                            • fixed rare count(distinct) vs. querying multiple local indexes vs. reusable sorter issue

                                                            • +
                                                            • fixed sorting of negative floats in SPH_SORT_EXTENDED mode

                                                            -

                                                            A.9. Version 0.9.7, 02 apr 2007

                                                            -
                                                            • added support for sql_str2ordinal_column
                                                            • -
                                                            • added support for upto 5 sort-by attrs (in extended sorting mode)
                                                            • -
                                                            • added support for separate groups sorting clause (in group-by mode)
                                                            • -
                                                            • added support for on-the-fly attribute updates (PRE-ALPHA; will change heavily; use for preliminary testing ONLY)
                                                            • -
                                                            • added support for zero/NULL attributes
                                                            • -
                                                            • added support for 0.9.7 features to SphinxSE
                                                            • -
                                                            • added support for n-grams (alpha, 1-grams only for now)
                                                            • -
                                                            • added support for warnings reported to client
                                                            • -
                                                            • added support for exclude-filters
                                                            • -
                                                            • added support for prefix and infix indexing (see max_prefix_len, max_infix_len)
                                                            • -
                                                            • added @* syntax to reset current field to query language
                                                            • -
                                                            • added removal of duplicate entries in query index order
                                                            • -
                                                            • added PHP API workarounds for PHP signed/unsigned braindamage
                                                            • -
                                                            • added locks to avoid two concurrent indexers working on same index
                                                            • -
                                                            • added check for existing attributes vs. docinfo=none case
                                                            • -
                                                            • improved groupby code a lot (better precision, and upto 25x times faster in extreme cases)
                                                            • -
                                                            • improved error handling and reporting
                                                            • -
                                                            • improved handling of broken indexes (reports error instead of hanging/crashing)
                                                            • -
                                                            • improved mmap() limits for attributes and wordlists (now able to map over 4 GB on x64 and over 2 GB on x32 where possible)
                                                            • -
                                                            • improved malloc() pressure in head daemon (search time should not degrade with time any more)
                                                            • -
                                                            • improved test.php command line options
                                                            • -
                                                            • improved error reporting (distributed query, broken index etc issues now reported to client)
                                                            • -
                                                            • changed default network packet size to be 8M, added extra checks
                                                            • -
                                                            • fixed division by zero in BM25 on 1-document collections (in extended matching mode)
                                                            • -
                                                            • fixed .spl files getting unlinked
                                                            • -
                                                            • fixed crash in schema compatibility test
                                                            • -
                                                            • fixed UTF-8 Russian stemmer
                                                            • -
                                                            • fixed requested matches count when querying distributed agents
                                                            • -
                                                            • fixed signed vs. unsigned issues everywhere (ranged queries, CLI search output, and obtaining docid)
                                                            • -
                                                            • fixed potential crashes vs. negative query offsets
                                                            • -
                                                            • fixed 0-match docs vs. extended mode vs. stats
                                                            • -
                                                            • fixed group/timestamp filters being ignored if querying from older clients
                                                            • -
                                                            • fixed docs to mention pgsql source type
                                                            • -
                                                            • fixed issues with explicit '&' in extended matching mode
                                                            • -
                                                            • fixed wrong assertion in SBCS encoder
                                                            • -
                                                            • fixed crashes with no-attribute indexes after rotate
                                                            • +

                                                              A.11. Version 0.9.7, 02 apr 2007

                                                              +
                                                              • added support for sql_str2ordinal_column

                                                              • +
                                                              • added support for upto 5 sort-by attrs (in extended sorting mode)

                                                              • +
                                                              • added support for separate groups sorting clause (in group-by mode)

                                                              • +
                                                              • added support for on-the-fly attribute updates (PRE-ALPHA; will change heavily; use for preliminary testing ONLY)

                                                              • +
                                                              • added support for zero/NULL attributes

                                                              • +
                                                              • added support for 0.9.7 features to SphinxSE

                                                              • +
                                                              • added support for n-grams (alpha, 1-grams only for now)

                                                              • +
                                                              • added support for warnings reported to client

                                                              • +
                                                              • added support for exclude-filters

                                                              • +
                                                              • added support for prefix and infix indexing (see max_prefix_len, max_infix_len)

                                                              • +
                                                              • added @* syntax to reset current field to query language

                                                              • +
                                                              • added removal of duplicate entries in query index order

                                                              • +
                                                              • added PHP API workarounds for PHP signed/unsigned braindamage

                                                              • +
                                                              • added locks to avoid two concurrent indexers working on same index

                                                              • +
                                                              • added check for existing attributes vs. docinfo=none case

                                                              • +
                                                              • improved groupby code a lot (better precision, and upto 25x times faster in extreme cases)

                                                              • +
                                                              • improved error handling and reporting

                                                              • +
                                                              • improved handling of broken indexes (reports error instead of hanging/crashing)

                                                              • +
                                                              • improved mmap() limits for attributes and wordlists (now able to map over 4 GB on x64 and over 2 GB on x32 where possible)

                                                              • +
                                                              • improved malloc() pressure in head daemon (search time should not degrade with time any more)

                                                              • +
                                                              • improved test.php command line options

                                                              • +
                                                              • improved error reporting (distributed query, broken index etc issues now reported to client)

                                                              • +
                                                              • changed default network packet size to be 8M, added extra checks

                                                              • +
                                                              • fixed division by zero in BM25 on 1-document collections (in extended matching mode)

                                                              • +
                                                              • fixed .spl files getting unlinked

                                                              • +
                                                              • fixed crash in schema compatibility test

                                                              • +
                                                              • fixed UTF-8 Russian stemmer

                                                              • +
                                                              • fixed requested matches count when querying distributed agents

                                                              • +
                                                              • fixed signed vs. unsigned issues everywhere (ranged queries, CLI search output, and obtaining docid)

                                                              • +
                                                              • fixed potential crashes vs. negative query offsets

                                                              • +
                                                              • fixed 0-match docs vs. extended mode vs. stats

                                                              • +
                                                              • fixed group/timestamp filters being ignored if querying from older clients

                                                              • +
                                                              • fixed docs to mention pgsql source type

                                                              • +
                                                              • fixed issues with explicit '&' in extended matching mode

                                                              • +
                                                              • fixed wrong assertion in SBCS encoder

                                                              • +
                                                              • fixed crashes with no-attribute indexes after rotate

                                                              -

                                                              A.10. Version 0.9.7-rc2, 15 dec 2006

                                                              -
                                                              • added support for extended matching mode (query language)
                                                              • -
                                                              • added support for extended sorting mode (sorting clauses)
                                                              • -
                                                              • added support for SBCS excerpts
                                                              • -
                                                              • added mmap()ing for attributes and wordlist (improves search time, speeds up fork() greatly)
                                                              • -
                                                              • fixed attribute name handling to be case insensitive
                                                              • -
                                                              • fixed default compiler options to simplify post-mortem debugging (added -g, removed -fomit-frame-pointer)
                                                              • -
                                                              • fixed rare memory leak
                                                              • -
                                                              • fixed "hello hello" queries in "match phrase" mode
                                                              • -
                                                              • fixed issue with excerpts, texts and overlong queries
                                                              • -
                                                              • fixed logging multiple index name (no longer tokenized)
                                                              • -
                                                              • fixed trailing stopword not flushed from tokenizer
                                                              • -
                                                              • fixed boolean evaluation
                                                              • -
                                                              • fixed pidfile being wrongly unlink()ed on bind() failure
                                                              • -
                                                              • fixed --with-mysql-includes/libs (they conflicted with well-known paths)
                                                              • -
                                                              • fixes for 64-bit platforms
                                                              • +

                                                                A.12. Version 0.9.7-rc2, 15 dec 2006

                                                                +
                                                                • added support for extended matching mode (query language)

                                                                • +
                                                                • added support for extended sorting mode (sorting clauses)

                                                                • +
                                                                • added support for SBCS excerpts

                                                                • +
                                                                • added mmap()ing for attributes and wordlist (improves search time, speeds up fork() greatly)

                                                                • +
                                                                • fixed attribute name handling to be case insensitive

                                                                • +
                                                                • fixed default compiler options to simplify post-mortem debugging (added -g, removed -fomit-frame-pointer)

                                                                • +
                                                                • fixed rare memory leak

                                                                • +
                                                                • fixed "hello hello" queries in "match phrase" mode

                                                                • +
                                                                • fixed issue with excerpts, texts and overlong queries

                                                                • +
                                                                • fixed logging multiple index name (no longer tokenized)

                                                                • +
                                                                • fixed trailing stopword not flushed from tokenizer

                                                                • +
                                                                • fixed boolean evaluation

                                                                • +
                                                                • fixed pidfile being wrongly unlink()ed on bind() failure

                                                                • +
                                                                • fixed --with-mysql-includes/libs (they conflicted with well-known paths)

                                                                • +
                                                                • fixes for 64-bit platforms

                                                                -

                                                                A.11. Version 0.9.7-rc1, 26 oct 2006

                                                                -
                                                                • added alpha index merging code
                                                                • -
                                                                • added an option to decrease max_matches per-query
                                                                • -
                                                                • added an option to specify IP address for searchd to listen on
                                                                • -
                                                                • added support for unlimited amount of configured sources and indexes
                                                                • -
                                                                • added support for group-by queries
                                                                • -
                                                                • added support for /2 range modifier in charset_table
                                                                • -
                                                                • added support for arbitrary amount of document attributes
                                                                • -
                                                                • added logging filter count and index name
                                                                • -
                                                                • added --with-debug option to configure to compile in debug mode
                                                                • -
                                                                • added -DNDEBUG when compiling in default mode
                                                                • -
                                                                • improved search time (added doclist size hints, in-memory wordlist cache, and used VLB coding everywhere)
                                                                • -
                                                                • improved (refactored) SQL driver code (adding new drivers should be very easy now)
                                                                • -
                                                                • improved exceprts generation
                                                                • -
                                                                • fixed issue with empty sources and ranged queries
                                                                • -
                                                                • fixed querying purely remote distributed indexes
                                                                • -
                                                                • fixed suffix length check in English stemmer in some cases
                                                                • -
                                                                • fixed UTF-8 decoder for codes over U+20000 (for CJK)
                                                                • -
                                                                • fixed UTF-8 encoder for 3-byte sequences (for CJK)
                                                                • -
                                                                • fixed overshort (less than min_word_len) words prepended to next field
                                                                • -
                                                                • fixed source connection order (indexer does not connect to all sources at once now)
                                                                • -
                                                                • fixed line numbering in config parser
                                                                • -
                                                                • fixed some issues with index rotation
                                                                • +

                                                                  A.13. Version 0.9.7-rc1, 26 oct 2006

                                                                  +
                                                                  • added alpha index merging code

                                                                  • +
                                                                  • added an option to decrease max_matches per-query

                                                                  • +
                                                                  • added an option to specify IP address for searchd to listen on

                                                                  • +
                                                                  • added support for unlimited amount of configured sources and indexes

                                                                  • +
                                                                  • added support for group-by queries

                                                                  • +
                                                                  • added support for /2 range modifier in charset_table

                                                                  • +
                                                                  • added support for arbitrary amount of document attributes

                                                                  • +
                                                                  • added logging filter count and index name

                                                                  • +
                                                                  • added --with-debug option to configure to compile in debug mode

                                                                  • +
                                                                  • added -DNDEBUG when compiling in default mode

                                                                  • +
                                                                  • improved search time (added doclist size hints, in-memory wordlist cache, and used VLB coding everywhere)

                                                                  • +
                                                                  • improved (refactored) SQL driver code (adding new drivers should be very easy now)

                                                                  • +
                                                                  • improved exceprts generation

                                                                  • +
                                                                  • fixed issue with empty sources and ranged queries

                                                                  • +
                                                                  • fixed querying purely remote distributed indexes

                                                                  • +
                                                                  • fixed suffix length check in English stemmer in some cases

                                                                  • +
                                                                  • fixed UTF-8 decoder for codes over U+20000 (for CJK)

                                                                  • +
                                                                  • fixed UTF-8 encoder for 3-byte sequences (for CJK)

                                                                  • +
                                                                  • fixed overshort (less than min_word_len) words prepended to next field

                                                                  • +
                                                                  • fixed source connection order (indexer does not connect to all sources at once now)

                                                                  • +
                                                                  • fixed line numbering in config parser

                                                                  • +
                                                                  • fixed some issues with index rotation

                                                                  -

                                                                  A.12. Version 0.9.6, 24 jul 2006

                                                                  -
                                                                  • added support for empty indexes
                                                                  • -
                                                                  • added support for multiple sql_query_pre/post/post_index
                                                                  • -
                                                                  • fixed timestamp ranges filter in "match any" mode
                                                                  • -
                                                                  • fixed configure issues with --without-mysql and --with-pgsql options
                                                                  • -
                                                                  • fixed building on Solaris 9
                                                                  • +

                                                                    A.14. Version 0.9.6, 24 jul 2006

                                                                    +
                                                                    • added support for empty indexes

                                                                    • +
                                                                    • added support for multiple sql_query_pre/post/post_index

                                                                    • +
                                                                    • fixed timestamp ranges filter in "match any" mode

                                                                    • +
                                                                    • fixed configure issues with --without-mysql and --with-pgsql options

                                                                    • +
                                                                    • fixed building on Solaris 9

                                                                    -

                                                                    A.13. Version 0.9.6-rc1, 26 jun 2006

                                                                    -
                                                                    • added boolean queries support (experimental, beta version)
                                                                    • -
                                                                    • added simple file-based query cache (experimental, beta version)
                                                                    • -
                                                                    • added storage engine for MySQL 5.0 and 5.1 (experimental, beta version)
                                                                    • -
                                                                    • added GNU style configure script
                                                                    • -
                                                                    • added new searchd protocol (all binary, and should be backwards compatible)
                                                                    • -
                                                                    • added distributed searching support to searchd
                                                                    • -
                                                                    • added PostgreSQL driver
                                                                    • -
                                                                    • added excerpts generation
                                                                    • -
                                                                    • added min_word_len option to index
                                                                    • -
                                                                    • added max_matches option to searchd, removed hardcoded MAX_MATCHES limit
                                                                    • -
                                                                    • added initial documentation, and a working example.sql
                                                                    • -
                                                                    • added support for multiple sources per index
                                                                    • -
                                                                    • added soundex support
                                                                    • -
                                                                    • added group ID ranges support
                                                                    • -
                                                                    • added --stdin command-line option to search utility
                                                                    • -
                                                                    • added --noprogress option to indexer
                                                                    • -
                                                                    • added --index option to search
                                                                    • -
                                                                    • fixed UTF-8 decoder (3-byte codepoints did not work)
                                                                    • -
                                                                    • fixed PHP API to handle big result sets faster
                                                                    • -
                                                                    • fixed config parser to handle empty values properly
                                                                    • -
                                                                    • fixed redundant time(NULL) calls in time-segments mode
                                                                    • +

                                                                      A.15. Version 0.9.6-rc1, 26 jun 2006

                                                                      +
                                                                      • added boolean queries support (experimental, beta version)

                                                                      • +
                                                                      • added simple file-based query cache (experimental, beta version)

                                                                      • +
                                                                      • added storage engine for MySQL 5.0 and 5.1 (experimental, beta version)

                                                                      • +
                                                                      • added GNU style configure script

                                                                      • +
                                                                      • added new searchd protocol (all binary, and should be backwards compatible)

                                                                      • +
                                                                      • added distributed searching support to searchd

                                                                      • +
                                                                      • added PostgreSQL driver

                                                                      • +
                                                                      • added excerpts generation

                                                                      • +
                                                                      • added min_word_len option to index

                                                                      • +
                                                                      • added max_matches option to searchd, removed hardcoded MAX_MATCHES limit

                                                                      • +
                                                                      • added initial documentation, and a working example.sql

                                                                      • +
                                                                      • added support for multiple sources per index

                                                                      • +
                                                                      • added soundex support

                                                                      • +
                                                                      • added group ID ranges support

                                                                      • +
                                                                      • added --stdin command-line option to search utility

                                                                      • +
                                                                      • added --noprogress option to indexer

                                                                      • +
                                                                      • added --index option to search

                                                                      • +
                                                                      • fixed UTF-8 decoder (3-byte codepoints did not work)

                                                                      • +
                                                                      • fixed PHP API to handle big result sets faster

                                                                      • +
                                                                      • fixed config parser to handle empty values properly

                                                                      • +
                                                                      • fixed redundant time(NULL) calls in time-segments mode

                                                                    diff -Nru sphinxsearch-0.9.9+2.0.2beta/doc/sphinx.txt sphinxsearch-2.0.4/doc/sphinx.txt --- sphinxsearch-0.9.9+2.0.2beta/doc/sphinx.txt 2011-11-15 22:35:53.000000000 +0000 +++ sphinxsearch-2.0.4/doc/sphinx.txt 2012-03-02 06:17:50.000000000 +0000 @@ -1,12 +1,12 @@ -Sphinx 2.0.2-beta reference manual -================================== +Sphinx 2.0.4-release reference manual +===================================== Free open-source SQL full-text search engine ============================================ -Copyright (c) 2001-2011 Andrew Aksyonoff +Copyright (c) 2001-2012 Andrew Aksyonoff -Copyright (c) 2008-2011 Sphinx Technologies Inc, http://sphinxsearch.com +Copyright (c) 2008-2012 Sphinx Technologies Inc, http://sphinxsearch.com ---------------------------------------------------------------------------- @@ -212,19 +212,20 @@ 11.1.36. xmlpipe_field_string 11.1.37. xmlpipe_field_wordcount 11.1.38. xmlpipe_attr_uint - 11.1.39. xmlpipe_attr_bool - 11.1.40. xmlpipe_attr_timestamp - 11.1.41. xmlpipe_attr_str2ordinal - 11.1.42. xmlpipe_attr_float - 11.1.43. xmlpipe_attr_multi - 11.1.44. xmlpipe_attr_multi_64 - 11.1.45. xmlpipe_attr_string - 11.1.46. xmlpipe_fixup_utf8 - 11.1.47. mssql_winauth - 11.1.48. mssql_unicode - 11.1.49. unpack_zlib - 11.1.50. unpack_mysqlcompress - 11.1.51. unpack_mysqlcompress_maxsize + 11.1.39. xmlpipe_attr_bigint + 11.1.40. xmlpipe_attr_bool + 11.1.41. xmlpipe_attr_timestamp + 11.1.42. xmlpipe_attr_str2ordinal + 11.1.43. xmlpipe_attr_float + 11.1.44. xmlpipe_attr_multi + 11.1.45. xmlpipe_attr_multi_64 + 11.1.46. xmlpipe_attr_string + 11.1.47. xmlpipe_fixup_utf8 + 11.1.48. mssql_winauth + 11.1.49. mssql_unicode + 11.1.50. unpack_zlib + 11.1.51. unpack_mysqlcompress + 11.1.52. unpack_mysqlcompress_maxsize 11.2. Index configuration options 11.2.1. type @@ -339,19 +340,21 @@ 11.4.42. prefork_rotation_throttle A. Sphinx revision history - A.1. Version 2.0.2-beta, 15 nov 2011 - A.2. Version 2.0.1-beta, 22 apr 2011 - A.3. Version 1.10-beta, 19 jul 2010 - A.4. Version 0.9.9-release, 02 dec 2009 - A.5. Version 0.9.9-rc2, 08 apr 2009 - A.6. Version 0.9.9-rc1, 17 nov 2008 - A.7. Version 0.9.8.1, 30 oct 2008 - A.8. Version 0.9.8, 14 jul 2008 - A.9. Version 0.9.7, 02 apr 2007 - A.10. Version 0.9.7-rc2, 15 dec 2006 - A.11. Version 0.9.7-rc1, 26 oct 2006 - A.12. Version 0.9.6, 24 jul 2006 - A.13. Version 0.9.6-rc1, 26 jun 2006 + A.1. Version 2.0.4-release, 02 mar 2012 + A.2. Version 2.0.3-release, 23 dec 2011 + A.3. Version 2.0.2-beta, 15 nov 2011 + A.4. Version 2.0.1-beta, 22 apr 2011 + A.5. Version 1.10-beta, 19 jul 2010 + A.6. Version 0.9.9-release, 02 dec 2009 + A.7. Version 0.9.9-rc2, 08 apr 2009 + A.8. Version 0.9.9-rc1, 17 nov 2008 + A.9. Version 0.9.8.1, 30 oct 2008 + A.10. Version 0.9.8, 14 jul 2008 + A.11. Version 0.9.7, 02 apr 2007 + A.12. Version 0.9.7-rc2, 15 dec 2006 + A.13. Version 0.9.7-rc1, 26 oct 2006 + A.14. Version 0.9.6, 24 jul 2006 + A.15. Version 0.9.6-rc1, 26 jun 2006 List of Examples @@ -422,47 +425,70 @@ Key Sphinx features are: * high indexing and searching performance; + * advanced indexing and querying tools (flexible and feature-rich text tokenizer, querying language, several different ranking modes, etc); + * advanced result set post-processing (SELECT with expressions, WHERE, ORDER BY, GROUP BY etc over text search results); + * proven scalability up to billions of documents, terabytes of data, and thousands of queries per second; + * easy integration with SQL and XML data sources, and SphinxAPI, SphinxQL, or SphinxSE search interfaces; + * easy scaling with distributed searches. To expand a bit, Sphinx: * has high indexing speed (upto 10-15 MB/sec per core on an internal benchmark); + * has high search speed (upto 150-250 queries/sec per core against 1,000,000 documents, 1.2 GB of data on an internal benchmark); + * has high scalability (biggest known cluster indexes over 3,000,000,000 documents, and busiest one peaks over 50,000,000 queries/day); + * provides good relevance ranking through combination of phrase proximity ranking and statistical (BM25) ranking; + * provides distributed searching capabilities; + * provides document excerpts (snippets) generation; + * provides searching from within application with SphinxAPI or SphinxQL interfaces, and from within MySQL with pluggable SphinxSE storage engine; + * supports boolean, phrase, word proximity and other types of queries; + * supports multiple full-text fields per document (upto 32 by default); + * supports multiple additional attributes per document (ie. groups, timestamps, etc); + * supports stopwords; + * supports morphological word forms dictionaries; + * supports tokenizing exceptions; + * supports both single-byte encodings and UTF-8; + * supports stemming (stemmers for English, Russian and Czech are built-in; and stemmers for French, Spanish, Portuguese, Italian, Romanian, German, Dutch, Swedish, Norwegian, Danish, Finnish, Hungarian, are available by building third party libstemmer library); + * supports MySQL natively (all types of tables, including MyISAM, InnoDB, NDB, Archive, etc are supported); + * supports PostgreSQL natively; + * supports ODBC compliant databases (MS SQL, Oracle, etc) natively; + * ...has 50+ other features not listed here, refer to API and configuration manual! @@ -475,15 +501,20 @@ Currently, Sphinx distribution tarball includes the following software: * indexer: an utility which creates fulltext indexes; + * search: a simple command-line (CLI) test utility which searches through fulltext indexes; + * searchd: a daemon which enables external software (eg. Web applications) to search through fulltext indexes; + * sphinxapi: a set of searchd client API libraries for popular Web scripting languages (PHP, Python, Perl, Ruby). + * spelldump: a simple command-line tool to extract the items from an ispell or MySpell (as bundled with OpenOffice) format dictionary to help customize your index, for use with wordforms. + * indextool: an utility to dump miscellaneous debug information about the index, added in version 0.9.9-rc2. @@ -524,9 +555,13 @@ on their work on Sphinx (in alphabetical order): * Alexander Klimenko + * Alexey Dvoichenkov + * Alexey Vinogradov + * Ilya Kuznetsov + * Stanislav Klinov Contributors @@ -537,7 +572,9 @@ * Robert "coredev" Bengtsson (Sweden), initial version of PostgreSQL data source + * Len Kranendonk, Perl API + * Dmytro Shteflyuk, Ruby API Many other people have contributed ideas, bug reports, fixes, etc. Thank @@ -595,16 +632,21 @@ Currently known systems Sphinx has been successfully running on are: * Linux 2.4.x, 2.6.x (many various distributions) + * Windows 2000, XP, 7 + * FreeBSD 4.x, 5.x, 6.x, 7.x, 8.x + * NetBSD 1.6, 3.0 + * Solaris 9, 11 + * Mac OS X CPU architectures known to work include i386 (aka x86), amd64 (aka x86_64), SPARC64, and ARM. -Chance are good that Sphinx should work on other Unix platforms and/or CPU +Chances are good that Sphinx should work on other Unix platforms and/or CPU architectures just as well. Please report any other platforms that worked for you! @@ -617,6 +659,7 @@ On UNIX, you will need the following tools to build and install Sphinx: * a working C++ compiler. GNU gcc is known to work. + * a good make program. GNU make is known to work. On Windows, you will need Microsoft Visual C/C++ Studio .NET 2005 or above. @@ -644,8 +687,10 @@ * --prefix, which specifies where to install Sphinx; such as --prefix=/usr/local/sphinx (all of the examples use this prefix) + * --with-mysql, which specifies where to look for MySQL include and library files, if auto-detection fails; + * --with-pgsql, which specifies where to look for PostgreSQL include and library files. @@ -682,6 +727,7 @@ 2. Edit the contents of sphinx.conf.in - specifically entries relating to @CONFDIR@ - to paths suitable for your system. + 3. Install the searchd system as a Windows service: C:\Sphinx\bin> C:\Sphinx\bin\searchd --install --config @@ -932,10 +978,15 @@ supported attribute types are: * unsigned integers (1-bit to 32-bit wide); + * UNIX timestamps; + * floating point values (32-bit, IEEE 754 single precision); + * string ordinals (specially computed integers); + * strings (since 1.10-beta); + * MVA, multi-value attributes (variable-length lists of 32-bit unsigned integers). @@ -944,6 +995,7 @@ * stored separately from the main full-text index data ("extern" storage, in .spa file), or + * attached to each occurence of document ID in full-text index data ("inline" storage, in .spd file). @@ -1059,7 +1111,9 @@ To do that properly, Sphinx needs to know * what encoding is the source text in; + * what characters are letters and what are not; + * what letters should be folded to what letters. This should be configured on a per-index basis using charset_type and @@ -1083,19 +1137,27 @@ With all the SQL drivers, indexing generally works as follows. * connection to the database is established; + * pre-query (see Section 11.1.11, <>) is executed to perform any necessary initial setup, such as setting per-connection encoding with MySQL; + * main query (see Section 11.1.12, <>) is executed and the rows it returns are indexed; + * post-query (see Section 11.1.30, <>) is executed to perform any necessary cleanup; + * connection to the database is closed; + * indexer does the sorting phase (to be pedantic, index-type specific post-processing); + * connection to the database is established again; + * post-index query (see Section 11.1.31, <>) is executed to perform any necessary final cleanup; + * connection to the database is closed again. Most options, such as database user/host/password, are straightforward. @@ -1125,7 +1187,9 @@ would be run three times: 1. with $start replaced with 1 and $end replaced with 1000; + 2. with $start replaced with 1001 and $end replaced with 2000; + 3. with $start replaced with 2000 and $end replaced with 2345. Obviously, that's not much of a difference for 2000-row table, but when it @@ -1289,6 +1353,7 @@ * "name", specifies the XML element name that will be treated as a full-text field in the subsequent documents. + * "attr", specifies whether to also index this field as a string or word count attribute. Possible values are "string" and "wordcount". Introduced in version 1.10-beta. @@ -1299,10 +1364,13 @@ * "name", specifies the element name that should be treated as an attribute in the subsequent documents. + * "type", specifies the attribute type. Possible values are "int", "timestamp", "str2ordinal", "bool", "float" and "multi". + * "bits", specifies the bit size for "int" attribute type. Valid values are 1 to 32. + * "default", specifies the default value for this attribute that should be used if the attribute's element is not present in the document. @@ -1362,7 +1430,7 @@ documents can be made available to search in a matter of minutes. Specifying which documents should go to what index and reindexing main -index could also be made fully automatical. One option would be to make +index could also be made fully automatic. One option would be to make a counter table which would track the ID which would split the documents, and update it whenever the main index is reindexed. @@ -1587,24 +1655,32 @@ quirks. Those quirks are listed in this section. * Prefix and infix indexing are not supported yet. + * MVAs are not supported yet. + * Disk chunks optimization routine is not implemented yet. + * On initial index creation, attributes are reordered by type, in the following order: uint, bigint, float, timestamp, string. So when using INSERT without an explicit column names list, specify all uint column values first, then bigint, etc. + * Default conservative RAM chunk limit (rt_mem_limit) of 32M can lead to poor performance on bigger indexes, you should raise it to 256..1024M if you're planning to index gigabytes. + * High DELETE/REPLACE rate can lead to kill-list fragmentation and impact searching performance. + * No transaction size limits are currently imposed; too many concurrent INSERT/REPLACE transactions might therefore consume a lot of RAM. + * In case of a damaged binlog, recovery will stop on the first damaged transaction, even though it's technically possible to keep looking further for subsequent undamaged transactions, and recover those. This mid-file damage case (due to flaky HDD/CDD/tape?) is supposed to be extremely rare, though. + * Multiple INSERTs grouped in a single transaction perform better than equivalent single-row transactions and are recommended for batch loading of data. @@ -1661,11 +1737,12 @@ saved to disk, and then all the binlog files are unlinked. During normal operation, a new binlog file will be opened every time when -binlog_max_log_size limit (which defaults to 128M) is reached. Older, -already closed binlog files are kept until all of the transactions stored -in them (from all indexes) are flushed as a disk chunk. Setting the limit -to 0 pretty much prevents binlog from being unlinked at all while searchd -is running; however, it will still be unlinked on clean shutdown. +binlog_max_log_size limit is reached. Older, already closed binlog files +are kept until all of the transactions stored in them (from all indexes) +are flushed as a disk chunk. Setting the limit to 0 pretty much prevents +binlog from being unlinked at all while searchd is running; however, it +will still be unlinked on clean shutdown. (This is the default case as of +2.0.3-release, binlog_max_log_size defaults to 0.) There are 3 different binlog flushing strategies, controlled by binlog_flush directive which takes the values of 0, 1, or 2. 0 means to @@ -1750,13 +1827,19 @@ There are the following matching modes available: * SPH_MATCH_ALL, matches all query words (default mode); + * SPH_MATCH_ANY, matches any of the query words; + * SPH_MATCH_PHRASE, matches query as a phrase, requiring perfect match; + * SPH_MATCH_BOOLEAN, matches query as a boolean expression (see Section 5.2, <>); + * SPH_MATCH_EXTENDED, matches query as an expression in Sphinx internal query language (see Section 5.3, <>); + * SPH_MATCH_EXTENDED2, an alias for SPH_MATCH_EXTENDED; + * SPH_MATCH_FULLSCAN, matches query, forcibly using the "full scan" mode as below. NB, any query terms will be ignored, such that filters, filter-ranges and grouping will still be applied, but no @@ -1772,6 +1855,7 @@ specified matching mode when the following conditions are met: 1. The query string is empty (ie. its length is zero). + 2. docinfo storage is set to extern. In full scan mode, all the indexed documents will be considered as @@ -1909,14 +1993,17 @@ * Find the words 'hello' and 'world' adjacently in any field in a document; + * Additionally, the same document must also contain the words 'example' - and 'program' in the title field, with up to, but not including, 10 - words between the words in question; (E.g. "example PHP program" would - be matched however "example script to introduce outside data into the - correct context for your program" would not because two terms have 10 - or more words between them) + and 'program' in the title field, with up to, but not including, + 5 words between the words in question; (E.g. "example PHP program" + would be matched however "example script to introduce outside data + into the correct context for your program" would not because two terms + have 5 or more words between them) + * Additionally, the same document must contain the word 'python' in the body field, but not contain either 'php' or 'perl'; + * Additionally, the same document must contain the word 'code' in any field. @@ -2094,26 +2181,33 @@ * SPH_RANK_PROXIMITY_BM25, the default ranking mode that uses and combines both phrase proximity and BM25 ranking. + * SPH_RANK_BM25, statistical ranking mode which uses BM25 ranking only (similar to most other full-text engines). This mode is faster but may result in worse quality on queries which contain more than 1 keyword. + * SPH_RANK_NONE, no ranking mode. This mode is obviously the fastest. A weight of 1 is assigned to all matches. This is sometimes called boolean searching that just matches the documents but does not rank them. + * SPH_RANK_WORDCOUNT, ranking by the keyword occurrences count. This ranker computes the per-field keyword occurrence counts, then multiplies them by field weights, and sums the resulting values. + * SPH_RANK_PROXIMITY, added in version 0.9.9-rc1, returns raw phrase proximity value as a result. This mode is internally used to emulate SPH_MATCH_ALL queries. + * SPH_RANK_MATCHANY, added in version 0.9.9-rc1, returns rank as it was computed in SPH_MATCH_ANY mode ealier, and is internally used to emulate SPH_MATCH_ANY queries. + * SPH_RANK_FIELDMASK, added in version 0.9.9-rc2, returns a 32-bit mask with N-th bit corresponding to N-th fulltext field, numbering from 0. The bit will only be set when the respective field has any keyword occurences satisfiying the query. + * SPH_RANK_SPH04, added in version 1.10-beta, is generally based on the default SPH_RANK_PROXIMITY_BM25 ranker, but additionally boosts the matches when they occur in the very beginning or the very end of @@ -2122,6 +2216,7 @@ equal to it. (For instance, when the query is "Hyde Park", a document entitled "Hyde Park" should be ranked higher than a one entitled "Hyde Park, London" or "The Hyde Park Cafe".) + * SPH_RANK_EXPR, added in version 2.0.2-beta, lets you specify the ranking formula in run time. It exposes a number of internal text factors and lets you define how the final weight should be computed @@ -2145,8 +2240,11 @@ Legacy matching modes automatically select a ranker as follows: * SPH_MATCH_ALL uses SPH_RANK_PROXIMITY ranker; + * SPH_MATCH_ANY uses SPH_RANK_MATCHANY ranker; + * SPH_MATCH_PHRASE uses SPH_RANK_PROXIMITY ranker; + * SPH_MATCH_BOOLEAN uses SPH_RANK_NONE ranker. Expression based ranker (SPH_RANK_EXPR) @@ -2180,16 +2278,20 @@ * bm25 (integer), a document-level BM25 estimate (computed without keyword occurrence filtering). + * max_lcs (integer), a query-level maximum possible value that the sum(lcs*user_weight) expression can ever take. This can be useful for weight boost scaling. For instance, MATCHANY ranker formula uses this to guarantee that a full phrase match in any field rankes higher than any combination of partial matches in all fields. + * field_mask (integer), a document-level 32-bit mask of matched fields. + * query_word_count (integer), the number of unique keywords in a query, adjusted for a number of excluded keywords. For instance, both (one one one one) and (one !two) queries should assign a value of 1 to this factor, because there is just one unique non-excluded keyword. + * doc_word_count (integer), the number of unique keywords matched in the entire document. @@ -2222,17 +2324,21 @@ respective positions as they were in the query. Finally, if the query is 'hello world program' and the field contains 'hello world program', lcs will be 3. (Hopefully that is unsurpising at this point.) + * user_weight (integer), the user specified per-field weight (refer to SetFieldWeights() in SphinxAPI and OPTION field_weights in SphinxQL respectively). The weights default to 1 if not specified explicitly. + * hit_count (integer), the number of keyword occurrences that matched in the field. Note that a single keyword may occur multiple times. For example, if 'hello' occurs 3 times in a field and 'world' occurs 5 times, hit_count will be 8. + * word_count (integer), the number of unique keywords matched in the field. For example, if 'hello' and 'world' occur anywhere in a field, word_count will be 2, irregardless of how many times do both keywords occur. + * tf_idf (float), the sum of TF*IDF over all the keywords matched in the field. IDF is the Inverse Document Frequency, a floating point value between 0 and 1 that describes how frequent is the keywords @@ -2242,8 +2348,10 @@ field. As a side note, tf_idf is actually computed by summing IDF over all matched occurences. That's by construction equivalent to summing TF*IDF over all matched keywords. + * min_hit_pos (integer), the position of the first matched keyword occurrence, counted in words. Indexing begins from position 1. + * min_best_span_pos (integer), the position of the first maximum LCS occurrences span. For example, assume that our query was 'hello world program' and 'hello world' subphrase was matched twice in the field, @@ -2252,6 +2360,7 @@ never as a subphrase match. In that case, min_best_span_pos will be 13. Note how for the single keyword queries min_best_span_pos will always equal min_hit_pos. + * exact_hit (boolean), whether a query was an exact match of the entire current field. Used in the SPH04 ranker. @@ -2274,12 +2383,19 @@ gritty ranker details in a nicely readable fashion. * SPH_RANK_PROXIMITY_BM25 = sum(lcs*user_weight)*1000+bm25 + * SPH_RANK_BM25 = bm25 + * SPH_RANK_NONE = 1 + * SPH_RANK_WORDCOUNT = sum(hit_count*user_weight) + * SPH_RANK_PROXIMITY = sum(lcs*user_weight) + * SPH_RANK_MATCHANY = sum((word_count+(lcs-1)*max_lcs)*user_weight) + * SPH_RANK_FIELDMASK = field_mask + * SPH_RANK_SPH04 = sum((4*lcs+2*(min_hit_pos==1)+exact_hit)*user_weight)*1000+bm25 @@ -2293,36 +2409,67 @@ and functions. Here's the complete reference list for quick access. * Arithmetic operators: +, -, *, /, %, DIV, MOD + * Comparison operators: <, > <=, >=, =, <> + * Boolean operators: AND, OR, NOT + * Bitwise operators: &, | + * ABS() + * BIGINT() + * CEIL() + * COS() + * CRC32() + * DAY() + * EXP() + * FIBONACCI() + * FLOOR() + * GEODIST() + * IDIV() + * IF() + * IN() + * INTERVAL() + * LN() + * LOG10() + * LOG2() + * MAX() + * MIN() + * MONTH() + * NOW() + * POW() + * SIN() + * SINT() + * SQRT() + * YEAR() + * YEARMONTH() + * YEARMONTHDAY() 5.5.1. Operators @@ -2536,15 +2683,20 @@ * SPH_SORT_RELEVANCE mode, that sorts by relevance in descending order (best matches first); + * SPH_SORT_ATTR_DESC mode, that sorts by an attribute in descending order (bigger attribute values first); + * SPH_SORT_ATTR_ASC mode, that sorts by an attribute in ascending order (smaller attribute values first); + * SPH_SORT_TIME_SEGMENTS mode, that sorts by time segments (last hour/day/week/month) in descending order, and then by relevance in descending order; + * SPH_SORT_EXTENDED mode, that sorts by SQL-like combination of columns in ASC/DESC order; + * SPH_SORT_EXPR mode, that sorts by an arithmetic expression. SPH_SORT_RELEVANCE ignores any additional parameters and always sorts @@ -2568,10 +2720,15 @@ segments are as follows: * last hour, + * last day, + * last week, + * last month, + * last 3 months, + * everything else. These segments are hardcoded, but it is trivial to change them if @@ -2600,9 +2757,13 @@ Known internal attributes are: * @id (match ID) + * @weight (match weight) + * @rank (match weight) + * @relevance (match weight) + * @random (return results in random order) @rank and @relevance are just additional aliases to @weight. @@ -2642,10 +2803,14 @@ * SPH_GROUPBY_DAY, extracts year, month and day in YYYYMMDD format from timestamp; + * SPH_GROUPBY_WEEK, extracts year and first day of the week number (counting from year start) in YYYYNNN format from timestamp; + * SPH_GROUPBY_MONTH, extracts month in YYYYMM format from timestamp; + * SPH_GROUPBY_YEAR, extracts year in YYYY format from timestamp; + * SPH_GROUPBY_ATTR, uses attribute value itself for grouping. The final search result set then contains one best match per group. @@ -2657,6 +2822,7 @@ @weight, group-by sorting clause may also include: * @group (groupby function value), + * @count (amount of matches in group). The default mode is to sort by groupby value in descending order, ie. by @@ -2676,7 +2842,9 @@ * one most relevant match per each day when there were any matches published, + * with day number and per-day match count attached, + * sorted by day number in descending order (ie. recent days first). Starting with version 0.9.9-rc2, aggregate functions (AVG(), MIN(), MAX(), @@ -2698,9 +2866,12 @@ * setup several instances of Sphinx programs (indexer and searchd) on different servers; + * make the instances index (and search) different parts of data; + * configure a special distributed index on some of the searchd instances; + * and query this index. This index only contains references to other local and remote indexes - so @@ -2711,11 +2882,16 @@ following: 1. connects to configured remote agents; + 2. issues the query; + 3. sequentially searches configured local indexes (while the remote agents are searching); + 4. retrieves remote agents' search results; + 5. merges all the results together, removing the duplicates; + 6. sends the merged resuls to client. From the application's point of view, there are no differences between @@ -2734,6 +2910,7 @@ whole cluster, and search requests could be balanced between masters to achieve a kind of HA (high availability) in case any of the nodes fails; + 2. if running within a single multi-CPU or multi-core machine, there would be only 1 searchd instance quering itself as an agent and thus utilizing all CPUs/core. @@ -2772,11 +2949,17 @@ Match mode can take one of the following values: * "all" for SPH_MATCH_ALL mode; + * "any" for SPH_MATCH_ANY mode; + * "phr" for SPH_MATCH_PHRASE mode; + * "bool" for SPH_MATCH_BOOLEAN mode; + * "ext" for SPH_MATCH_EXTENDED mode; + * "ext2" for SPH_MATCH_EXTENDED2 mode; + * "scan" if the full scan mode was used, either by being specified with SPH_MATCH_FULLSCAN, or if the query was empty (as documented under Matching Modes) @@ -2784,9 +2967,13 @@ Sort mode can take one of the following values: * "rel" for SPH_SORT_RELEVANCE mode; + * "attr-" for SPH_SORT_ATTR_DESC mode; + * "attr+" for SPH_SORT_ATTR_ASC mode; + * "tsegs" for SPH_SORT_TIME_SEGMENTS mode; + * "ext" for SPH_SORT_EXTENDED mode. Additionally, if searchd was started with --iostats, there will be a block @@ -2831,9 +3018,13 @@ follows. * All request types should be logged. (This is still work in progress.) + * Full statement data will be logged where possible. + * Errors and warnings are logged. + * The log should be automatically replayable via SphinxQL. + * Additional performance counters (currently, per-agent distributed query times) are logged. @@ -3039,8 +3230,11 @@ collations. 1. libc_ci + 2. libc_cs + 3. utf8_general_ci + 4. binary The first two collations rely on several standard C library (libc) calls @@ -3103,9 +3297,12 @@ * Functions can take integer (both 32-bit and 64-bit), float, string, or MVA arguments. + * Functions can return integer or float values. + * Functions can check the argument number, types, and names and raise errors. + * Only simple functions (that is, non-aggregate ones) are currently supported. @@ -3170,7 +3367,9 @@ the main function must be one of the following: * int for the functions that return INT. + * sphinx_int64_t for the functions that return BIGINT. + * float for the functions that return FLOAT. The calling sequence is as follows. myfunc_init() is called once when @@ -3355,15 +3554,18 @@ specified file, in a MySQL compatible syntax. Resulting dumps are the exact representation of data as received by indexer and help to repeat indexing-time issues. + * --verbose guarantees that every row that caused problems indexing (duplicate, zero, or missing document ID; or file field IO issues; etc) will be reported. By default, this option is off, and problem summaries may be reported instead. + * --sighup-each is useful when you are rebuilding many big indexes, and want each one rotated into searchd as soon as possible. With --sighup-each, indexer will send a SIGHUP signal to searchd after succesfully completing the work on each index. (The default behavior is to send a single SIGHUP after all the indexes were built.) + * --print-queries prints out SQL queries that indexer sends to the database, along with SQL connection and disconnection events. That is useful to diagnose and fix problems with SQL sources. @@ -3390,8 +3592,10 @@ * --help (-h for short) lists all of the parameters that can be called in your particular build of searchd. + * --config (-c for short) tells searchd to use the given file as its configuration, just as with indexer above. + * --stop is used to asynchronously stop searchd, using the details of the PID file as specified in the sphinx.conf file, so you may also need to confirm to searchd which configuration file to use with the @@ -3412,8 +3616,11 @@ Possible exit codes are as follows: * 0 on success; + * 1 if connection to running searchd daemon failed; + * 2 if daemon reported an error during shutdown; + * 3 if daemon crashed during shutdown. * --status command is used to query running searchd instance status, @@ -3454,6 +3661,7 @@ * --logdebug enables additional debug output in the daemon log. Should only be needed rarely, to assist with debugging issues that could not be easily reproduced on request. + * --iostats is used in conjuction with the logging options (the query_log will need to have been activated in sphinx.conf) to provide more detailed information on a per-query basis as to the input/output @@ -3493,6 +3701,7 @@ handler (listener) to be used for connections on this socket. Supported protocol values are 'sphinx' (Sphinx 0.9.x API protocol) and 'mysql41' (MySQL protocol used since 4.1 upto at least 5.1). + * --index (or -i for short) forces this instance of searchd only to serve the specified index. Like --port, above, this is usually for debugging purposes; more long-term changes would generally @@ -3504,6 +3713,7 @@ from the index (stopwords, wordforms, exceptions, etc). This is useful for picking up indexes built on another machine with possibly different path layouts. + * --replay-flags= switch, added in version 2.0.2-beta, can be used to specify a list of extra binary log replay options. The supported options are: @@ -3630,10 +3840,12 @@ * --config (-c for short) tells search to use the given file as its configuration, just as with indexer above. + * --index (-i for short) tells search to limit searching to the specified index only; normally it would attempt to search all of the physical indexes listed in sphinx.conf, not any distributed ones. + * --stdin tells search to accept the query from the standard input, rather than the command line. This can be useful for testing purposes whereby you could feed input via pipes and from scripts. @@ -3643,10 +3855,12 @@ * --any (-a for short) changes the matching mode to match any of the words as part of the query (word1 OR word2 OR word3). In the API this would be equivalent to passing SPH_MATCH_ANY to SetMatchMode. + * --phrase (-p for short) changes the matching mode to match all of the words as part of the query, and do so in the phrase given (not including punctuation). In the API this would be equivalent to passing SPH_MATCH_PHRASE to SetMatchMode. + * --boolean (-b for short) changes the matching mode to Boolean matching. Note if using Boolean syntax matching on the command line, you may need to escape the symbols (with a backslash) to avoid the @@ -3655,9 +3869,11 @@ process, although this can be resolved by using --stdin, as below. In the API this would be equivalent to passing SPH_MATCH_BOOLEAN to SetMatchMode. + * --ext (-e for short) changes the matching mode to extended matching which provides various text querying operators. In the API this would be equivalent to passing SPH_MATCH_EXTENDED to SetMatchMode. + * --filter (-f for short) filters the results such that only documents where the attribute given (attr) matches the value given (v). For example, --filter deleted 0 only matches documents with @@ -3672,21 +3888,25 @@ matches back to the number given. If a 'group' is specified, this will be the number of grouped results. This defaults to 20 results if not specified (as do the APIs) + * --offset (-o for short) offsets the result list by the number of places set by the count; this would be used for pagination through results, where if you have 20 results per 'page', the second page would begin at offset 20, the third page at offset 40, etc. + * --group (-g for short) specifies that results should be grouped together based on the attribute specified. Like the GROUP BY clause in SQL, it will combine all results where the attribute given matches, and returns a set of results where each returned result is the best from each group. Unless otherwise specified, this will be the best match on relevance. + * --groupsort (-gs for short) instructs that when results are grouped with --group, the expression given in shall determine the order of the groups. Note, this does not specify which is the best item within the group, only the order in which the groups themselves shall be returned. + * --sortby (-s for short) specifies that results should be sorted in the order listed in . This allows you to specify the order you wish results to be presented in, ordering by @@ -3699,6 +3919,7 @@ Additionally, like the regular sorting modes, if --group (grouping) is being used, this will state how to establish the best match within each group. + * --sortexpr expr (-S expr for short) specifies that the search results should be presented in an order determined by an arithmetic expression, stated in expr. For example: --sortexpr "@weight + ( @@ -3706,12 +3927,15 @@ be quoted to avoid the shell dealing with the asterisk). Extended sort mode is discussed in more detail under the SPH_SORT_EXTENDED entry under the Sorting modes section of the manual. + * --sort=date specifies that the results should be sorted by descending (i.e. most recent first) date. This requires that there is an attribute in the index that is set as a timestamp. + * --rsort=date specifies that the results should be sorted by ascending (i.e. oldest first) date. This requires that there is an attribute in the index that is set as a timestamp. + * --sort=ts specifies that the results should be sorted by timestamp in groups; it will return all of the documents whose timestamp is within the last hour, then sorted within that bracket for relevance. After, @@ -3791,26 +4015,34 @@ The report provides a breakdown of all the index settings, in particular the entire attribute and field list. Prior to 0.9.9-rc2, this command was present in CLI search utility. + * --dumpconfig FILENAME.sph dumps the index definition from the given index header file in (almost) compliant sphinx.conf file format. Added in version 2.0.1-beta. + * --dumpheader INDEXNAME dumps index header by index name with looking up the header path in the configuration file. + * --dumpdocids INDEXNAME dumps document IDs by index name. It takes the data from attribute (.spa) file and therefore requires docinfo=extern to work. + * --dumphitlist INDEXNAME KEYWORD dumps all the hits (occurences) of a given keyword in a given index, with keyword specified as text. + * --dumphitlist INDEXNAME --wordid ID dumps all the hits (occurences) of a given keyword in a given index, with keyword specified as internal numeric ID. + * --htmlstrip INDEXNAME filters stdin using HTML stripper settings for a given index, and prints the filtering results to stdout. Note that the settings will be taken from sphinx.conf, and not the index header. + * --check INDEXNAME checks the index data files for consistency errors that might be introduced either by bugs in indexer and/or hardware faults. Starting with version 2.0.2-beta, --check also works on RT indexes, but checks disk chunks only. + * --strip-path strips the path names from all the file names referenced from the index (stopwords, wordforms, exceptions, etc). This is useful for checking indexes built on another machine with possibly different @@ -3877,9 +4109,11 @@ AS is optional. Special names such as @id and @weight should currently be used with leading at-sign. This at-sign requirement will be lifted in the future. + * FROM clause. FROM clause should contain the list of indexes to search through. Unlike in regular SQL, comma means enumeration of full-text indexes as in Query() API call rather than JOIN. + * WHERE clause. This clause will map both to fulltext query and filters. Comparison operators (=, !=, <, >, <=, >=), IN, AND, NOT, and BETWEEN are all supported and map directly to filters. OR is not supported yet @@ -3889,6 +4123,7 @@ Starting with version 2.0.1-beta, {col_name | expr_alias} [NOT] IN @uservar condition syntax is supported. (Refer to Section 7.7, <> for a discussion of global user variables.) + * GROUP BY clause. Currently only supports grouping by a single column. The column however can be a computed expression: @@ -3941,6 +4176,7 @@ * LIMIT clause. Both LIMIT N and LIMIT M,N forms are supported. Unlike in regular SQL (but like in Sphinx API), an implicit LIMIT 0,20 is present by default. + * OPTION clause. This is a Sphinx specific extension that lets you control a number of per-query options. The syntax is: @@ -3950,17 +4186,26 @@ * 'ranker' - any of 'proximity_bm25', 'bm25', 'none', 'wordcount', 'proximity', 'matchany', or 'fieldmask' + * 'max_matches' - integer (per-query max matches value) + * 'cutoff' - integer (max found matches threshold) + * 'max_query_time' - integer (max search time threshold, msec) + * 'retry_count' - integer (distributed retries count) + * 'retry_delay' - integer (distributed retry delay, msec) + * 'field_weights' - a named integer list (per-field user weights for ranking) + * 'index_weights' - a named integer list (per-index user weights for ranking) + * 'reverse_scan' - 0 or 1, lets you control the order in which full-scan query processes the rows + * 'comment' - string, user comment that gets copied to a query log file @@ -4144,7 +4389,9 @@ There are the following classes of the variables: 1. per-session server variable (1.10-beta and above) + 2. global server variable (2.0.1-beta and above) + 3. global user variable (2.0.1-beta and above) Global user variables are shared between concurrent sessions. Currently, @@ -4422,8 +4669,8 @@ except for strings can be updated. Previously, some of the types were not supported. -where_condition uses the same syntax as the SELECT statement (see -Section 7.1, <> for details). When assigning the out-of-range values to 32-bit attributes, they will be trimmed to their lower 32 bits without a prompt. For example, if you try to @@ -4475,8 +4722,10 @@ indexes. The complete list is as follows. * Target RT index needs to be empty. + * Source disk index needs to have index_sp=0, boundary_step=0, stopword_step=1, dict=crc settings. + * Source disk index needs to have an empty index_zones setting. | mysql> DESC rt; @@ -4717,6 +4966,7 @@ * @ID magic name is deprecated in favor of ID. Document ID is considered an attribute. + * WEIGHT is no longer implicitly returned, because it is not actually a column (an index attribute), but rather an internal function computed per each row (a match). You have to explicitly ask for it, @@ -4737,6 +4987,7 @@ based on their position in the result set rather than the name (for instance, by using mysql_fetch_row() rather than mysql_fetch_assoc() in PHP), check and fix the order of columns in your queries. + * SELECT * return the columns in index order, as it used to, including the ID column. However, SELECT * does not automatically return WEIGHT(). To update such queries in case you access columns by names, @@ -5071,7 +5322,7 @@ 8.3.2. SetRankingMode --------------------- -Prototype: function SetRankingMode ( $ranker ) +Prototype: function SetRankingMode ( $ranker, $rankexpr="" ) Sets ranking mode (aka ranker). Only available in SPH_MATCH_EXTENDED matching mode. Parameter must be a constant specifying one of the known @@ -5090,6 +5341,10 @@ setting the appropriate ranking mode. The list of the modes is available in Section 5.4, <>. +$rankexpr argument was added in version 2.0.2-beta. It lets you specify +a ranking formula to use with the expression based ranker, that is, when +$ranker is set to SPH_RANK_EXPR. In all other cases, $rankexpr is ignored. + 8.3.3. SetSortMode ------------------ @@ -5618,14 +5873,25 @@ only one(!) first(!) local agent and several remotes. "load_files_scattered": - Added in version 2.0.2-beta. It assumes "load_files" option, and works - only with distributed snippets generation with remote agents. The source - files for snippets could be distributed among different agents, and the - main daemon will merge together all non-erroneous results. So, if one - agent of the distributed index has 'file1.txt', another has 'file2.txt' - and you call for the snippets with both these files, the sphinx will - merge results from the agents together, so you will get the snippets - from both 'file1.txt' and 'file2.txt'. + Added in version 2.0.2-beta. It works only with distributed snippets + generation with remote agents. The source files for snippets could be + distributed among different agents, and the main daemon will merge + together all non-erroneous results. So, if one agent of the distributed + index has 'file1.txt', another has 'file2.txt' and you call for the + snippets with both these files, the sphinx will merge results from the + agents together, so you will get the snippets from both 'file1.txt' and + 'file2.txt'. Boolean, default is false. + + If the "load_files" is also set, the request will return the error in + case if any of the files is not available anywhere. Otherwise (if + "load_files" is not set) it will just return the empty strings for all + absent files. The master instance reset this flag when distributes the + snippets among agents. So, for agents the absence of a file is not + critical error, but for the master it might be so. If you want to be + sure that all snippets are actually created, set both + "load_files_scattered" and "load_files". If the absense of some snippets + caused by some agents is not critical for you - set just + "load_files_scattered", leaving "load_files" not set. "html_strip_mode": Added in version 1.10-beta. HTML stripping mode setting. Defaults to @@ -5833,8 +6099,10 @@ Obvious SphinxSE applications include: * easier porting of MySQL FTS applications to Sphinx; + * allowing Sphinx use with progamming languages for which native APIs are not available yet; + * optimizations when additional Sphinx result set processing on MySQL side is required (eg. JOINs with original document tables, additional MySQL-side filtering, etc). @@ -5858,8 +6126,6 @@ 9.2.1. Compiling MySQL 5.0.x with SphinxSE ------------------------------------------ -Skips steps 1-3 if using already prepared delta tarball. - 1. copy sphinx.5.0.yy.diff patch file into MySQL sources directory and run @@ -5890,8 +6156,6 @@ 9.2.2. Compiling MySQL 5.1.x with SphinxSE ------------------------------------------ -Skip steps 1-2 if using already prepared delta tarball. - 1. in MySQL sources directory, create storage/sphinx directory in and copy all files in mysqlse directory from Sphinx sources there. Example: @@ -5989,8 +6253,10 @@ number of options can be specified. Available options are: * query - query text; + * mode - matching mode. Must be one of "all", "any", "phrase", "boolean", or "extended". Default is "all"; + * sort - match sorting mode. Must be one of "relevance", "attr_desc", "attr_asc", "time_segments", or "extended". In all modes besides "relevance" attribute name (or sorting clause for "extended") is also @@ -6000,13 +6266,16 @@ | ... WHERE query='test;sort=extended:@weight desc, group_id asc'; * offset - offset into result set, default is 0; + * limit - amount of matches to retrieve from result set, default is 20; + * index - names of the indexes to search: | ... WHERE query='test;index=test1;'; | ... WHERE query='test;index=test1,test2,test3;'; * minid, maxid - min and max document ID to match; + * weights - comma-separated list of weights to be assigned to Sphinx full-text fields: @@ -6082,9 +6351,13 @@ * ranker - a ranking function to use with "extended" matching mode, as in SetRankingMode() API call (the only mode that supports full query syntax). Known values are "proximity_bm25", "bm25", "none", - "wordcount", "proximity", "matchany", and "fieldmask". + "wordcount", "proximity", "matchany", "fieldmask"; and, starting with + 2.0.4-release, "expr:EXPRESSION" syntax to support expression-based + ranker (where EXPRESSION should be replaced with your specific ranking + formula): | ... WHERE query='test;mode=extended;ranker=bm25;'; + | ... WHERE query='test;mode=extended;ranker=expr:sum(lcs);'; * geoanchor - geodistance anchor, as in SetGeoAnchor() API call. Takes 4 parameters which are latitude and longiture attribute names, and @@ -6205,6 +6478,7 @@ 1. check that headers and libraries for your DBMS are properly installed (for instance, check that mysql-devel package is present); + 2. report Sphinx version and config file (be sure to remove the passwords!), MySQL (or PostgreSQL) configuration info, gcc version, OS version and CPU type (ie. x86, x86-64, PowerPC, etc): @@ -6225,6 +6499,7 @@ 1. describe the bug (ie. both the expected behavior and actual behavior) and all the steps necessary to reproduce it; + 2. include Sphinx version and config file (be sure to remove the passwords!), MySQL (or PostgreSQL) version, gcc version, OS version and CPU type (ie. x86, x86-64, PowerPC, etc): @@ -6243,12 +6518,16 @@ 4. reindex to check if any assertions are triggered (in this case, it's likely that the index is corrupted and causing problems); + 5. if the bug does not reproduce with debug versions, revert to non-debug and mention it in your report; + 6. if the bug could be easily reproduced with a small (1-100 record) part of your database, please provide a gzipped dump of that part; + 7. if the problem is related to searchd, include relevant entries from searchd.log and query.log in your bug report; + 8. if the problem is related to searchd, try running it in console mode and check if it dies with an assertion: @@ -6268,9 +6547,11 @@ | ulimit -c 32768 2. run the program and try to reproduce the bug; + 3. if the program crashes (either with or without an assertion), find the core file in current directory (it should typically print out "Segmentation fault (core dumped)" message); + 4. if the program hangs, use kill -SEGV from another console to force it to exit and dump core: @@ -6350,19 +6631,20 @@ 11.1.36. xmlpipe_field_string 11.1.37. xmlpipe_field_wordcount 11.1.38. xmlpipe_attr_uint - 11.1.39. xmlpipe_attr_bool - 11.1.40. xmlpipe_attr_timestamp - 11.1.41. xmlpipe_attr_str2ordinal - 11.1.42. xmlpipe_attr_float - 11.1.43. xmlpipe_attr_multi - 11.1.44. xmlpipe_attr_multi_64 - 11.1.45. xmlpipe_attr_string - 11.1.46. xmlpipe_fixup_utf8 - 11.1.47. mssql_winauth - 11.1.48. mssql_unicode - 11.1.49. unpack_zlib - 11.1.50. unpack_mysqlcompress - 11.1.51. unpack_mysqlcompress_maxsize + 11.1.39. xmlpipe_attr_bigint + 11.1.40. xmlpipe_attr_bool + 11.1.41. xmlpipe_attr_timestamp + 11.1.42. xmlpipe_attr_str2ordinal + 11.1.43. xmlpipe_attr_float + 11.1.44. xmlpipe_attr_multi + 11.1.45. xmlpipe_attr_multi_64 + 11.1.46. xmlpipe_attr_string + 11.1.47. xmlpipe_fixup_utf8 + 11.1.48. mssql_winauth + 11.1.49. mssql_unicode + 11.1.50. unpack_zlib + 11.1.51. unpack_mysqlcompress + 11.1.52. unpack_mysqlcompress_maxsize 11.2. Index configuration options 11.2.1. type @@ -6587,7 +6869,9 @@ follows: * CLIENT_COMPRESS = 32; can use compression protocol + * CLIENT_SSL = 2048; switch to SSL after handshake + * CLIENT_SECURE_CONNECTION = 32768; new 4.1 authentication For instance, you can specify 2080 (2048+32) to use both compression and @@ -6709,7 +6993,9 @@ where * FIELD-NAME is a joined/payload field name; + * QUERY is an SQL query that must fetch values to index. + * RANGE-QUERY is an optional SQL query that fetches a range of values to index. (Added in version 2.0.1-beta.) @@ -6813,8 +7099,11 @@ substitutions: * $start=12, $end=1011 + * $start=1012, $end=2011 + * $start=2012, $end=3011 + * $start=3012, $end=3456 Example: @@ -6936,7 +7225,8 @@ Example: - | sql_attr_timestamp = UNIX_TIMESTAMP(added_datetime) AS added_ts + | # sql_query = ... UNIX_TIMESTAMP(added_datetime) AS added_ts ... + | sql_attr_timestamp = added_ts 11.1.21. sql_attr_str2ordinal ----------------------------- @@ -7023,8 +7313,11 @@ where * ATTR-TYPE is 'uint', 'bigint' or 'timestamp' + * SOURCE-TYPE is 'field', 'query', or 'ranged-query' + * QUERY is SQL query used to fetch all ( docid, attrvalue ) pairs + * RANGE-QUERY is SQL query used to fetch min and max ID values, similar to 'sql_query_range' @@ -7284,9 +7577,20 @@ Example: - | xmlpipe_attr_uint = author + | xmlpipe_attr_uint = author_id + +11.1.39. xmlpipe_attr_bigint +---------------------------- + +xmlpipe signed 64-bit integer attribute declaration. Multi-value, optional. +Applies to xmlpipe2 source type only. Syntax fully matches that of +sql_attr_bigint. + +Example: + + | xmlpipe_attr_bigint = my_bigint_id -11.1.39. xmlpipe_attr_bool +11.1.40. xmlpipe_attr_bool -------------------------- xmlpipe boolean attribute declaration. Multi-value, optional. Applies to @@ -7296,7 +7600,7 @@ | xmlpipe_attr_bool = is_deleted # will be packed to 1 bit -11.1.40. xmlpipe_attr_timestamp +11.1.41. xmlpipe_attr_timestamp ------------------------------- xmlpipe UNIX timestamp attribute declaration. Multi-value, optional. @@ -7307,7 +7611,7 @@ | xmlpipe_attr_timestamp = published -11.1.41. xmlpipe_attr_str2ordinal +11.1.42. xmlpipe_attr_str2ordinal --------------------------------- xmlpipe string ordinal attribute declaration. Multi-value, optional. @@ -7318,7 +7622,7 @@ | xmlpipe_attr_str2ordinal = author_sort -11.1.42. xmlpipe_attr_float +11.1.43. xmlpipe_attr_float --------------------------- xmlpipe floating point attribute declaration. Multi-value, optional. @@ -7330,7 +7634,7 @@ | xmlpipe_attr_float = lat_radians | xmlpipe_attr_float = long_radians -11.1.43. xmlpipe_attr_multi +11.1.44. xmlpipe_attr_multi --------------------------- xmlpipe MVA attribute declaration. Multi-value, optional. Applies to @@ -7345,7 +7649,7 @@ | xmlpipe_attr_multi = taglist -11.1.44. xmlpipe_attr_multi_64 +11.1.45. xmlpipe_attr_multi_64 ------------------------------ xmlpipe MVA attribute declaration. Declares the BIGINT (signed 64-bit @@ -7361,7 +7665,7 @@ | xmlpipe_attr_multi_64 = taglist -11.1.45. xmlpipe_attr_string +11.1.46. xmlpipe_attr_string ---------------------------- xmlpipe string declaration. Multi-value, optional. Applies to xmlpipe2 @@ -7374,7 +7678,7 @@ | xmlpipe_attr_string = subject -11.1.46. xmlpipe_fixup_utf8 +11.1.47. xmlpipe_fixup_utf8 --------------------------- Perform Sphinx-side UTF-8 validation and filtering to prevent XML parser @@ -7394,7 +7698,7 @@ | xmlpipe_fixup_utf8 = 1 -11.1.47. mssql_winauth +11.1.48. mssql_winauth ---------------------- MS SQL Windows authentication flag. Boolean, optional, default value is @@ -7410,7 +7714,7 @@ | mssql_winauth = 1 -11.1.48. mssql_unicode +11.1.49. mssql_unicode ---------------------- MS SQL encoding type flag. Boolean, optional, default value is 0 (false). @@ -7427,7 +7731,7 @@ | mssql_unicode = 1 -11.1.49. unpack_zlib +11.1.50. unpack_zlib -------------------- Columns to unpack using zlib (aka deflate, aka gunzip). Multi-value, @@ -7445,7 +7749,7 @@ | unpack_zlib = col1 | unpack_zlib = col2 -11.1.50. unpack_mysqlcompress +11.1.51. unpack_mysqlcompress ----------------------------- Columns to unpack using MySQL UNCOMPRESS() algorithm. Multi-value, @@ -7463,7 +7767,7 @@ | unpack_mysqlcompress = body_compressed | unpack_mysqlcompress = description_compressed -11.1.51. unpack_mysqlcompress_maxsize +11.1.52. unpack_mysqlcompress_maxsize ------------------------------------- Buffer size for UNCOMPRESS()ed data. Optional, default value is 16M. @@ -7579,13 +7883,20 @@ * .spa stores document attributes (used in extern docinfo storage mode only); + * .spd stores matching document ID lists for each word ID; + * .sph stores index header information; + * .spi stores word lists (word IDs and pointers to .spd file); + * .spk stores kill-lists; + * .spm stores MVA data; + * .spp stores hit (aka posting, aka word occurence) lists for each word ID; + * .sps stores string attribute data. Example: @@ -7665,11 +7976,17 @@ follows: * none - do not perform any morphology processing; + * stem_en - apply Porter's English stemmer; + * stem_ru - apply Porter's Russian stemmer; + * stem_enru - apply Porter's English and Russian stemmers; + * stem_cz - apply Czech stemmer; + * soundex - replace keywords with their SOUNDEX code; + * metaphone - replace keywords with their METAPHONE code. Additional values provided by libstemmer are in 'libstemmer_XXX' format, @@ -7773,16 +8090,20 @@ * Question and excalamation signs (? and !) are always a sentence boundary. + * Trailing dot (.) is a sentence boundary, except: * When followed by a letter. That's considered a part of an abbreviation (as in "S.T.A.L.K.E.R" or "Goldman Sachs S.p.A."). + * When followed by a comma. That's considered an abbreviation followed by a comma (as in "Telecom Italia S.p.A., founded in 1994"). + * When followed by a space and a small letter. That's considered an abbreviation within a sentence (as in "News Corp. announced in Februrary"). + * When preceded by a space and a capital letter, and followed by a space. That's considered a middle initial (as in "John D. Doe"). @@ -7869,6 +8190,12 @@ first document, as expected, even though "the" in the second one is stopped. +Stopwords files can either be created manually, or semi-automatically. +indexer provides a mode that creates a frequency dictionary of the index, +sorted by the keyword frequency, see --buildstops and --buildfreqs switch +in Section 6.1, <>. Top keywords from that +dictionary can usually be used as stopwords. + Example: | stopwords = /usr/local/sphinx/data/stopwords.txt @@ -7946,10 +8273,10 @@ Short summary of the differences is as follows: * exceptions are case sensitive, wordforms are not; - * exceptions allow to detect sequences of tokens, wordforms work with - single words only; + * exceptions can use special characters that are not in charset_table, wordforms fully obey charset_table; + * exceptions can underperform on huge dictionaries, wordforms handle millions of entries well. @@ -8257,12 +8584,15 @@ 1. "abcdef" query will match only those documents that contain the exact "abcdef" word in them. + 2. "abc*" query will match those documents that contain any words starting with "abc" (including the documents which contain the exact "abc" word only); + 3. "*cde*" query will match those documents that contain any words which have "cde" characters in any part of the word (including the documents which contain the exact "cde" word only). + 4. "*def" query will match those documents that contain any words ending with "def" (including the documents that contain the exact "def" word only). @@ -8442,12 +8772,19 @@ default is empty. This setting is used to declare local indexes that will be searched when -given distributed index is searched. All local indexes will be searched -sequentially, utilizing only 1 CPU or core; to parallelize processing, you -can configure searchd to query itself (refer to Section 11.2.31, <> -for the details). There might be several local indexes declared per each -distributed index. Any local index can be mentioned several times in other -distributed indexes. +given distributed index is searched. Many local indexes can be declared per +each distributed index. Any local index can also be mentioned several times +in different distributed indexes. + +Note that by default all local indexes will be searched sequentially, +utilizing only 1 CPU or core. To parallelize processing of the local parts +in the distributed index, you should use dist_threads directive, see +Section 11.4.29, <>. + +Before dist_threads, there also was a legacy solution to configure searchd +to query itself instead of using local indexes (refer to Section 11.2.31, +<> for the details). However, that creates redundant CPU and network +load, and dist_threads is now strongly suggested instead. Example: @@ -9138,7 +9475,9 @@ that behavior. The values it takes are: * ignore_field, index the current document without field; + * skip_document, skip the current document but continue indexing; + * fail_index, fail indexing with an error message. The problems that can arise are: open error, size error (file too big), and @@ -9378,10 +9717,15 @@ and works as follows: 1. new queries are temporarly rejected (with "retry" error code); + 2. searchd waits for all currently running queries to finish; + 3. old index is deallocated and its files are renamed; + 4. new index files are renamed and required RAM is allocated; + 5. new index attribute and dictionary data is preloaded to RAM; + 6. searchd resumes serving queries from new index. However, if there's a lot of attribute or dictionary data, then preloading @@ -9391,11 +9735,15 @@ With seamless rotate enabled, rotation works as follows: 1. new index RAM storage is allocated; + 2. new index attribute and dictionary data is asynchronously preloaded to RAM; + 3. on success, old index is deallocated and both indexes' files are renamed; + 4. on failure, new index is deallocated; + 5. at any given moment, queries are served either from old or new index copy. @@ -9723,8 +10071,9 @@ Binary log (aka transaction log) files path. Optional, default is build-time configured data directory. Introduced in version 1.10-beta. -Binary logs are used for crash recovery of RT index data that would -otherwise only be stored in RAM. When logging is enabled, every transaction +Binary logs are used for crash recovery of RT index data, and also of +attributes updates of plain disk indices that would otherwise only be +stored in RAM untill flush. When logging is enabled, every transaction COMMIT-ted into RT index gets written into a log file. Logs are then automatically replayed on startup after an unclean shutdown, recovering the logged changes. @@ -9737,6 +10086,12 @@ Empty value disables binary logging. That improves performance, but puts RT index data at risk. +WARNING! It is strongly recommended to always explicitly define +'binlog_path' option in your config. Otherwise, the default path, which in +most cases is the same as working folder, may point to the folder with no +write access (for example, /usr/local/var/data). In this case, the searchd +will not start at all. + Example: | binlog_path = # disable logging @@ -9754,8 +10109,10 @@ * 0, flush and sync every second. Best performance, but up to 1 second worth of committed transactions can be lost both on daemon crash, or OS/hardware crash. + * 1, flush and sync every transaction. Worst performance, but every committed transaction data is guaranteed to be saved. + * 2, flush every transaction, sync every second. Good performance, and every committed transaction is guaranteed to be saved in case of daemon crash. However, in case of OS/hardware crash up to 1 second @@ -9975,224 +10332,476 @@ Table of Contents -A.1. Version 2.0.2-beta, 15 nov 2011 -A.2. Version 2.0.1-beta, 22 apr 2011 -A.3. Version 1.10-beta, 19 jul 2010 -A.4. Version 0.9.9-release, 02 dec 2009 -A.5. Version 0.9.9-rc2, 08 apr 2009 -A.6. Version 0.9.9-rc1, 17 nov 2008 -A.7. Version 0.9.8.1, 30 oct 2008 -A.8. Version 0.9.8, 14 jul 2008 -A.9. Version 0.9.7, 02 apr 2007 -A.10. Version 0.9.7-rc2, 15 dec 2006 -A.11. Version 0.9.7-rc1, 26 oct 2006 -A.12. Version 0.9.6, 24 jul 2006 -A.13. Version 0.9.6-rc1, 26 jun 2006 +A.1. Version 2.0.4-release, 02 mar 2012 +A.2. Version 2.0.3-release, 23 dec 2011 +A.3. Version 2.0.2-beta, 15 nov 2011 +A.4. Version 2.0.1-beta, 22 apr 2011 +A.5. Version 1.10-beta, 19 jul 2010 +A.6. Version 0.9.9-release, 02 dec 2009 +A.7. Version 0.9.9-rc2, 08 apr 2009 +A.8. Version 0.9.9-rc1, 17 nov 2008 +A.9. Version 0.9.8.1, 30 oct 2008 +A.10. Version 0.9.8, 14 jul 2008 +A.11. Version 0.9.7, 02 apr 2007 +A.12. Version 0.9.7-rc2, 15 dec 2006 +A.13. Version 0.9.7-rc1, 26 oct 2006 +A.14. Version 0.9.6, 24 jul 2006 +A.15. Version 0.9.6-rc1, 26 jun 2006 -A.1. Version 2.0.2-beta, 15 nov 2011 +A.1. Version 2.0.4-release, 02 mar 2012 +======================================= + +Bug fixes +--------- + + * fixed #605, pack vs mysql compress + + * fixed #783, #862, #917, #985, #990, #1032 documentation bugs + + * fixed #885, bitwise AND/OR were not available via API + + * fixed #984, crash on indexing data with MAGIC_CODE_ZONE symbol + + * fixed #1004, RT index loses words from dictionary on segments merging + with id64 enabled + + * fixed #1035, daemon doesn't properly handle FDs in case of socket + overflow FD_SETSIZE ( *nix, preopen_indexes=0, worker=threads ) + + * fixed #1038, quoted string for API select + + * fixed #1046, head SPZ overflow, snippet generation at non fast with + SPZ + + * fixed #1048, distributed index can't sort \ filter because of missed + attributes + + * fixed #1050, expression ranker vs agents + + * fixed #1051, added MVA64 support to UDFs + + * fixed #1054, max_query_time not handled properly on searching at RT + index + + * fixed #1055, expansion_limit on searching at RT disk chunks + + * fixed #1057, daemon crashes on generating snippet with 0 documents + provided + + * fixed #1060, load_files_scattered don't work + + * fixed #1065, libsphinxclient vs distribute index (agents) + + * fixed #1067, modifiers were not escaped in legacy query emulation + + * fixed #1071, master - agent communication got slower for a large query + + * fixed #1076, #1077, (redundant copying, and a possible mutex leak with + uservars) + + * fixed #1078, blended vs FIELD_END + + * fixed #1084 crash \ index corruption on loading persist MVA + + * fixed #1091, RT attach of plain index with string \ MVA attributes + prior regular attributes + + * fixed #1092, update got binloged with wrong TID + + * fixed #1098, crash on creating large expression + + * fixed #1099, cleaning up temporary files on fail of indexing + + * fixed #1100, missing xmlpipe_attr_bigint config directive + + * fixed #1101, now ignoring dashes within keywords when dash is not in + charset_table + + * fixed #1103, ZONE operator incorrectly works on more than one keywords + in a simple zone + + * fixed #1106, optimized WHERE id=value, WHERE id IN (values_list) + clauses used in SELECT, UPDATE statements + + * fixed #1112, Sphinx doesn't work out-of-the-box because the collision + of binlog_path option + + * fixed #1116, crash on FLUSH RTINDEX unknown-index-name + + * fixed #1117, occasional RT headers corruption (leading to crashes + and/or missing results) + + * fixed #1119, missing expression ranker support in SphinxSE + + * fixed #1120, negative total_found, docs and hits counter on huge + indexes + +A.2. Version 2.0.3-release, 23 dec 2011 +======================================= + +Bug fixes +--------- + + * fixed #1031, SphinxQL parsing syntax for MVA at insert \ replace + statements + + * fixed #1027, stalls on attribute update in high-concurrency load + + * fixed #1026, daemon crash on malformed API command + + * fixed #1021, max_children option has been ignored with worker=threads + + * fixed #1020, crash on large attribute files loading + + * fixed #1014, crash on rotation when index has been removed from config + file (worker=threads, *nix box) + + * fixed #1001, broken MVA files in RT index while saving disk chunk + + * fixed #995, crash on empty MVA updates + + * fixed #994, crash on daemon shutdown with seamless_rotate=0 and + workers=threads + + * fixed #993, #998, crash on replay DELETE statement vs RT index with + dict=keywords, fixed sequential INSERT into dict=keywords index right + after INSERT into dict=crc index + + * fixed #991, crash on indexing mssql source with mssql_unicode enabled + + * fixed #983, #950, crash on host name lookup (SphinxSE with MySQL 5.5) + + * fixed #981, snippet inconsistency with allow_empty=0 + + * fixed #980, broken index produced by index merge in rare cases + + * fixed #971, absent error message at master on agent "maxed out" + + * fixed #695, #815, #835, #866, malformed warnings in SphinxQL + + * fixed build of SphinxSE with MySQL 5.1 + + * fixed crash log for 'fork' and 'prefork' workers + +A.3. Version 2.0.2-beta, 15 nov 2011 ==================================== Major new features ------------------ * added keywords dictionary (dict=keywords) support to RT indexes + * added MVA, index_exact_words support to RT indexes (#888) + * added MVA64 (a set of BIGINTs) support to both disk and RT indexes (rt_attr_multi_64 directive) + * added an expression-based ranker, and a number of new ranking factors + * added ATTACH INDEX statement that converts a disk index to RT index + * added WHERE clause support to UPDATE statement + * added bigint, float, and MVA attribute support to UPDATE statement New features ------------ * added support for upto 256 searchable fields (was upto 32 before) + * added FIBONACCI() function to expressions + * added load_files_scattered option to snippets + * added implicit attribute type promotions in multi-index result sets (#939) + * added index names to indexer progress message on merge (#928) + * added --replay-flags switch to searchd + * added string attribute support and a few previously missing snippets options to SphinxSE + * added previously missing Status(), SetConnectTimeout() API calls to Python API + * added ORDER BY RAND() support to SELECT statement + * added Sphinx version to Windows crash log + * added RT index support to indextool --check (checks disk chunks only) (#877) + * added prefork_rotation_throttle directive (preforked children restart delay, in milliseconds) (#873) + * added on_file_field_error directive (different sql_file_field handling modes) + * added manpages for all the programs + * added syslog logging support + * added sentence, paragraph, and zone support in html_strip_mode=retain mode to snippets + * optimized search performance with many ZONE operators + * improved suggestion tool (added Levenshtein limit, removed extra DB fetch) + * improved sentence extraction (handles salutations, starting initials better now) + * changed max_filter_values sanity check to 10M values New SphinxQL features --------------------- * added FLUSH RTINDEX statement + * added dist_threads directive (parallel processing), load_files, load_files_scattered, batch syntax (multiple documents) support to CALL SNIPPETS statement + * added OPTION comment='...' support to SELECT statement (#944) + * added SHOW VARIABLES statement + * added dummy handlers for SET TRANSACTION, SET NAMES, SELECT @@sysvar statements, and for sql_auto_is_null, sql_mode, and @@-style variables (like @@tx_isolation) in SET statement (better MySQL frameworks/connectors support) + * added complete SphinxQL error logging (all errors are logged now, not just SELECTs) + * improved SELECT statement syntax, made expressions aliases optional Bug fixes --------- * fixed #982, empty binlogs prevented upgraded daemon from starting up + * fixed #978, libsphinxclient build failed on sparc/sparc64 solaris + * fixed #977, eliminated (most) compiler warnings + * fixed #969, broken expression MVA/string argument type check prevented IF(IN(mva..)) and other valid expressions from working + * fixed #966, NOT IN @global_var syntax was not supported + * fixed #958, mem_limit over INT_MAX was not clamped + * fixed #954, UTF-8 snippets could crash on malformed data + * fixed #951, UTF-8 snippets could hang on malformed data + * fixed #947, bad float column type was reported via SphinxQL, breaking some clients + * fixed #940, group-by with a small enough max_matches limit could occasionaly crash and/or sort wrongly + * fixed #932, sending huge queries to agents occasionally failed (mainly on Windows) + * fixed #926, snippets did not highlight widlcard matches with morphology enabled + * fixed #918, crash logger did not report a proper query in dist_threads case + * fixed #916, watchdog caused (endless) respawns if there was a crash during shutdown + * fixed #904, attribute names were not forcibly case-folded in some API calls (eg. SetGroupDistinct) + * fixed #902, query parser did not support stopword_step=0 + * fixed #897, network sockets dangled (open but unattended) while replaying binlog + * fixed #855, allow_empty option in snippets did not always work correctly + * fixed #854, indexing with many bigint attributes and docinfo=inline crashed + * fixed #838, RT MVA insertion did not sort MVA values, caused matching issues + * fixed #833, duplicate MVA values were not eliminated on update + * fixed #832, certain (overshort/incorrect) documents crashed indexing MS SQL Unicode columns + * fixed #829, query parser did not properly handle numerics with blend_chars + * fixed #814, group-by string attributes in RT indexes dit not always work correctly + * fixed #812, utf8 stemming produced unexpected stems on words with single-byte chars + * fixed #808, huge queries crashed logging with query_log_format=sphinxql + * fixed #806, stray single-star keyword crashed on querying + * fixed #798, snippets ignored index_exact_words in query_mode + * fixed #797, RT klist loader had an occasional off-by-one crash + * fixed #791, preopen_indexes erroneously defaulted to 0 on Windows + * fixed #790, huge dictionaries (over 4 GB) did not work + * fixed #786, inplace_enable could occasionally corrupt the indexes + * fixed #775, doc had a typo (soundex vs metaphone) + * fixed #772, snippets duplicated blended chars on a SPZ boundary + * fixed #762, query parser truncated digit-only keywords over 15 digits + * fixed #736, query parser dit not properly handle blended/special char sequence + * fixed #726, rotation of an index with a changed attribute count crashed + * fixed #687, querying multiple indexes with index weights and sort-by expression produced incorrect (unadjusted) weights + * fixed #585, (unsupported) string ordinals were silently zeroed out with docinfo=inline (instead of failing) + * fixed #583, certain keywords could occasionally crash multiforms + * fixed that concurrent MVA updates could crash + * fixed that query parser did not ignore a pure blended token with a leading modifier + * fixed that query parser did not properly handle a modifier followed by a dash + * fixed that substring indexing with dict=crc did not support index_exact_words and zones + * fixed that in a rare edge case common subtree cache could crash + * fixed that empty result set returned the full schema (rather than SELECT-ed columns) + * fixed that SphinxQL did not have a sanity check for (currently unsupported) result set schemas over 250 attributes + * fixed that updates on regular indexes were not binlogged + * fixed that multi-query optimization check for expressions did not handle multi-index case + * fixed that SphinxSE did not build vs MySQL 5.5 release + * fixed that proximity_bm25 ranker could yield incorrect weight on duplicated keywords + * fixed that prefix expansion with dict=keyword occasionally crashed + * fixed that strip_path did not work on RT disk chunks + * fixed that exclude filters were not properly logged in query_log_format=sphinxql mode + * fixed that plain string attribute check in indextool --check was broken + * fixed that Java API did not let specify a connection timeout + * fixed that ordinal and wordcount attributes could not be fetched via SphinxQL + * fixed that in a rare edge case OR/ORDER would not match properly + * fixed that sending (huge) query response did not handle EINTR properly + * fixed that SPH04 ranker could yield incorrectly high weight in some cases + * fixed that C API did not let zero out cutoff, max_matches settings + * fixed that on a persistent connection there were occasionally issues handling signals while doing network reads/waitss + * fixed that in a rare edge case (field start modifier in a certain complex query) querying crashed + * fixed that snippets did not support dist_threads with load_files=0 + * fixed that in some extremely rare edge cases tiny parts of an index could end up corrupted with dict=keywords + * fixed that field/zone conditions were not propagated to expanded keywords with dict=keywords -A.2. Version 2.0.1-beta, 22 apr 2011 +A.4. Version 2.0.1-beta, 22 apr 2011 ==================================== New general features -------------------- * added remapping support to blend_chars directive + * added multi-threaded snippet batches support (requires a batch sent via API, dist_threads, and load_files) + * added collations (collation_server, collation_libc_locale directives) + * added support for sorting and grouping on string attributes (ORDER BY, GROUP BY, WITHING GROUP ORDER BY) + * added UDF support (plugin_dir directive; CREATE FUNCTION, DROP FUNCTION statements) + * added query_log_format directive, SET GLOBAL query_log_format | log_level = ... statements; and connection id tracking + * added sql_column_buffers directive, fixed out-of-buffer column handling in ODBC/MS SQL sources + * added blend_mode directive that enables indexing multiple variants of a blended sequence + * added UNIX socket support to C, Ruby APIs + * added ranged query support to sql_joined_field + * added rt_flush_period directive + * added thread_stack directive + * added SENTENCE, PARAGRAPH, ZONE operators (and index_sp, index_zones directives) + * added keywords dictionary support (and dict, expansion_limit directives) + * added passage_boundary, emit_zones options to snippets + * added a watchdog process in threaded mode + * added persistent MVA updates + * added crash dumps to searchd.log, deprecated crash_log_path directive + * added id32 index support in id64 binaries (EXPERIMENTAL) + * added SphinxSE support for DELETE and REPLACE on SphinxQL tables New SphinxQL features @@ -10200,32 +10809,47 @@ * added new, more SQL compliant SphinxQL syntax; and a compat_sphinxql_magics directive + * added CRC32(), DAY(), MONTH(), YEAR(), YEARMONTH(), YEARMONTHDAY() functions + * added DIV, MOD, and % operators + * added reverse_scan=(0|1) option to SELECT + * added support for MySQL packets over 16M + * added dummy SHOW VARIABLES, SHOW COLLATION, and SET character_set_results support (to support handshake with certain client libraries and frameworks) + * added mysql_version_string directive (to workaround picky MySQL client libraries) + * added support for global filter variables, SET GLOBAL @uservar=(int_list) + * added DELETE ... IN (id_list) syntax support + * added C-style comments syntax (for example, SELECT /*!40000 some comment*/ id FROM test) + * added UPDATE ... WHERE id=X syntax support + * added SphinxQL multi-query support + * added DESCRIBE, SHOW TABLES statements New command-line switches ------------------------- * added --print-queries switch to indexer that dumps SQL queries it runs + * added --sighup-each switch to indexer that rotates indexes one by one + * added --strip-path switch to searchd that skips file paths embedded in the index(-es) + * added --dumpconfig switch to indextool that dumps an index header in sphinx.conf format @@ -10233,500 +10857,849 @@ ------------------------------- * changed default preopen_indexes value to 1 + * optimized English stemmer (results in 1.3x faster snippets and indexing with morphology=stem_en) + * optimized snippets, 1.6x general speedup + * optimized const-list parsing in SphinxQL + * optimized full-document highlighting CPU/RAM use + * optimized binlog replay (improved performance on K-list update) Bug fixes --------- * fixed #767, joined fields vs ODBC sources + * fixed #757, wordforms shared by indexes with different settings + * fixed #733, loading of indexes in formats prior to v.14 + * fixed #763, occasional snippets failures + * fixed #648, occasionally missed rotations on multiple SIGHUPs + * fixed #750, an RT segment merge leading to false positives and/or crashes in some cases + * fixed #755, zones in snippets output + * fixed #754, stopwords counting at snippet passage generation + * fixed #723, fork/prefork index rotation in children processes + * fixed #696, freeze on zero threshold in quorum operator + * fixed #732, query escaping in SphinxSE + * fixed #739, occasional crashes in MT mode on result set send + * fixed #746, crash with a named list in SphinxQL option + * fixed #674, AVG vs group order + * fixed #734, occasional crashes attempting to report NULL errors + * fixed #829, tail hits within field position modifier + * fixed #712, missing query_mode, force_all_words snippet option defaults in Java API + * fixed #721, added dupe removal on RT batch INSERT/REPLACE + * fixed #720, potential extraneous highlighting after a blended keyword + * fixed #702, exceptions vs star search + * fixed #666, ext2 query grouping vs exceptions + * fixed #688, WITHIN GROUP ORDER BY related crash + * fixed #660, multi-queue batches vs dist_threads + * fixed #678, crash on dict=keywords vs xmlpipe vs min_prefix_len + * fixed #596, ECHILD vs scripted configs + * fixed #653, dependency in expression, sorting, grouping + * fixed #661, concurrent distributed searches vs workers=threads + * fixed #646, crash on status query via UNIX socket + * fixed #589, libexpat.dll missing from some Win32 build types + * fixed #574, quorum match order + * fixed multiple documentation issues (#372, #483, #495, #601, #623, #632, #654) + * fixed that ondisk_dict did not affect RT indexes + * fixed that string attributes check in indextool --check was erroneously sensitive to string data order + * fixed a rare crash when using BEFORE operator + * fixed an issue with multiforms vs BuildKeywords() + * fixed an edge case in OR operator (emitted wrong hits order sometimes) + * fixed aliasing in docinfo accessors that lead to very rare crashes and/or missing results + * fixed a syntax error on a short token at the end of a query + * fixed id64 filtering and performance degradation with range filters + * fixed missing rankers in libsphinxclient + * fixed missing SPH04 ranker in SphinxSE + * fixed column names in sql_attr_multi sample (works with example.sql now) + * fixed an issue with distributed local+remote setup vs aggregate functions + * fixed case sensitive columns names in RT indexes + * fixed a crash vs strings from multiple indexes in result set + * fixed blended keywords vs snippets + * fixed secure_connection vs MySQL protocol vs MySQL.NET connector + * fixed that Python API did not works with Python 2.3 + * fixed overshort_step vs snippets + * fixed keyword staistics vs dist_threads searching + * fixed multiforms vs query parsing (vs quorum) + * fixed missed quorum words vs RT segments + * fixed blended keywords occasionally skipping extra character when querying (eg "abc[]") + * fixed Python API to handle int32 values + * fixed prefix and infix indexing of joined fields + * fixed MVA ranged query + * fixed missing blended state reset on document boundary + * fixed a crash on missing index while replaying binlog + * fixed an error message on filter values overrun + * fixed passage duplication in snippets in weight_order mode + * fixed select clauses over 1K vs remote agents + * fixed overshort accounting vs soft-whitespace tokens + * fixed rotation vs workers=threads + * fixed schema issues vs distributed indexes + * fixed blended-escaped sequence parsing issue + * fixed MySQL IN clause (values order etc) + * fixed that post_index did not execute when 0 documents were succesfully indexed + * fixed field position limit vs many hits + * fixed that joined fields missed an end marker at field end + * fixed that xxx_step settings were missing from .sph index header + * fixed libsphinxclient missing request cleanup in sphinx_query() (eg after network errors) + * fixed that index_weights were ignored when grouping + * fixed multi wordforms vs blend_chars + * fixed broken MVA output in SphinxQL + * fixed a few RT leaks + * fixed an issue with RT string storage going missing + * fixed an issue with repeated queries vs dist_threads + * fixed an issue with string attributes vs buffer overrun in SphinxQL + * fixed unexpected character data warnings within ignored xmlpipe tags + * fixed a crash in snippets with NEAR syntax query + * fixed passage duplication in snippets + * fixed libsphinxclient SIGPIPE handling + * fixed libsphinxclient vs VS2003 compiler bug -A.3. Version 1.10-beta, 19 jul 2010 +A.5. Version 1.10-beta, 19 jul 2010 =================================== * added RT indexes support (Chapter 4, Real-time indexes) + * added prefork and threads support (workers directives) + * added multi-threaded local searches in distributed indexes (dist_threads directive) + * added common subquery cache (subtree_docs_cache, subtree_hits_cache directives) + * added string attributes support (sql_attr_string, sql_field_string, xml_attr_string, xml_field_string directives) + * added indexing-time word counter (sql_attr_str2wordcount, sql_field_str2wordcount directives) + * added CALL SNIPPETS(), CALL KEYWORDS() SphinxQL statements + * added field_weights, index_weights options to SphinxQL SELECT statement + * added insert-only SphinxQL-talking tables to SphinxSE (connection='sphinxql://host[:port]/index') + * added select option to SphinxSE queries + * added backtrace on crash to searchd + * added SQL+FS indexing, aka loading files by names fetched from SQL (sql_file_field directive) + * added a watchdog in threads mode to searchd + * added automatic row phantoms elimination to index merge + * added hitless indexing support (hitless_words directive) + * added --check, --strip-path, --htmlstrip, --dumphitlist ... --wordid switches to indextool + * added --stopwait, --logdebug switches to searchd + * added --dump-rows, --verbose switches to indexer + * added "blended" characters indexing support (blend_chars directive) + * added joined/payload field indexing (sql_joined_field directive) + * added FlushAttributes() API call + * added query_mode, force_all_words, limit_passages, limit_words, start_passage_id, load_files, html_strip_mode, allow_empty options, and %PASSAGE_ID% macro in before_match, after_match options to BuildExcerpts() API call + * added @groupby/@count/@distinct columns support to SELECT (but not to expressions) + * added query-time keyword expansion support (expand_keywords directive, SPH_RANK_SPH04 ranker) + * added query batch size limit option (max_batch_queries directive; was hardcoded) + * added SINT() function to expressions + * improved SphinxQL syntax error reporting + * improved expression optimizer (better constant handling) + * improved dash handling within keywords (no longer treated as an operator) + * improved snippets (better passage selection/trimming, around option now a hard limit) + * optimized index format that yields ~20-30% smaller indexes + * optimized sorting code (indexing time 1-5% faster on average; 100x faster in worst case) + * optimized searchd startup time (moved .spa preindexing to indexer), added a progress bar + * optimized queries against indexes with many attributes (eliminated redundant copying) + * optimized 1-keyword queries (performace regression introduced in 0.9.9) + * optimized SphinxQL protocol overheads, and performance on bigger result sets + * optimized unbuffered attributes writes on index merge + * changed attribute handling, duplicate names are strictly forbidden now + * fixed that SphinxQL sessions could stall shutdown + * fixed consts with leading minus in SphinxQL + * fixed AND/OR precedence in expressions + * fixed #334, AVG() on integers was not computed in floats + * fixed #371, attribute flush vs 2+ GB files + * fixed #373, segfault on distributed queries vs certain libc versions + * fixed #398, stopwords not stopped in prefix/infix indexes + * fixed #404, erroneous MVA failures in indextool --check + * fixed #408, segfault on certain query batches (regular scan, plus a scan with MVA groupby) + * fixed #431, occasional shutdown hangs in preforked workers + * fixed #436, trunk checkout builds vs Solaris sh + * fixed #440, escaping vs parentheses declared as valid in charset_table + * fixed #442, occasional non-aligned free in MVA indexing + * fixed #447, occasional crashes in MVA indexing + * fixed #449, pconn busyloop on aborted clients on certain arches + * fixed #465, build issue on Alpha + * fixed #468, build issue in libsphinxclient + * fixed #472, multiple stopword files failing to load + * fixed #489, buffer overflow in query logging + * fixed #493, Python API assertion after error returned from Query() + * fixed #500, malformed MySQL packet when sending MVAs + * fixed #504, SIGPIPE in libsphinxclient + * fixed #506, better MySQL protocol commands support in SphinxQL (PING etc) + * fixed #509, indexing ranged results from stored procedures -A.4. Version 0.9.9-release, 02 dec 2009 +A.6. Version 0.9.9-release, 02 dec 2009 ======================================= * added Open, Close, Status calls to libsphinxclient (C API) + * added automatic persistent connection reopening to PHP, Python APIs + * added 64-bit value/range filters, fullscan mode support to SphinxSE + * MAJOR CHANGE, our IANA assigned ports are 9312 and 9306 respectively (goodbye, trusty 3312) + * MAJOR CHANGE, erroneous filters now fail with an error (were silently ignored before) + * optimized unbuffered .spa writes on merge + * optimized 1-keyword queries ranking in extended2 mode + * fixed #441 (IO race in case of highly conccurent load on a preopened) + * fixed #434 (distrubuted indexes were not searchable via MySQL protocol) + * fixed #317 (indexer MVA progress counter) + * fixed #398 (stopwords not removed from search query) + * fixed #328 (broken cutoff) + * fixed #250 (now quoting paths w/spaces when installing Windows service) + * fixed #348 (K-list was not updated on merge) + * fixed #357 (destination index were not K-list-filtered on merge) + * fixed #369 (precaching .spi files over 2 GBs) + * fixed #438 (missing boundary proximity matches) + * fixed #371 (.spa flush in case of files over 2 GBs) + * fixed #373 (crashes on distributed queries via mysql proto) + * fixed critical bugs in hit merging code + * fixed #424 (ordinals could be misplaced during indexing in case of bitfields etc) + * fixed #426 (failing SE build on Solaris; thanks to Ben Beecher) + * fixed #423 (typo in SE caused crash on SHOW STATUS) + * fixed #363 (handling of read_timeout over 2147 seconds) + * fixed #376 (minor error message mismatch) + * fixed #413 (minus in SphinxQL) + * fixed #417 (floats w/o leading digit in SphinxQL) + * fixed #403 (typo in SetFieldWeights name in Java API) + * fixed index rotation vs persistent connections + * fixed backslash handling in SphinxQL parser + * fixed uint unpacking vs. PHP 5.2.9 (possibly other versions) + * fixed #325 (filter settings send from SphinxSE) + * fixed #352 (removed mysql wrapper around close() in SphinxSE) + * fixed #389 (display error messages through SphinxSE status variable) + * fixed linking with port-installed iconv on OS X + * fixed negative 64-bit unpacking in PHP API + * fixed #349 (escaping backslash in query emulation mode) + * fixed #320 (disabled multi-query route when select items differ) + * fixed #353 (better quorum counts check) + * fixed #341 (merging of trailing hits; maybe other ranking issues too) + * fixed #368 (partially; @field "" caused crashes; now resets field limit) + * fixed #365 (field mask was leaking on field-limited terms) + * fixed #339 (updated debug query dumper) + * fixed #361 (added SetConnectTimeout() to Java API) + * fixed #338 (added missing fullscan to mode check in Java API) + * fixed #323 (added floats support to SphinxQL) + * fixed #340 (support listen=port:proto syntax too) + * fixed #332 (\r is legal SphinxQL space now) + * fixed xmlpipe2 K-lists + * fixed #322 (safety gaps in mysql protocol row buffer) + * fixed #313 (return keyword stats for empty indexes too) + * fixed #344 (invalid checkpoints after merge) + * fixed #326 (missing CLOCK_xxx on FreeBSD) -A.5. Version 0.9.9-rc2, 08 apr 2009 +A.7. Version 0.9.9-rc2, 08 apr 2009 =================================== * added IsConnectError(), Open(), Close() calls to Java API (bug #240) + * added read_buffer, read_unhinted directives + * added checks for build options returned by mysql_config (builds on Solaris now) + * added fixed-RAM index merge (bug #169) + * added logging chained queries count in case of (optimized) multi-queries + * added GEODIST() function + * added --status switch to searchd + * added MySpell (OpenOffice) affix file support (bug #281) + * added ODBC support (both Windows and UnixODBC) + * added support for @id in IN() (bug #292) + * added support for aggregate functions in GROUP BY (namely AVG, MAX, MIN, SUM) + * added MySQL UDF that builds snippets using searchd + * added write_buffer directive (defaults to 1M) + * added xmlpipe_fixup_utf8 directive + * added suggestions sample + * added microsecond precision int64 timer (bug #282) + * added listen_backlog directive + * added max_xmlpipe2_field directive + * added initial SphinxQL support to mysql41 handler, SELECT .../SHOW WARNINGS/STATUS/META are handled + * added support for different network protocols, and mysql41 protocol + * added fieldmask ranker, updated SphinxSE list of rankers + * added mysql_ssl_xxx directives + * added --cpustats (requires clock_gettime()) and --status switches to searchd + * added performance counters, Status() API call + * added overshort_step and stopword_step directives + * added strict order operator (aka operator before, eg. "one << two << three") + * added indextool utility, moved --dumpheader there, added --debugdocids, --dumphitlist options + * added own RNG, reseeded on @random sort query (bug #183) + * added field-start and field-end modifiers support (syntax is "^hello world$"; field-end requires reindex) + * added MVA attribute support to IN() function + * added AND, OR, and NOT support to expressions + * improved logging of (optimized) multi-queries (now logging chained query count) + * improved handshake error handling, fixed protocol version byte order (omg) + * updated SphinxSE to protocol 1.22 + * allowed phrase_boundary_step=-1 (trick to emulate keyword expansion) + * removed SPH_MAX_QUERY_WORDS limit + * fixed CLI search vs documents missing from DB (bug #257) + * fixed libsphinxclient results leak on subsequent sphinx_run_queries call (bug #256) + * fixed libsphinxclient handling of zero max_matches and cutoff (bug #208) + * fixed Java API over-64K string reads (eg. big snippets) in Java API (bug #181) + * fixed Java API 2nd Query() after network error in 1st Query() call (bug #308) + * fixed typo-class bugs in SetFilterFloatRange (bug #259), SetSortMode (bug #248) + * fixed missing @@relaxed support (bug #276), fixed missing error on @nosuchfield queries, documented @@relaxed + * fixed UNIX socket permissions to 0777 (bug #288) + * fixed xmlpipe2 crash on schemas with no fields, added better document structure checks + * fixed (and optimized) expr parser vs IN() with huge (10K+) args count + * fixed double EarlyCalc() in fullscan mode (minor performance impact) + * fixed phrase boundary handling in some cases (on buffer end, on trailing whitespace) + * fixes in snippets (aka excerpts) generation + * fixed inline attrs vs id64 index corruption + * fixed head searchd crash on config re-parse failure + * fixed handling of numeric keywords with leading zeroes such as "007" (bug #251) + * fixed junk in SphinxSE status variables (bug #304) + * fixed wordlist checkpoints serialization (bug #236) + * fixed unaligned docinfo id access (bug #230) + * fixed GetRawBytes() vs oversized blocks (headers with over 32K charset_table should now work, bug #300) + * fixed buffer overflow caused by too long dest wordform, updated tests + * fixed IF() return type (was always int, is deduced now) + * fixed legacy queries vs. special chars vs. multiple indexes + * fixed write-write-read socket access pattern vs Nagle vs delays vs FreeBSD (oh wow) + * fixed exceptions vs query-parser issue + * fixed late calc vs @weight in expressions (bug #285) + * fixed early lookup/calc vs filters (bug #284) + * fixed emulated MATCH_ANY queries (empty proximity and phrase queries are allowed now) + * fixed MATCH_ANY ranker vs fields with no matches + * fixed index file size vs inplace_enable (bug #245) + * fixed that old logs were not closed on USR1 (bug #221) + * fixed handling of '!' alias to NOT operator (bug #237) + * fixed error handling vs query steps (step failure was not reported) + * fixed querying vs inline attributes + * fixed stupid bug in escaping code, fixed EscapeString() and made it static + * fixed parser vs @field -keyword, foo|@field bar, "" queries (bug #310) -A.6. Version 0.9.9-rc1, 17 nov 2008 +A.8. Version 0.9.9-rc1, 17 nov 2008 =================================== * added min_stemming_len directive + * added IsConnectError() API call (helps distingusih API vs remote errors) + * added duplicate log messages filter to searchd + * added --nodetach debugging switch to searchd + * added blackhole agents support for debugging/testing (agent_blackhole directive) + * added max_filters, max_filter_values directives (were hardcoded before) + * added int64 expression evaluation path, automatic inference, and BIGINT() enforcer function + * added crash handler for debugging (crash_log_path directive) + * added MS SQL (aka SQL Server) source support (Windows only, mssql_winauth and mssql_unicode directives) + * added indexer-side column unpacking feature (unpack_zlib, unpack_mysqlcompress directives) + * added nested brackers and NOTs support to query language, rewritten query parser + * added persistent connections support (Open() and Close() API calls) + * added index_exact_words feature, and exact form operator to query language ("hello =world") + * added status variables support to SphinxSE (SHOW STATUS LIKE 'sphinx_%') + * added max_packet_size directive (was hardcoded at 8M before) + * added UNIX socket support, and multi-interface support (listen directive) + * added star-syntax support to BuildExcerpts() API call + * added inplace inversion of .spa and .spp (inplace_enable directive, 1.5-2x less disk space for indexing) + * added builtin Czech stemmer (morphology=stem_cz) + * added IDIV(), NOW(), INTERVAL(), IN() functions to expressions + * added index-level early-reject based on filters + * added MVA updates feature (mva_updates_pool directive) + * added select-list feature with computed expressions support (see SetSelect() API call, test.php --select switch), protocol 1.22 + * added integer expressions support (2x faster than float) + * added multiforms support (multiple source words in wordforms file) + * added legacy rankers (MATCH_ALL/MATCH_ANY/etc), removed legacy matching code (everything runs on V2 engine now) + * added field position limit modifier to field operator (syntax: @title[50] hello world) + * added killlist support (sql_query_killlist directive, --merge-killlists switch) + * added on-disk SPI support (ondisk_dict directive) + * added indexer IO stats + * added periodic .spa flush (attr_flush_period directive) + * added config reload on SIGHUP + * added per-query attribute overrides feature (see SetOverride() API call); protocol 1.21 + * added signed 64bit attrs support (sql_attr_bigint directive) + * improved HTML stripper to also skip PIs (, such as ) + * improved excerpts speed (upto 50x faster on big documents) + * fixed a short window of searchd inaccessibility on startup (started listen()ing too early before) + * fixed .spa loading on systems where read() is 2GB capped + * fixed infixes vs morphology issues + * fixed backslash escaping, added backslash to EscapeString() + * fixed handling of over-2GB dictionary files (.spi) -A.7. Version 0.9.8.1, 30 oct 2008 +A.9. Version 0.9.8.1, 30 oct 2008 ================================= * added configure script to libsphinxclient + * changed proximity/quorum operator syntax to require whitespace after length + * fixed potential head process crash on SIGPIPE during "maxed out" message + * fixed handling of incomplete remote replies (caused over-degraded distributed results, in rare cases) + * fixed sending of big remote requests (caused distributed requests to fail, in rare cases) + * fixed FD_SET() overflow (caused searchd to crash on startup, in rare cases) + * fixed MVA vs distributed indexes (caused loss of 1st MVA value in result set) + * fixed tokenizing of exceptions terminated by specials (eg. "GPS AT&T" in extended mode) + * fixed buffer overrun in stemmer on overlong tokens occasionally emitted by proximity/quorum operator parser (caused crashes on certain proximity/quorum queries) + * fixed wordcount ranker (could be dropping hits) + * fixed --merge feature (numerous different fixes, caused broken indexes) + * fixed --merge-dst-range performance + * fixed prefix/infix generation for stopwords + * fixed ignore_chars vs specials + * fixed misplaced F_SETLKW check (caused certain build types, eg. RPM build on FC8, to fail) + * fixed dictionary-defined charsets support in spelldump, added \x-style wordchars support + * fixed Java API to properly send long strings (over 64K; eg. long document bodies for excerpts) + * fixed Python API to accept offset/limit of 'long' type + * fixed default ID range (that filtered out all 64-bit values) in Java and Python APIs -A.8. Version 0.9.8, 14 jul 2008 -=============================== +A.10. Version 0.9.8, 14 jul 2008 +================================ Indexing -------- * added support for 64-bit document and keyword IDs, --enable-id64 switch to configure + * added support for floating point attributes + * added support for bitfields in attributes, sql_attr_bool directive and bit-widths part in sql_attr_uint directive + * added support for multi-valued attributes (MVA) + * added metaphone preprocessor + * added libstemmer library support, provides stemmers for a number of additional languages + * added xmlpipe2 source type, that supports arbitrary fields and attributes + * added word form dictionaries, wordforms directive (and spelldump utility) + * added tokenizing exceptions, exceptions directive + * added an option to fully remove element contents to HTML stripper, html_remove_elements directive + * added HTML entities decoder (with full XHTML1 set support) to HTML stripper + * added per-index HTML stripping settings, html_strip, html_index_attrs, and html_remove_elements directives + * added IO load throttling, max_iops and max_iosize directives + * added SQL load throttling, sql_ranged_throttle directive + * added an option to index prefixes/infixes for given fields only, prefix_fields and infix_fields directives + * added an option to ignore certain characters (instead of just treating them as whitespace), ignore_chars directive + * added an option to increment word position on phrase boundary characters, phrase_boundary and phrase_boundary_step directives + * added --merge-dst-range switch (and filters) to index merging feature (--merge switch) + * added mysql_connect_flags directive (eg. to reduce indexing time MySQL network traffic and/or time) + * improved ordinals sorting; now runs in fixed RAM + * improved handling of documents with zero/NULL ids, now skipping them instead of aborting @@ -10735,21 +11708,33 @@ * added an option to unlink old index on succesful rotation, unlink_old directive + * added an option to keep index files open at all times (fixes subtle races on rotation), preopen and preopen_indexes directives + * added an option to profile searchd disk I/O, --iostats command-line option + * added an option to rotate index seamlessly (fully avoids query stalls), seamless_rotate directive + * added HTML stripping support to excerpts (uses per-index settings) + * added 'exact_phrase', 'single_passage', 'use_boundaries', 'weight_order 'options to BuildExcerpts() API call + * added distributed attribute updates propagation + * added distributed retries on master node side + * added log reopen on SIGUSR1 + * added --stop switch (sends SIGTERM to running instance) + * added Windows service mode, and --servicename switch + * added Windows --rotate support + * improved log timestamping, now with millisecond precision Querying @@ -10757,34 +11742,53 @@ * added extended engine V2 (faster, cleaner, better; SPH_MATCH_EXTENDED2 mode) + * added ranking modes support (V2 engine only; SetRankingMode() API call) + * added quorum searching support to query language (V2 engine only; example: "any three of all these words"/3) + * added query escaping support to query language, and EscapeString() API call + * added multi-field syntax support to query language (example: "@(field1,field2) something"), and @@relaxed field checks option + * added optional star-syntax ('word*') support in keywords, enable_star directive (for prefix/infix indexes only) + * added full-scan support (query must be fully empty; can perform block-reject optimization) + * added COUNT(DISTINCT(attr)) calculation support, SetGroupDistinct() API call + * added group-by on MVA support, SetArrayResult() PHP API call + * added per-index weights feature, SetIndexWeights() API call + * added geodistance support, SetGeoAnchor() API call + * added result set sorting by arbitrary expressions in run time (eg. "@weight+log(price)*2.5"), SPH_SORT_EXPR mode + * added result set sorting by @custom compile-time sorting function (see src/sphinxcustomsort.inl) + * added result set sorting by @random value + * added result set merging for indexes with different schemas + * added query comments support (3rd arg to Query()/AddQuery() API calls, copied verbatim to query log) + * added keyword extraction support, BuildKeywords() API call + * added binding field weights by name, SetFieldWeights() API call + * added optional limit on query time, SetMaxQueryTime() API call + * added optional limit on found matches count (4rd arg to SetLimits() API call, so-called 'cutoff') @@ -10792,13 +11796,18 @@ ----------------- * added pure C API (libsphinxclient) + * added Ruby API (thanks to Dmytro Shteflyuk) + * added Java API + * added SphinxSE support for MVAs (use varchar), floats (use float), 64bit docids (use bigint) + * added SphinxSE options "floatrange", "geoanchor", "fieldweights", "indexweights", "maxquerytime", "comment", "host" and "port"; and support for "expr:CLAUSE" + * improved SphinxSE max query size (using MySQL condition pushdown), upto 256K now @@ -10807,203 +11816,345 @@ * added scripting (shebang syntax) support to config files (example: #!/usr/bin/php in the first line) + * added unified config handling and validation to all programs + * added unified documentation + * added .spec file for RPM builds + * added automated testing suite + * improved index locking, now fcntl()-based instead of buggy file-existence-based + * fixed unaligned RAM accesses, now works on SPARC and ARM Changes and fixes since 0.9.8-rc2 --------------------------------- * added pure C API (libsphinxclient) + * added Ruby API + * added SetConnectTimeout() PHP API call + * added allowed type check to UpdateAttributes() handler (bug #174) + * added defensive MVA checks on index preload (protection against broken indexes, bug #168) + * added sphinx-min.conf sample file + * added --without-iconv switch to configure + * removed redundant -lz dependency in searchd + * removed erroneous "xmlpipe2 deprecated" warning + * fixed EINTR handling in piped read (bug #166) + * fixup query time before logging and sending to client (bug #153) + * fixed attribute updates vs full-scan early-reject index (bug #149) + * fixed gcc warnings (bug #160) + * fixed mysql connection attempt vs pgsql source type (bug #165) + * fixed 32-bit wraparound when preloading over 2 GB files + * fixed "out of memory" message vs over 2 GB allocs (bug #116) + * fixed unaligned RAM access detection on ARM (where unaligned reads do not crash but produce wrong results) + * fixed missing full scan results in some cases + * fixed several bugs in --merge, --merge-dst-range + * fixed @geodist vs MultiQuery and filters, @expr vs MultiQuery + * fixed GetTokenEnd() vs 1-grams (was causing crash in excerpts) + * fixed sql_query_range to handle empty strings in addition to NULL strings (Postgres specific) + * fixed morphology=none vs infixes + * fixed case sensitive attributes names in UpdateAttributes() + * fixed ext2 ranking vs. stopwords (now using atompos from query parser) + * fixed EscapeString() call + * fixed escaped specials (now handled as whitespace if not in charset) + * fixed schema minimizer (now handles type/size mismatches) + * fixed word stats in extended2; stemmed form is now returned + * fixed spelldump case folding vs dictionary-defined character sets + * fixed Postgres BOOLEAN handling + * fixed enforced "inline" docinfo on empty indexes (normally ok, but index merge was really confused) + * fixed rare count(distinct) out-of-bounds issue (it occasionaly caused too high @distinct values) + * fixed hangups on documents with id=DOCID_MAX in some cases + * fixed rare crash in tokenizer (prefixed synonym vs. input stream eof) + * fixed query parser vs "aaa (bbb ccc)|ddd" queries + * fixed BuildExcerpts() request in Java API + * fixed Postgres specific memory leak + * fixed handling of overshort keywords (less than min_word_len) + * fixed HTML stripper (now emits space after indexed attributes) + * fixed 32-field case in query parser + * fixed rare count(distinct) vs. querying multiple local indexes vs. reusable sorter issue + * fixed sorting of negative floats in SPH_SORT_EXTENDED mode -A.9. Version 0.9.7, 02 apr 2007 -=============================== +A.11. Version 0.9.7, 02 apr 2007 +================================ * added support for sql_str2ordinal_column + * added support for upto 5 sort-by attrs (in extended sorting mode) + * added support for separate groups sorting clause (in group-by mode) + * added support for on-the-fly attribute updates (PRE-ALPHA; will change heavily; use for preliminary testing ONLY) + * added support for zero/NULL attributes + * added support for 0.9.7 features to SphinxSE + * added support for n-grams (alpha, 1-grams only for now) + * added support for warnings reported to client + * added support for exclude-filters + * added support for prefix and infix indexing (see max_prefix_len, max_infix_len) + * added @* syntax to reset current field to query language + * added removal of duplicate entries in query index order + * added PHP API workarounds for PHP signed/unsigned braindamage + * added locks to avoid two concurrent indexers working on same index + * added check for existing attributes vs. docinfo=none case + * improved groupby code a lot (better precision, and upto 25x times faster in extreme cases) + * improved error handling and reporting + * improved handling of broken indexes (reports error instead of hanging/crashing) + * improved mmap() limits for attributes and wordlists (now able to map over 4 GB on x64 and over 2 GB on x32 where possible) + * improved malloc() pressure in head daemon (search time should not degrade with time any more) + * improved test.php command line options + * improved error reporting (distributed query, broken index etc issues now reported to client) + * changed default network packet size to be 8M, added extra checks + * fixed division by zero in BM25 on 1-document collections (in extended matching mode) + * fixed .spl files getting unlinked + * fixed crash in schema compatibility test + * fixed UTF-8 Russian stemmer + * fixed requested matches count when querying distributed agents + * fixed signed vs. unsigned issues everywhere (ranged queries, CLI search output, and obtaining docid) + * fixed potential crashes vs. negative query offsets + * fixed 0-match docs vs. extended mode vs. stats + * fixed group/timestamp filters being ignored if querying from older clients + * fixed docs to mention pgsql source type + * fixed issues with explicit '&' in extended matching mode + * fixed wrong assertion in SBCS encoder + * fixed crashes with no-attribute indexes after rotate -A.10. Version 0.9.7-rc2, 15 dec 2006 +A.12. Version 0.9.7-rc2, 15 dec 2006 ==================================== * added support for extended matching mode (query language) + * added support for extended sorting mode (sorting clauses) + * added support for SBCS excerpts + * added mmap()ing for attributes and wordlist (improves search time, speeds up fork() greatly) + * fixed attribute name handling to be case insensitive + * fixed default compiler options to simplify post-mortem debugging (added -g, removed -fomit-frame-pointer) + * fixed rare memory leak + * fixed "hello hello" queries in "match phrase" mode + * fixed issue with excerpts, texts and overlong queries + * fixed logging multiple index name (no longer tokenized) + * fixed trailing stopword not flushed from tokenizer + * fixed boolean evaluation + * fixed pidfile being wrongly unlink()ed on bind() failure + * fixed --with-mysql-includes/libs (they conflicted with well-known paths) + * fixes for 64-bit platforms -A.11. Version 0.9.7-rc1, 26 oct 2006 +A.13. Version 0.9.7-rc1, 26 oct 2006 ==================================== * added alpha index merging code + * added an option to decrease max_matches per-query + * added an option to specify IP address for searchd to listen on + * added support for unlimited amount of configured sources and indexes + * added support for group-by queries + * added support for /2 range modifier in charset_table + * added support for arbitrary amount of document attributes + * added logging filter count and index name + * added --with-debug option to configure to compile in debug mode + * added -DNDEBUG when compiling in default mode + * improved search time (added doclist size hints, in-memory wordlist cache, and used VLB coding everywhere) + * improved (refactored) SQL driver code (adding new drivers should be very easy now) + * improved exceprts generation + * fixed issue with empty sources and ranged queries + * fixed querying purely remote distributed indexes + * fixed suffix length check in English stemmer in some cases + * fixed UTF-8 decoder for codes over U+20000 (for CJK) + * fixed UTF-8 encoder for 3-byte sequences (for CJK) + * fixed overshort (less than min_word_len) words prepended to next field + * fixed source connection order (indexer does not connect to all sources at once now) + * fixed line numbering in config parser + * fixed some issues with index rotation -A.12. Version 0.9.6, 24 jul 2006 +A.14. Version 0.9.6, 24 jul 2006 ================================ * added support for empty indexes + * added support for multiple sql_query_pre/post/post_index + * fixed timestamp ranges filter in "match any" mode + * fixed configure issues with --without-mysql and --with-pgsql options + * fixed building on Solaris 9 -A.13. Version 0.9.6-rc1, 26 jun 2006 +A.15. Version 0.9.6-rc1, 26 jun 2006 ==================================== * added boolean queries support (experimental, beta version) + * added simple file-based query cache (experimental, beta version) + * added storage engine for MySQL 5.0 and 5.1 (experimental, beta version) + * added GNU style configure script + * added new searchd protocol (all binary, and should be backwards compatible) + * added distributed searching support to searchd + * added PostgreSQL driver + * added excerpts generation + * added min_word_len option to index + * added max_matches option to searchd, removed hardcoded MAX_MATCHES limit + * added initial documentation, and a working example.sql + * added support for multiple sources per index + * added soundex support + * added group ID ranges support + * added --stdin command-line option to search utility + * added --noprogress option to indexer + * added --index option to search + * fixed UTF-8 decoder (3-byte codepoints did not work) + * fixed PHP API to handle big result sets faster + * fixed config parser to handle empty values properly + * fixed redundant time(NULL) calls in time-segments mode --eof-- diff -Nru sphinxsearch-0.9.9+2.0.2beta/doc/sphinx.xml sphinxsearch-2.0.4/doc/sphinx.xml --- sphinxsearch-0.9.9+2.0.2beta/doc/sphinx.xml 2011-11-15 22:35:53.000000000 +0000 +++ sphinxsearch-2.0.4/doc/sphinx.xml 2012-03-02 06:17:50.000000000 +0000 @@ -5,16 +5,16 @@ ]> -Sphinx 2.0.2-beta reference manual +Sphinx 2.0.4-release reference manual Free open-source SQL full-text search engine -2001-2011 +2001-2012 Andrew Aksyonoff -2008-2011 +2008-2012 Sphinx Technologies Inc, http://sphinxsearch.com @@ -245,7 +245,7 @@ SPARC64, and ARM. -Chance are good that Sphinx should work on other Unix platforms and/or +Chances are good that Sphinx should work on other Unix platforms and/or CPU architectures just as well. Please report any other platforms that worked for you! @@ -1092,7 +1092,7 @@ Specifying which documents should go to what index and -reindexing main index could also be made fully automatical. +reindexing main index could also be made fully automatic. One option would be to make a counter table which would track the ID which would split the documents, and update it whenever the main index is reindexed. @@ -1421,12 +1421,13 @@ During normal operation, a new binlog file will be opened every time -when limit (which defaults to 128M) +when limit is reached. Older, already closed binlog files are kept until all of the transactions stored in them (from all indexes) are flushed as a disk chunk. Setting the limit to 0 pretty much prevents binlog from being unlinked at all while searchd is running; however, it will -still be unlinked on clean shutdown. +still be unlinked on clean shutdown. (This is the default case as of +2.0.3-release, defaults to 0.) There are 3 different binlog flushing strategies, controlled by @@ -1624,9 +1625,9 @@ Find the words 'hello' and 'world' adjacently in any field in a document; Additionally, the same document must also contain the words 'example' and 'program' - in the title field, with up to, but not including, 10 words between the words in question; + in the title field, with up to, but not including, 5 words between the words in question; (E.g. "example PHP program" would be matched however "example script to introduce outside data - into the correct context for your program" would not because two terms have 10 or more words between them) + into the correct context for your program" would not because two terms have 5 or more words between them) Additionally, the same document must contain the word 'python' in the body field, but not contain either 'php' or 'perl'; Additionally, the same document must contain the word 'code' in any field. @@ -3142,7 +3143,7 @@ that defines a few simple functions showing how to work with integer, string, and MVA arguments; you can use that one as a foundation for your new functions. It includes the UDF interface header file, -src/sphinxudf.h, +src/sphinxudf.h, that defines the required types and structures. sphinxudf.h header is standalone, that is, does not require any other parts of Sphinx source to compile. @@ -4685,8 +4686,8 @@ supported. -where_condition uses the same syntax as the SELECT statement -(see for details). +where_condition (also added in 2.0.2-beta) has the same syntax +as in the SELECT statement (see for details). When assigning the out-of-range values to 32-bit attributes, they @@ -5368,7 +5369,7 @@ SetRankingMode -Prototype: function SetRankingMode ( $ranker ) +Prototype: function SetRankingMode ( $ranker, $rankexpr="" ) Sets ranking mode (aka ranker). Only available in SPH_MATCH_EXTENDED matching mode. Parameter must be a constant specifying one of the known @@ -5390,6 +5391,13 @@ accomplished by setting the appropriate ranking mode. The list of the modes is available in . + +$rankexpr argument was added in version 2.0.2-beta. +It lets you specify a ranking formula to use with the +expression based ranker, +that is, when $ranker is set to SPH_RANK_EXPR. +In all other cases, $rankexpr is ignored. + @@ -5989,11 +5997,18 @@ "load_files_scattered": - Added in version 2.0.2-beta. It assumes "load_files" option, and works only with distributed snippets generation + Added in version 2.0.2-beta. It works only with distributed snippets generation with remote agents. The source files for snippets could be distributed among different agents, and the main daemon will merge together all non-erroneous results. So, if one agent of the distributed index has 'file1.txt', another has 'file2.txt' and you call for the snippets with both these files, the sphinx will merge results from the agents together, so you will get the snippets from both 'file1.txt' and 'file2.txt'. - + Boolean, default is false. + + If the "load_files" is also set, the request will return the error in case if any of the files is not available anywhere. Otherwise (if "load_files" is not set) + it will just return the empty strings for all absent files. The master instance reset this flag when distributes the snippets among agents. So, for agents the absence of a file + is not critical error, but for the master it might be so. If you want to be sure that all snippets are actually created, set both "load_files_scattered" and "load_files". If the + absense of some snippets caused by some agents is not critical for you - set just "load_files_scattered", leaving "load_files" not set. + + "html_strip_mode": @@ -6263,9 +6278,6 @@ Compiling MySQL 5.0.x with SphinxSE - -Skips steps 1-3 if using already prepared delta tarball. - copy sphinx.5.0.yy.diff patch file into MySQL sources directory and run @@ -6306,9 +6318,6 @@ Compiling MySQL 5.1.x with SphinxSE - -Skip steps 1-2 if using already prepared delta tarball. - in MySQL sources directory, create storage/sphinx directory in and copy all files in mysqlse directory @@ -6536,9 +6545,12 @@ as in SetRankingMode() API call (the only mode that supports full query syntax). Known values are "proximity_bm25", "bm25", "none", "wordcount", "proximity", -"matchany", and "fieldmask". +"matchany", "fieldmask"; and, starting with 2.0.4-release, "expr:EXPRESSION" +syntax to support expression-based ranker (where EXPRESSION should be replaced +with your specific ranking formula): ... WHERE query='test;mode=extended;ranker=bm25;'; +... WHERE query='test;mode=extended;ranker=expr:sum(lcs);'; geoanchor - geodistance anchor, as in @@ -7388,7 +7400,8 @@ Example: -sql_attr_timestamp = UNIX_TIMESTAMP(added_datetime) AS added_ts +# sql_query = ... UNIX_TIMESTAMP(added_datetime) AS added_ts ... +sql_attr_timestamp = added_ts @@ -7815,7 +7828,21 @@ Example: -xmlpipe_attr_uint = author +xmlpipe_attr_uint = author_id + + + + +xmlpipe_attr_bigint + +xmlpipe signed 64-bit integer attribute declaration. +Multi-value, optional. +Applies to source type only. +Syntax fully matches that of sql_attr_bigint. + +Example: + +xmlpipe_attr_bigint = my_bigint_id @@ -8537,6 +8564,13 @@ as for exact phrase will only return the first document, as expected, even though "the" in the second one is stopped. + +Stopwords files can either be created manually, or semi-automatically. +indexer provides a mode that creates a frequency dictionary +of the index, sorted by the keyword frequency, see +and switch in . +Top keywords from that dictionary can usually be used as stopwords. + Example: stopwords = /usr/local/sphinx/data/stopwords.txt @@ -8637,7 +8671,6 @@ Short summary of the differences is as follows: exceptions are case sensitive, wordforms are not; -exceptions allow to detect sequences of tokens, wordforms work with single words only; exceptions can use special characters that are not in charset_table, wordforms fully obey charset_table; exceptions can underperform on huge dictionaries, wordforms handle millions of entries well. @@ -9243,12 +9276,22 @@ This setting is used to declare local indexes that will be searched when -given distributed index is searched. All local indexes will be searched -sequentially, utilizing only 1 CPU or core; to parallelize processing, -you can configure searchd to query itself (refer to - for the details). There might be several local -indexes declared per each distributed index. Any local index can be mentioned -several times in other distributed indexes. +given distributed index is searched. Many local indexes can be declared per +each distributed index. Any local index can also be mentioned several times +in different distributed indexes. + + +Note that by default all local indexes will be searched sequentially, +utilizing only 1 CPU or core. To parallelize processing of the local parts +in the distributed index, you should use directive, +see . + + +Before , there also was a legacy solution +to configure searchd to query itself instead of using +local indexes (refer to for the details). However, +that creates redundant CPU and network load, and +is now strongly suggested instead. Example: @@ -10840,8 +10883,9 @@ Introduced in version 1.10-beta. -Binary logs are used for crash recovery of RT index data that -would otherwise only be stored in RAM. When logging is enabled, +Binary logs are used for crash recovery of RT index data, and also of +attributes updates of plain disk indices that +would otherwise only be stored in RAM untill flush. When logging is enabled, every transaction COMMIT-ted into RT index gets written into a log file. Logs are then automatically replayed on startup after an unclean shutdown, recovering the logged changes. @@ -10856,6 +10900,12 @@ Empty value disables binary logging. That improves performance, but puts RT index data at risk. + +WARNING! It is strongly recommended to always explicitly define 'binlog_path' option in your config. +Otherwise, the default path, which in most cases is the same as working folder, may point to the +folder with no write access (for example, /usr/local/var/data). In this case, the searchd +will not start at all. + Example: binlog_path = # disable logging @@ -11177,6 +11227,70 @@ Sphinx revision history +Version 2.0.4-release, 02 mar 2012 +Bug fixes + +fixed #605, pack vs mysql compress +fixed #783, #862, #917, #985, #990, #1032 documentation bugs +fixed #885, bitwise AND/OR were not available via API +fixed #984, crash on indexing data with MAGIC_CODE_ZONE symbol +fixed #1004, RT index loses words from dictionary on segments merging with id64 enabled +fixed #1035, daemon doesn't properly handle FDs in case of socket overflow FD_SETSIZE ( *nix, preopen_indexes=0, worker=threads ) +fixed #1038, quoted string for API select +fixed #1046, head SPZ overflow, snippet generation at non fast with SPZ +fixed #1048, distributed index can't sort \ filter because of missed attributes +fixed #1050, expression ranker vs agents +fixed #1051, added MVA64 support to UDFs +fixed #1054, max_query_time not handled properly on searching at RT index +fixed #1055, expansion_limit on searching at RT disk chunks +fixed #1057, daemon crashes on generating snippet with 0 documents provided +fixed #1060, load_files_scattered don't work +fixed #1065, libsphinxclient vs distribute index (agents) +fixed #1067, modifiers were not escaped in legacy query emulation +fixed #1071, master - agent communication got slower for a large query +fixed #1076, #1077, (redundant copying, and a possible mutex leak with uservars) +fixed #1078, blended vs FIELD_END +fixed #1084 crash \ index corruption on loading persist MVA +fixed #1091, RT attach of plain index with string \ MVA attributes prior regular attributes +fixed #1092, update got binloged with wrong TID +fixed #1098, crash on creating large expression +fixed #1099, cleaning up temporary files on fail of indexing +fixed #1100, missing xmlpipe_attr_bigint config directive +fixed #1101, now ignoring dashes within keywords when dash is not in charset_table +fixed #1103, ZONE operator incorrectly works on more than one keywords in a simple zone +fixed #1106, optimized WHERE id=value, WHERE id IN (values_list) clauses used in SELECT, UPDATE statements +fixed #1112, Sphinx doesn't work out-of-the-box because the collision of binlog_path option +fixed #1116, crash on FLUSH RTINDEX unknown-index-name +fixed #1117, occasional RT headers corruption (leading to crashes and/or missing results) +fixed #1119, missing expression ranker support in SphinxSE +fixed #1120, negative total_found, docs and hits counter on huge indexes + + + +Version 2.0.3-release, 23 dec 2011 +Bug fixes + +fixed #1031, SphinxQL parsing syntax for MVA at insert \ replace statements +fixed #1027, stalls on attribute update in high-concurrency load +fixed #1026, daemon crash on malformed API command +fixed #1021, max_children option has been ignored with worker=threads +fixed #1020, crash on large attribute files loading +fixed #1014, crash on rotation when index has been removed from config file (worker=threads, *nix box) +fixed #1001, broken MVA files in RT index while saving disk chunk +fixed #995, crash on empty MVA updates +fixed #994, crash on daemon shutdown with seamless_rotate=0 and workers=threads +fixed #993, #998, crash on replay DELETE statement vs RT index with dict=keywords, fixed sequential INSERT into dict=keywords index right after INSERT into dict=crc index +fixed #991, crash on indexing mssql source with mssql_unicode enabled +fixed #983, #950, crash on host name lookup (SphinxSE with MySQL 5.5) +fixed #981, snippet inconsistency with allow_empty=0 +fixed #980, broken index produced by index merge in rare cases +fixed #971, absent error message at master on agent "maxed out" +fixed #695, #815, #835, #866, malformed warnings in SphinxQL +fixed build of SphinxSE with MySQL 5.1 +fixed crash log for 'fork' and 'prefork' workers + + + Version 2.0.2-beta, 15 nov 2011 Major new features diff -Nru sphinxsearch-0.9.9+2.0.2beta/mysqlse/ha_sphinx.cc sphinxsearch-2.0.4/mysqlse/ha_sphinx.cc --- sphinxsearch-0.9.9+2.0.2beta/mysqlse/ha_sphinx.cc 2011-11-15 22:35:53.000000000 +0000 +++ sphinxsearch-2.0.4/mysqlse/ha_sphinx.cc 2012-03-01 13:47:52.000000000 +0000 @@ -1,10 +1,10 @@ // -// $Id: ha_sphinx.cc 3018 2011-11-15 22:35:53Z shodan $ +// $Id: ha_sphinx.cc 3133 2012-03-01 13:47:52Z shodan $ // // -// Copyright (c) 2001-2011, Andrew Aksyonoff -// Copyright (c) 2008-2011, Sphinx Technologies Inc +// Copyright (c) 2001-2012, Andrew Aksyonoff +// Copyright (c) 2008-2012, Sphinx Technologies Inc // All rights reserved // // This program is free software; you can redistribute it and/or modify @@ -154,7 +154,7 @@ #define SPHINXSE_MAX_ALLOC (16*1024*1024) #define SPHINXSE_MAX_KEYWORDSTATS 4096 -#define SPHINXSE_VERSION "2.0.2-beta" +#define SPHINXSE_VERSION "2.0.4-release" // FIXME? the following is cut-n-paste from sphinx.h and searchd.cpp // cut-n-paste is somewhat simpler that adding dependencies however.. @@ -204,6 +204,7 @@ SPH_RANK_MATCHANY = 5, ///< emulate old match-any weighting SPH_RANK_FIELDMASK = 6, ///< sets bits where there were matches SPH_RANK_SPH04 = 7, ///< codename SPH04, phrase proximity + bm25 + head/exact boost + SPH_RANK_EXPR = 8, ///< expression based ranker SPH_RANK_TOTAL, SPH_RANK_DEFAULT = SPH_RANK_PROXIMITY_BM25 @@ -521,6 +522,7 @@ int m_iWeights; ESphMatchMode m_eMode; ESphRankMode m_eRanker; + char * m_sRankExpr; ESphSortOrder m_eSort; char * m_sSortBy; int m_iMaxMatches; @@ -1240,6 +1242,7 @@ , m_iWeights ( 0 ) , m_eMode ( SPH_MATCH_ALL ) , m_eRanker ( SPH_RANK_PROXIMITY_BM25 ) + , m_sRankExpr ( NULL ) , m_eSort ( SPH_SORT_RELEVANCE ) , m_sSortBy ( "" ) , m_iMaxMatches ( 1000 ) @@ -1457,7 +1460,11 @@ else if ( !strcmp ( sValue, "matchany" ) ) m_eRanker = SPH_RANK_MATCHANY; else if ( !strcmp ( sValue, "fieldmask" ) ) m_eRanker = SPH_RANK_FIELDMASK; else if ( !strcmp ( sValue, "sph04" ) ) m_eRanker = SPH_RANK_SPH04; - else + else if ( !strncmp ( sValue, "expr:", 5 ) ) + { + m_eRanker = SPH_RANK_EXPR; + m_sRankExpr = sValue+5; + } else { snprintf ( m_sParseError, sizeof(m_sParseError), "unknown ranking mode '%s'", sValue ); SPH_RET(false); @@ -1837,6 +1844,8 @@ + strlen ( m_sGroupDistinct ) + strlen ( m_sComment ) + strlen ( m_sSelect ); + if ( m_eRanker==SPH_RANK_EXPR ) + iReqSize += 4 + strlen(m_sRankExpr); for ( int i=0; i=50515 - struct addrinfo tmp_hostent, *hp; - tmp_errno = getaddrinfo ( sHost, NULL, &tmp_hostent, &hp ); - if ( !tmp_errno ) + struct addrinfo *hp = NULL; + tmp_errno = getaddrinfo ( sHost, NULL, NULL, &hp ); + if ( !tmp_errno || !hp || !hp->ai_addr ) { - freeaddrinfo ( hp ); bError = true; + if ( hp ) + freeaddrinfo ( hp ); } #else struct hostent tmp_hostent, *hp; @@ -3051,11 +3063,11 @@ { for ( ; uValue>0 && !m_bUnpackError; uValue-=2 ) { - uint64 uEntry = UnpackDword (); - uEntry = ( uEntry<<32 ) | UnpackDword(); + uint32 uEntryLo = UnpackDword (); + uint32 uEntryHi = UnpackDword(); if ( pCur < sBuf+sizeof(sBuf)-24 ) // 20 chars per 64bit value plus some safety bytes { - snprintf ( pCur, sBuf+sizeof(sBuf)-pCur, "%llu", uEntry ); + snprintf ( pCur, sBuf+sizeof(sBuf)-pCur, "%u%u", uEntryHi, uEntryLo ); while ( *pCur ) *pCur++; if ( uValue>2 ) *pCur++ = ','; // non-trailing commas @@ -3393,7 +3405,7 @@ enum_field_types eType = table->field[i]->type(); if ( eType!=MYSQL_TYPE_TIMESTAMP && !IsIntegerFieldType(eType) && eType!=MYSQL_TYPE_VARCHAR && eType!=MYSQL_TYPE_FLOAT ) { - my_snprintf ( sError, sizeof(sError), "%s: column %s is of unsupported type (use int/bigint/timestamp/varchar/float)", + my_snprintf ( sError, sizeof(sError), "%s: column %d(%s) is of unsupported type (use int/bigint/timestamp/varchar/float)", name, i+1, table->field[i]->field_name ); break; } @@ -3592,5 +3604,5 @@ #endif // >50100 // -// $Id: ha_sphinx.cc 3018 2011-11-15 22:35:53Z shodan $ +// $Id: ha_sphinx.cc 3133 2012-03-01 13:47:52Z shodan $ // diff -Nru sphinxsearch-0.9.9+2.0.2beta/mysqlse/INSTALL sphinxsearch-2.0.4/mysqlse/INSTALL --- sphinxsearch-0.9.9+2.0.2beta/mysqlse/INSTALL 2010-07-07 16:12:02.000000000 +0000 +++ sphinxsearch-2.0.4/mysqlse/INSTALL 2012-03-01 13:47:52.000000000 +0000 @@ -42,7 +42,7 @@ cd mysql-5.0.91 patch -p1 -i sql/sphinx/sphinx.5.0.91.diff -win/configure.js WITH_SPHINX_STORAGE_ENGINE -win/build-vs8 +win\configure.js WITH_SPHINX_STORAGE_ENGINE +win\build-vs8 --eof-- diff -Nru sphinxsearch-0.9.9+2.0.2beta/mysqlse/snippets_udf.cc sphinxsearch-2.0.4/mysqlse/snippets_udf.cc --- sphinxsearch-0.9.9+2.0.2beta/mysqlse/snippets_udf.cc 2011-08-17 21:17:31.000000000 +0000 +++ sphinxsearch-2.0.4/mysqlse/snippets_udf.cc 2012-01-30 23:07:35.000000000 +0000 @@ -1,10 +1,10 @@ // -// $Id: snippets_udf.cc 2918 2011-08-17 21:17:31Z tomat $ +// $Id: snippets_udf.cc 3087 2012-01-30 23:07:35Z shodan $ // // -// Copyright (c) 2001-2011, Andrew Aksyonoff -// Copyright (c) 2008-2011, Sphinx Technologies Inc +// Copyright (c) 2001-2012, Andrew Aksyonoff +// Copyright (c) 2008-2012, Sphinx Technologies Inc // All rights reserved // // This program is free software; you can redistribute it and/or modify @@ -787,5 +787,5 @@ } // -// $Id: snippets_udf.cc 2918 2011-08-17 21:17:31Z tomat $ +// $Id: snippets_udf.cc 3087 2012-01-30 23:07:35Z shodan $ // diff -Nru sphinxsearch-0.9.9+2.0.2beta/smoke.sh sphinxsearch-2.0.4/smoke.sh --- sphinxsearch-0.9.9+2.0.2beta/smoke.sh 2011-03-17 16:56:34.000000000 +0000 +++ sphinxsearch-2.0.4/smoke.sh 2012-02-28 08:57:13.000000000 +0000 @@ -1,7 +1,9 @@ #!/bin/sh +SHELL='/bin/sh' + jobs=$(grep -c processor /proc/cpuinfo) -FAILLOG="/tmp/faillog" +[ "z$FAILLOG" = "z" ] && FAILLOG="/tmp/faillog" LINE="-------------------------------\n" if [ q"1" = q"$jobs" ] ; then jobs="" @@ -36,7 +38,7 @@ for CONFARGS in "--with-debug" "--with-debug --enable-id64"; do BANNER="testing $CONFARGS build" - cmd "./configure $CONFARGS" "$BANNER: configure failed" + cmd "$SHELL ./configure $CONFARGS" "$BANNER: configure failed" cmd "make clean" "$BANNER: make clean failed" cmd "make $jobs" "$BANNER: make failed" diff -Nru sphinxsearch-0.9.9+2.0.2beta/sphinx-min.conf.in sphinxsearch-2.0.4/sphinx-min.conf.in --- sphinxsearch-0.9.9+2.0.2beta/sphinx-min.conf.in 2011-04-18 14:39:40.000000000 +0000 +++ sphinxsearch-2.0.4/sphinx-min.conf.in 2012-02-28 14:55:53.000000000 +0000 @@ -66,4 +66,5 @@ preopen_indexes = 1 unlink_old = 1 workers = threads # for RT to work + binlog_path = @CONFDIR@/data } diff -Nru sphinxsearch-0.9.9+2.0.2beta/src/indexer.cpp sphinxsearch-2.0.4/src/indexer.cpp --- sphinxsearch-0.9.9+2.0.2beta/src/indexer.cpp 2011-09-20 20:07:12.000000000 +0000 +++ sphinxsearch-2.0.4/src/indexer.cpp 2012-01-30 23:07:35.000000000 +0000 @@ -1,10 +1,10 @@ // -// $Id: indexer.cpp 2964 2011-09-20 20:07:12Z tomat $ +// $Id: indexer.cpp 3087 2012-01-30 23:07:35Z shodan $ // // -// Copyright (c) 2001-2011, Andrew Aksyonoff -// Copyright (c) 2008-2011, Sphinx Technologies Inc +// Copyright (c) 2001-2012, Andrew Aksyonoff +// Copyright (c) 2008-2012, Sphinx Technologies Inc // All rights reserved // // This program is free software; you can redistribute it and/or modify @@ -1822,5 +1822,5 @@ } // -// $Id: indexer.cpp 2964 2011-09-20 20:07:12Z tomat $ +// $Id: indexer.cpp 3087 2012-01-30 23:07:35Z shodan $ // diff -Nru sphinxsearch-0.9.9+2.0.2beta/src/indextool.cpp sphinxsearch-2.0.4/src/indextool.cpp --- sphinxsearch-0.9.9+2.0.2beta/src/indextool.cpp 2011-09-11 23:24:14.000000000 +0000 +++ sphinxsearch-2.0.4/src/indextool.cpp 2012-01-30 23:07:35.000000000 +0000 @@ -1,10 +1,10 @@ // -// $Id: indextool.cpp 2948 2011-09-11 23:24:14Z tomat $ +// $Id: indextool.cpp 3087 2012-01-30 23:07:35Z shodan $ // // -// Copyright (c) 2001-2011, Andrew Aksyonoff -// Copyright (c) 2008-2011, Sphinx Technologies Inc +// Copyright (c) 2001-2012, Andrew Aksyonoff +// Copyright (c) 2008-2012, Sphinx Technologies Inc // All rights reserved // // This program is free software; you can redistribute it and/or modify @@ -553,5 +553,5 @@ } // -// $Id: indextool.cpp 2948 2011-09-11 23:24:14Z tomat $ +// $Id: indextool.cpp 3087 2012-01-30 23:07:35Z shodan $ // diff -Nru sphinxsearch-0.9.9+2.0.2beta/src/search.cpp sphinxsearch-2.0.4/src/search.cpp --- sphinxsearch-0.9.9+2.0.2beta/src/search.cpp 2011-09-11 23:24:14.000000000 +0000 +++ sphinxsearch-2.0.4/src/search.cpp 2012-01-30 23:07:35.000000000 +0000 @@ -1,10 +1,10 @@ // -// $Id: search.cpp 2948 2011-09-11 23:24:14Z tomat $ +// $Id: search.cpp 3087 2012-01-30 23:07:35Z shodan $ // // -// Copyright (c) 2001-2011, Andrew Aksyonoff -// Copyright (c) 2008-2011, Sphinx Technologies Inc +// Copyright (c) 2001-2012, Andrew Aksyonoff +// Copyright (c) 2008-2012, Sphinx Technologies Inc // All rights reserved // // This program is free software; you can redistribute it and/or modify @@ -335,7 +335,7 @@ return 1; } - fprintf ( stdout, "index '%s': query '%s': returned %d matches of %d total in %d.%03d sec\n", + fprintf ( stdout, "index '%s': query '%s': returned %d matches of "INT64_FMT" total in %d.%03d sec\n", sIndexName, sQuery, pResult->m_dMatches.GetLength(), pResult->m_iTotalMatches, pResult->m_iQueryTime/1000, pResult->m_iQueryTime%1000 ); @@ -448,7 +448,7 @@ while ( pResult->m_hWordStats.IterateNext() ) { const CSphQueryResultMeta::WordStat_t & tStat = pResult->m_hWordStats.IterateGet(); - fprintf ( stdout, "%d. '%s': %d documents, %d hits\n", + fprintf ( stdout, "%d. '%s': "INT64_FMT" documents, "INT64_FMT" hits\n", iWord, pResult->m_hWordStats.IterateGetKey().cstr(), tStat.m_iDocs, @@ -468,5 +468,5 @@ } // -// $Id: search.cpp 2948 2011-09-11 23:24:14Z tomat $ +// $Id: search.cpp 3087 2012-01-30 23:07:35Z shodan $ // diff -Nru sphinxsearch-0.9.9+2.0.2beta/src/searchd.cpp sphinxsearch-2.0.4/src/searchd.cpp --- sphinxsearch-0.9.9+2.0.2beta/src/searchd.cpp 2011-11-15 22:22:49.000000000 +0000 +++ sphinxsearch-2.0.4/src/searchd.cpp 2012-03-01 00:26:39.000000000 +0000 @@ -1,10 +1,10 @@ // -// $Id: searchd.cpp 3017 2011-11-15 22:22:49Z shodan $ +// $Id: searchd.cpp 3127 2012-03-01 00:26:39Z shodan $ // // -// Copyright (c) 2001-2011, Andrew Aksyonoff -// Copyright (c) 2008-2011, Sphinx Technologies Inc +// Copyright (c) 2001-2012, Andrew Aksyonoff +// Copyright (c) 2008-2012, Sphinx Technologies Inc // All rights reserved // // This program is free software; you can redistribute it and/or modify @@ -63,6 +63,7 @@ // UNIX-specific headers and calls #include #include + #include #include #include #include @@ -191,9 +192,9 @@ void SetupTLS (); private: - CrashQuery_t m_tQuery; - - static SphThreadKey_t m_tLastQueryTLS; // last query ( non threaded workers could use dist_threads too ) + CrashQuery_t m_tQuery; // per thread copy of last query for thread mode + static CrashQuery_t m_tForkQuery; // copy of last query for fork / prefork modes + static SphThreadKey_t m_tLastQueryTLS; // last query ( non threaded workers could use dist_threads too ) }; enum LogFormat_e @@ -571,15 +572,22 @@ ////////////////////////////////////////////////////////////////////////// +/// available uservar types enum Uservar_e { USERVAR_INT_SET }; +/// uservar name to value binding struct Uservar_t { - Uservar_e m_eType; - CSphVector * m_pVal; + Uservar_e m_eType; + UservarIntSet_c * m_pVal; + + Uservar_t () + : m_eType ( USERVAR_INT_SET ) + , m_pVal ( NULL ) + {} }; static CSphStaticMutex g_tUservarsMutex; @@ -789,9 +797,10 @@ // hence, we also need to acquire a lock on entry, and an exclusive one Wlock(); bool bRes = false; - ServedIndex_t * pEntry = GetWlockedEntry ( tKey ); + ServedIndex_t * pEntry = BASE::operator() ( tKey ); if ( pEntry ) { + pEntry->WriteLock(); pEntry->Unlock(); bRes = BASE::Delete ( tKey ); } @@ -1275,7 +1284,10 @@ // tell rotation thread to shutdown, and wait until it does g_bRotateShutdown = true; - sphThreadJoin ( &g_tRotateThread ); + if ( g_bSeamlessRotate ) + { + sphThreadJoin ( &g_tRotateThread ); + } g_tRotateQueueMutex.Done(); g_tRotateConfigMutex.Done(); @@ -1526,6 +1538,7 @@ static char g_sMinidump[SPH_TIME_PID_MAX_SIZE] = ""; #endif +CrashQuery_t SphCrashLogger_c::m_tForkQuery = CrashQuery_t(); SphThreadKey_t SphCrashLogger_c::m_tLastQueryTLS = SphThreadKey_t (); void SphCrashLogger_c::Init () @@ -1667,6 +1680,7 @@ void SphCrashLogger_c::SetLastQuery ( const CrashQuery_t & tQuery ) { + m_tForkQuery = tQuery; SphCrashLogger_c * pCrashLogger = (SphCrashLogger_c *)sphThreadGet ( m_tLastQueryTLS ); if ( pCrashLogger ) { @@ -1690,7 +1704,7 @@ CrashQuery_t SphCrashLogger_c::GetQuery() { SphCrashLogger_c * pCrashLogger = (SphCrashLogger_c *)sphThreadGet ( m_tLastQueryTLS ); - return pCrashLogger ? pCrashLogger->m_tQuery : CrashQuery_t(); + return pCrashLogger ? pCrashLogger->m_tQuery : m_tForkQuery; } @@ -2239,6 +2253,14 @@ explicit NetOutputBuffer_c ( int iSock ); bool SendInt ( int iValue ) { return SendT ( htonl ( iValue ) ); } + bool SendAsDword ( int64_t iValue ) ///< sends the 32bit MAX_UINT if the value is greater than it. + { + if ( iValue < 0 ) + return SendDword ( 0 ); + if ( iValue > UINT_MAX ) + return SendDword ( UINT_MAX ); + return SendDword ( DWORD(iValue) ); + } bool SendDword ( DWORD iValue ) { return SendT ( htonl ( iValue ) ); } bool SendLSBDword ( DWORD v ) { SendByte ( (BYTE)( v&0xff ) ); SendByte ( (BYTE)( (v>>8)&0xff ) ); SendByte ( (BYTE)( (v>>16)&0xff ) ); return SendByte ( (BYTE)( (v>>24)&0xff) ); } bool SendWord ( WORD iValue ) { return SendT ( htons ( iValue ) ); } @@ -3251,7 +3273,13 @@ // send request NetOutputBuffer_c tOut ( tAgent.m_iSock ); tBuilder.BuildRequest ( tAgent.m_sIndexes.cstr(), tOut, i ); - tOut.Flush (); // FIXME! handle flush failure? + bool bFlushed = tOut.Flush (); // FIXME! handle flush failure? + +#ifdef TCP_NODELAY + int iDisable = 1; + if ( bFlushed && tAgent.m_iFamily==AF_INET ) + setsockopt ( tAgent.m_iSock, IPPROTO_TCP, TCP_NODELAY, (char*)&iDisable, sizeof(iDisable) ); +#endif tAgent.m_eState = AGENT_QUERY; iAgents++; @@ -3445,6 +3473,8 @@ } else if ( tAgent.m_iReplyStatus==SEARCHD_RETRY ) { tAgent.m_eState = AGENT_RETRY; + CSphString sAgentError = tReq.GetString (); + tAgent.m_sFailure.SetSprintf ( "remote warning: %s", sAgentError.cstr() ); break; } else if ( tAgent.m_iReplyStatus!=SEARCHD_OK ) @@ -3554,11 +3584,11 @@ + q.m_sGroupDistinct.Length() + q.m_sComment.Length() + q.m_sSelect.Length(); - if ( !q.m_bAgent ) // send the magic to agent ("*,*," + real query) - iReqSize += q.m_sSelect.IsEmpty() ? 3 : 4; iReqSize += q.m_sRawQuery.IsEmpty() ? q.m_sQuery.Length() : q.m_sRawQuery.Length(); + if ( q.m_eRanker==SPH_RANK_EXPR ) + iReqSize += q.m_sRankerExpr.Length() + 4; ARRAY_FOREACH ( j, q.m_dFilters ) { const CSphFilterSettings & tFilter = q.m_dFilters[j]; @@ -3589,6 +3619,8 @@ tOut.SendInt ( q.m_iMaxMatches ); // limit is MAX_MATCHES tOut.SendInt ( (DWORD)q.m_eMode ); // match mode tOut.SendInt ( (DWORD)q.m_eRanker ); // ranking mode + if ( q.m_eRanker==SPH_RANK_EXPR ) + tOut.SendString ( q.m_sRankerExpr.cstr() ); tOut.SendInt ( q.m_eSort ); // sort mode tOut.SendString ( q.m_sSortBy.cstr() ); // sort attr if ( q.m_sRawQuery.IsEmpty() ) @@ -3676,25 +3708,7 @@ } } } - if ( q.m_bAgent ) - { - tOut.SendString ( q.m_sSelect.cstr() ); - } else - { - int iLen = q.m_sSelect.Length(); - if ( !iLen ) - { - tOut.SendString ( "*,*" ); - } else - { - // this was a fun subtle issue - // SetSprintf() uses a static 1K buffer... - tOut.SendInt ( iLen+4 ); - tOut.SendBytes ( "*,*,", 4 ); - tOut.SendBytes ( q.m_sSelect.cstr(), iLen ); - } - } - + tOut.SendString ( q.m_sSelect.cstr() ); // master v.1.0 tOut.SendDword ( q.m_eCollation ); } @@ -3845,7 +3859,7 @@ // read totals (retrieved count, total count, query time, word count) int iRetrieved = tReq.GetInt (); - tRes.m_iTotalMatches = tReq.GetInt (); + tRes.m_iTotalMatches = (unsigned int)tReq.GetInt (); tRes.m_iQueryTime = tReq.GetInt (); const int iWordsCount = tReq.GetInt (); // FIXME! sanity check? if ( iRetrieved!=iMatches ) @@ -3858,8 +3872,8 @@ for ( int i=0; i & dOut ) +void ParseIndexList ( const CSphString & sIndexes, CSphVector & dOut ) { CSphString sSplit = sIndexes; char * p = (char*)sSplit.cstr(); @@ -4033,7 +4047,7 @@ assert ( sNext!=p ); if ( *p ) *p++ = '\0'; // if it was not the end yet, we'll continue from next char - dOut.Add().m_sName = sNext; + dOut.Add ( sNext ); } } @@ -4118,8 +4132,13 @@ while ( ( c = *szQuery++ )!=0 ) { // must be in sync with EscapeString (php api) - if ( c=='(' || c==')' || c=='|' || c=='-' || c=='!' || c=='@' || c=='~' || c=='\"' || c=='&' || c=='/' || c=='<' || c=='\\' ) + const char sMagics[] = "<\\()|-!@~\"&/^$="; + for ( const char * s = sMagics; *s; s++ ) + if ( c==*s ) + { *szRes++ = '\\'; + break; + } *szRes++ = c; } @@ -4416,28 +4435,14 @@ // v.1.22 if ( iVer>=0x116 ) { - CSphString sRawSelect = tReq.GetString (); - CSphString sSelect = ""; + tQuery.m_sSelect = tReq.GetString (); + tQuery.m_bAgent = ( iMasterVer>0 ); CSphString sError; - bool bAgent = false; - if ( sRawSelect.Begins ( "*,*" ) ) // this is the mark of agent. - { - bAgent = true; - if ( sRawSelect.Length()>3 ) - sSelect = sRawSelect.SubString ( 4, sRawSelect.Length()-4 ); - } - - tQuery.m_sSelect = bAgent?sSelect:sRawSelect; if ( !tQuery.ParseSelectList ( sError ) ) { tReq.SendErrorReply ( "select: %s", sError.cstr() ); return false; } - if ( bAgent ) - { - tQuery.m_sSelect = sRawSelect; - tQuery.m_bAgent = true; - } } // master v.1.0 @@ -4510,7 +4515,7 @@ // [matchmode/numfilters/sortmode matches (offset,limit) static const char * sModes [ SPH_MATCH_TOTAL ] = { "all", "any", "phr", "bool", "ext", "scan", "ext2" }; static const char * sSort [ SPH_SORT_TOTAL ] = { "rel", "attr-", "attr+", "tsegs", "ext", "expr" }; - p += snprintf ( p, pMax-p, " [%s/%d/%s %d (%d,%d)", + p += snprintf ( p, pMax-p, " [%s/%d/%s "INT64_FMT" (%d,%d)", sModes [ tQuery.m_eMode ], tQuery.m_dFilters.GetLength(), sSort [ tQuery.m_eSort ], tRes.m_iTotalMatches, tQuery.m_iOffset, tQuery.m_iLimit ); @@ -4746,10 +4751,10 @@ tBuf.Append ( "/""* " ); tBuf.AppendCurrentTime(); if ( tRes.m_iMultiplier>1 ) - tBuf.Append ( " conn %d wall %d.%03d x%d found %d *""/ ", + tBuf.Append ( " conn %d wall %d.%03d x%d found "INT64_FMT" *""/ ", iCid, iQueryTime/1000, iQueryTime%1000, tRes.m_iMultiplier, tRes.m_iTotalMatches ); else - tBuf.Append ( " conn %d wall %d.%03d found %d *""/ ", + tBuf.Append ( " conn %d wall %d.%03d found "INT64_FMT" *""/ ", iCid, iQueryTime/1000, iQueryTime%1000, tRes.m_iTotalMatches ); /////////////////////////////////// @@ -4970,6 +4975,23 @@ ////////////////////////////////////////////////////////////////////////// +// internals attributes are last no need to send them +static int SendGetAttrCount ( const CSphSchema & tSchema ) +{ + int iCount = tSchema.GetAttrsCount(); + if ( iCount + && sphIsSortStringInternal ( tSchema.GetAttr ( iCount-1 ).m_sName.cstr() ) ) + { + for ( int i=iCount-1; i>=0 && sphIsSortStringInternal ( tSchema.GetAttr(i).m_sName.cstr() ); i-- ) + { + iCount = i; + } + } + + return iCount; +} + + int CalcResultLength ( int iVer, const CSphQueryResult * pRes, const CSphVector & dTag2Pools, bool bExtendedStat ) { int iRespLen = 0; @@ -4996,13 +5018,15 @@ // query stats iRespLen += 20; + int iAttrsCount = SendGetAttrCount ( pRes->m_tSchema ); + // schema if ( iVer>=0x102 ) { iRespLen += 8; // 4 for field count, 4 for attr count ARRAY_FOREACH ( i, pRes->m_tSchema.m_dFields ) iRespLen += 4 + strlen ( pRes->m_tSchema.m_dFields[i].m_sName.cstr() ); // namelen, name - for ( int i=0; im_tSchema.GetAttrsCount(); i++ ) + for ( int i=0; im_tSchema.GetAttr(i).m_sName.cstr() ); // namelen, name, type } @@ -5010,15 +5034,15 @@ if ( iVer<0x102 ) iRespLen += 16*pRes->m_iCount; // matches else if ( iVer<0x108 ) - iRespLen += ( 8+4*pRes->m_tSchema.GetAttrsCount() )*pRes->m_iCount; // matches + iRespLen += ( 8+4*iAttrsCount )*pRes->m_iCount; // matches else - iRespLen += 4 + ( 8+4*USE_64BIT+4*pRes->m_tSchema.GetAttrsCount() )*pRes->m_iCount; // id64 tag and matches + iRespLen += 4 + ( 8+4*USE_64BIT+4*iAttrsCount )*pRes->m_iCount; // id64 tag and matches if ( iVer>=0x114 ) { // 64bit matches int iWideAttrs = 0; - for ( int i=0; im_tSchema.GetAttrsCount(); i++ ) + for ( int i=0; im_tSchema.GetAttr(i).m_eAttrType==SPH_ATTR_BIGINT ) iWideAttrs++; iRespLen += 4*pRes->m_iCount*iWideAttrs; // extra 4 bytes per attr per match @@ -5035,7 +5059,7 @@ // MVA and string values CSphVector dMvaItems; CSphVector dStringItems; - for ( int i=0; im_tSchema.GetAttrsCount(); i++ ) + for ( int i=0; im_tSchema.GetAttr(i); if ( tCol.m_eAttrType==SPH_ATTR_UINT32SET || tCol.m_eAttrType==SPH_ATTR_UINT64SET ) @@ -5115,6 +5139,8 @@ tOut.SendString ( pRes->m_sWarning.cstr() ); } + int iAttrsCount = SendGetAttrCount ( pRes->m_tSchema ); + // send schema if ( iVer>=0x102 ) { @@ -5122,8 +5148,8 @@ ARRAY_FOREACH ( i, pRes->m_tSchema.m_dFields ) tOut.SendString ( pRes->m_tSchema.m_dFields[i].m_sName.cstr() ); - tOut.SendInt ( pRes->m_tSchema.GetAttrsCount() ); - for ( int i=0; im_tSchema.GetAttrsCount(); i++ ) + tOut.SendInt ( iAttrsCount ); + for ( int i=0; im_tSchema.GetAttr(i); tOut.SendString ( tCol.m_sName.cstr() ); @@ -5180,7 +5206,7 @@ assert ( !tMatch.m_pDynamic || (int)tMatch.m_pDynamic[-1]==pRes->m_tSchema.GetDynamicSize() ); #endif - for ( int j=0; jm_tSchema.GetAttrsCount(); j++ ) + for ( int j=0; jm_tSchema.GetAttr(j); if ( tAttr.m_eAttrType==SPH_ATTR_UINT32SET || tAttr.m_eAttrType==SPH_ATTR_UINT64SET ) @@ -5252,7 +5278,7 @@ } } tOut.SendInt ( pRes->m_dMatches.GetLength() ); - tOut.SendInt ( pRes->m_iTotalMatches ); + tOut.SendAsDword ( pRes->m_iTotalMatches ); tOut.SendInt ( Max ( pRes->m_iQueryTime, 0 ) ); tOut.SendInt ( pRes->m_hWordStats.GetLength() ); @@ -5261,8 +5287,8 @@ { const CSphQueryResultMeta::WordStat_t & tStat = pRes->m_hWordStats.IterateGet(); tOut.SendString ( pRes->m_hWordStats.IterateGetKey().cstr() ); - tOut.SendInt ( tStat.m_iDocs ); - tOut.SendInt ( tStat.m_iHits ); + tOut.SendAsDword ( tStat.m_iDocs ); + tOut.SendAsDword ( tStat.m_iHits ); if ( bExtendedStat ) tOut.SendByte ( tStat.m_bExpanded ); } @@ -5371,9 +5397,8 @@ ); } int iLimit = bMultiSchema - ? ( iCur + pRes->m_dMatchCounts[iSchema] ) - : pRes->m_iTotalMatches; - iLimit = Min ( iLimit, pRes->m_dMatches.GetLength() ); + ? (int)Min ( iCur + pRes->m_dMatchCounts[iSchema], pRes->m_dMatches.GetLength() ) + : (int)Min ( pRes->m_iTotalMatches, pRes->m_dMatches.GetLength() ); for ( int i=iCur; im_dMatches[i]; @@ -6084,6 +6109,7 @@ void RunLocalSearches ( ISphMatchSorter * pLocalSorter, const char * sDistName ); void RunLocalSearchesMT (); bool RunLocalSearch ( int iLocal, ISphMatchSorter ** ppSorters, CSphQueryResult ** pResults ) const; + bool HasExpresions ( int iStart, int iEnd ) const; CSphVector m_dMvaStorage; CSphVector m_dStringsStorage; @@ -6091,12 +6117,14 @@ int m_iStart; ///< subset start int m_iEnd; ///< subset end bool m_bMultiQueue; ///< whether current subset is subject to multi-queue optimization - mutable CSphVector m_dLocal; ///< local indexes for the current subset + CSphVector m_dLocal; ///< local indexes for the current subset mutable CSphVector m_dExtraSchemas; ///< the extra fields for agents - mutable CSphMutex m_tLock; bool m_bSphinxql; ///< if the query get from sphinxql - to avoid applying sphinxql magick for others CSphAttrUpdateEx * m_pUpdates; ///< holder for updates + mutable CSphMutex m_tLock; + mutable SmallStringHash_T m_hUsed; + const ServedIndex_t * UseIndex ( int iLocal ) const; void ReleaseIndex ( int iLocal ) const; @@ -6134,10 +6162,11 @@ SearchHandler_c::~SearchHandler_c () { m_tLock.Done(); - ARRAY_FOREACH ( i, m_dLocal ) + m_hUsed.IterateStart(); + while ( m_hUsed.IterateNext() ) { - if ( m_dLocal[i].m_iValue>0 ) - g_pIndexes->GetUnlockedEntry ( m_dLocal[i].m_sName ).Unlock(); + if ( m_hUsed.IterateGet()>0 ) + g_pIndexes->GetUnlockedEntry ( m_hUsed.IterateGetKey() ).Unlock(); } } @@ -6145,25 +6174,32 @@ const ServedIndex_t * SearchHandler_c::UseIndex ( int iLocal ) const { assert ( iLocal>=0 && iLocalGetRlockedEntry ( m_dLocal[iLocal].m_sName ); + return g_pIndexes->GetRlockedEntry ( sName ); m_tLock.Lock(); - - int iUseCount = m_dLocal[iLocal].m_iValue; - - assert ( ( m_pUpdates && iUseCount>0 ) || !m_pUpdates ); + int * pUseCount = m_hUsed ( sName ); + assert ( ( m_pUpdates && pUseCount && *pUseCount>0 ) || !m_pUpdates ); const ServedIndex_t * pServed = NULL; - if ( iUseCount ) - pServed = &g_pIndexes->GetUnlockedEntry ( m_dLocal[iLocal].m_sName ); - else - pServed = g_pIndexes->GetRlockedEntry ( m_dLocal[iLocal].m_sName ); - - m_dLocal[iLocal].m_iValue = iUseCount + (pServed!=NULL); + if ( pUseCount && *pUseCount>0 ) + { + pServed = &g_pIndexes->GetUnlockedEntry ( sName ); + *pUseCount += ( pServed!=NULL ); + } else + { + pServed = g_pIndexes->GetRlockedEntry ( sName ); + if ( pServed ) + { + if ( pUseCount ) + (*pUseCount)++; + else + m_hUsed.Add ( 1, sName ); + } + } m_tLock.Unlock(); - return pServed; } @@ -6174,16 +6210,17 @@ if ( g_eWorkers!=MPM_THREADS ) return; + const CSphString & sName = m_dLocal[iLocal]; m_tLock.Lock(); - int iUseCount = m_dLocal[iLocal].m_iValue - 1; - assert ( iUseCount>=0 ); - m_dLocal[iLocal].m_iValue = iUseCount; + int * pUseCount = m_hUsed ( sName ); + assert ( pUseCount && *pUseCount>=0 ); + (*pUseCount)--; - if ( !iUseCount ) - g_pIndexes->GetUnlockedEntry ( m_dLocal[iLocal].m_sName ).Unlock(); + if ( !*pUseCount ) + g_pIndexes->GetUnlockedEntry ( sName ).Unlock(); - assert ( ( m_pUpdates && iUseCount>0 ) || !m_pUpdates ); + assert ( ( m_pUpdates && pUseCount && *pUseCount ) || !m_pUpdates ); m_tLock.Unlock(); } @@ -6196,8 +6233,10 @@ m_dQueries[0] = tQuery; m_dQueries[0].m_sIndexes = sIndex; - m_dLocal.Add().m_sName = sIndex; - m_dLocal.Last().m_iValue = 1; + // lets add index to prevent deadlock + // as index already r-locker or w-locked at this point + m_dLocal.Add ( sIndex ); + m_hUsed.Add ( 1, sIndex ); CheckQuery ( tQuery, *pUpdates->m_pError ); if ( !pUpdates->m_pError->IsEmpty() ) @@ -6474,7 +6513,7 @@ ARRAY_FOREACH ( iLocal, dLocals ) { bool bResult = dLocals[iLocal].m_bResult; - const char * sLocal = m_dLocal[iLocal].m_sName.cstr(); + const char * sLocal = m_dLocal[iLocal].cstr(); if ( !bResult ) { @@ -6640,7 +6679,7 @@ CSphVector dLocked; ARRAY_FOREACH ( iLocal, m_dLocal ) { - const char * sLocal = m_dLocal[iLocal].m_sName.cstr(); + const char * sLocal = m_dLocal[iLocal].cstr(); const ServedIndex_t * pServed = UseIndex ( iLocal ); if ( !pServed ) @@ -6806,21 +6845,26 @@ // check expressions into a query to make sure that it's ready for multi query optimization -static bool HasExpresions ( const CSphQuery & tQuery, const CSphVector& m_dIndices ) +bool SearchHandler_c::HasExpresions ( int iStart, int iEnd ) const { - ARRAY_FOREACH ( i, m_dIndices ) + ARRAY_FOREACH ( i, m_dLocal ) { - const ServedIndex_t * pServedIndex = g_pIndexes->GetRlockedEntry ( m_dIndices[i].m_sName ); + const ServedIndex_t * pServedIndex = UseIndex ( i ); // check that it exists - if ( !pServedIndex ) - return false; + if ( !pServedIndex || !pServedIndex->m_bEnabled ) + { + if ( pServedIndex ) + ReleaseIndex ( i ); + continue; + } bool bHasExpression = false; - if ( pServedIndex->m_bEnabled ) - bHasExpression = sphHasExpressions ( tQuery, pServedIndex->m_pIndex->GetMatchSchema() ); + const CSphSchema & tSchema = pServedIndex->m_pIndex->GetMatchSchema(); + for ( int iCheck=iStart; iCheck<=iEnd && !bHasExpression; iCheck++ ) + bHasExpression = sphHasExpressions ( m_dQueries[iCheck], tSchema ); - pServedIndex->Unlock(); + ReleaseIndex ( i ); if ( bHasExpression ) return true; @@ -6833,7 +6877,7 @@ { m_iStart = iStart; m_iEnd = iEnd; - m_dLocal.Reset (); + m_dLocal.Reset(); // all my stats int64_t tmSubset = sphMicroTimer(); @@ -6922,7 +6966,7 @@ // search through all local indexes for ( IndexHashIterator_c it ( g_pIndexes ); it.Next(); ) if ( it.Get ().m_bEnabled ) - m_dLocal.Add().m_sName = it.GetKey(); + m_dLocal.Add ( it.GetKey() ); } else { // search through specified local indexes @@ -6933,7 +6977,7 @@ g_tDistLock.Lock(); ARRAY_FOREACH ( i, m_dLocal ) - if ( g_hDistIndexes.Exists ( m_dLocal[i].m_sName ) ) + if ( g_hDistIndexes.Exists ( m_dLocal[i] ) ) { iDistFound = i; break; @@ -6944,27 +6988,27 @@ if ( iDistFound!=-1 ) { for ( int iRes=iStart; iRes<=iEnd; iRes++ ) - m_dResults[iRes].m_sError.SetSprintf ( "distributed index '%s' in multi-index query found", m_dLocal[iDistFound].m_sName.cstr() ); + m_dResults[iRes].m_sError.SetSprintf ( "distributed index '%s' in multi-index query found", m_dLocal[iDistFound].cstr() ); return; } ARRAY_FOREACH ( i, m_dLocal ) { - const ServedIndex_t * pServedIndex = g_pIndexes->GetRlockedEntry ( m_dLocal[i].m_sName ); + const ServedIndex_t * pServedIndex = UseIndex ( i ); // check that it exists if ( !pServedIndex ) { for ( int iRes=iStart; iRes<=iEnd; iRes++ ) - m_dResults[iRes].m_sError.SetSprintf ( "unknown local index '%s' in search request", m_dLocal[i].m_sName.cstr() ); + m_dResults[iRes].m_sError.SetSprintf ( "unknown local index '%s' in search request", m_dLocal[i].cstr() ); return; } + bool bEnabled = pServedIndex->m_bEnabled; + ReleaseIndex ( i ); // if it exists but is not enabled, remove it from the list and force recheck - if ( !pServedIndex->m_bEnabled ) + if ( !bEnabled ) m_dLocal.Remove ( i-- ); - - pServedIndex->Unlock(); } } @@ -6981,14 +7025,16 @@ // copy local indexes list from distributed definition, but filter out disabled ones ARRAY_FOREACH ( i, dDistLocal ) { - const ServedIndex_t * pServedIndex = g_pIndexes->GetRlockedEntry ( dDistLocal[i] ); + int iDistLocal = m_dLocal.GetLength(); + m_dLocal.Add ( dDistLocal[i] ); + + const ServedIndex_t * pServedIndex = UseIndex ( iDistLocal ); + bool bValidLocalIndex = pServedIndex && pServedIndex->m_bEnabled; if ( pServedIndex ) - { - if ( pServedIndex->m_bEnabled ) - m_dLocal.Add().m_sName = dDistLocal[i]; + ReleaseIndex ( iDistLocal ); - pServedIndex->Unlock(); - } + if ( !bValidLocalIndex ) + m_dLocal.Pop(); } } @@ -7001,17 +7047,17 @@ { CSphString sError; - // check if all schemas are equal + // check if all schemes are equal bool bAllEqual = true; - const ServedIndex_t * pFirstIndex = g_pIndexes->GetRlockedEntry ( m_dLocal[0].m_sName ); + const ServedIndex_t * pFirstIndex = UseIndex ( 0 ); if ( !pFirstIndex ) break; const CSphSchema & tFirstSchema = pFirstIndex->m_pIndex->GetMatchSchema(); for ( int i=1; iGetRlockedEntry ( m_dLocal[i].m_sName ); + const ServedIndex_t * pNextIndex = UseIndex ( i ); if ( !pNextIndex ) { bAllEqual = false; @@ -7021,7 +7067,7 @@ if ( !tFirstSchema.CompareTo ( pNextIndex->m_pIndex->GetMatchSchema(), sError ) ) bAllEqual = false; - pNextIndex->Unlock(); + ReleaseIndex ( i ); } // we can reuse the very same sorter @@ -7032,14 +7078,14 @@ pLocalSorter = sphCreateQueue ( &m_dQueries[iStart], tFirstSchema, sError, true, pExtraSchemaMT ); } - pFirstIndex->Unlock (); + ReleaseIndex ( 0 ); break; } // select lists must have no expressions - for ( int iCheck=iStart; iCheck<=iEnd && m_bMultiQueue; iCheck++ ) + if ( m_bMultiQueue ) { - m_bMultiQueue = !HasExpresions ( m_dQueries[iCheck], m_dLocal ); + m_bMultiQueue = !HasExpresions ( iStart, iEnd ); } // these are mutual exclusive @@ -7221,7 +7267,7 @@ tRes.m_tSchema = tRes.m_dSchemas[0]; if ( tRes.m_iSuccesses>1 || tQuery.m_dItems.GetLength() ) { - if ( g_bCompatResults ) + if ( g_bCompatResults && !tQuery.m_bAgent ) { if ( !MinimizeAggrResultCompat ( tRes, tQuery, m_dLocal.GetLength()!=0 ) ) return; @@ -7250,10 +7296,6 @@ tRes.m_iCount = Max ( Min ( tQuery.m_iLimit, tRes.m_dMatches.GetLength()-tQuery.m_iOffset ), 0 ); } - // remove internal attributes from result schema - ARRAY_FOREACH ( i, m_dResults ) - sphSortRemoveInternalAttrs ( m_dResults[i].m_tSchema ); - // stats tmSubset = sphMicroTimer() - tmSubset; tmCpu = sphCpuTimer() - tmCpu; @@ -7516,6 +7558,7 @@ // SELECT specific CSphQuery m_tQuery; + CSphVector < CSphRefcountedPtr > m_dRefs; // used by INSERT, DELETE, CALL, DESC, ATTACH CSphString m_sIndex; @@ -8053,9 +8096,12 @@ void SqlParser_c::UpdateAttr ( const CSphString& sName, const SqlNode_t * pValue, ESphAttr eType ) { + assert ( eType==SPH_ATTR_FLOAT || eType==SPH_ATTR_INTEGER || eType==SPH_ATTR_BIGINT ); if ( eType==SPH_ATTR_FLOAT ) + { m_pStmt->m_tUpdate.m_dPool.Add ( *(const DWORD*)( &pValue->m_fValue ) ); - else // default: if ( eType==SPH_ATTR_INTEGER ) + + } else if ( eType==SPH_ATTR_INTEGER || eType==SPH_ATTR_BIGINT ) { m_pStmt->m_tUpdate.m_dPool.Add ( (DWORD) pValue->m_iValue ); DWORD uHi = (DWORD) ( pValue->m_iValue>>32 ); @@ -8068,25 +8114,36 @@ AddUpdatedAttr ( sName, eType ); } -void SqlParser_c::UpdateMVAAttr ( const CSphString& sName, const SqlNode_t& dValues ) +void SqlParser_c::UpdateMVAAttr ( const CSphString & sName, const SqlNode_t & dValues ) { CSphAttrUpdate & tUpd = m_pStmt->m_tUpdate; - assert ( dValues.m_pValues.Ptr() && dValues.m_pValues->GetLength()>0 ); - dValues.m_pValues->Uniq(); // don't need dupes within MVA - tUpd.m_dPool.Add ( dValues.m_pValues->GetLength()*2 ); - SphAttr_t * pVal = dValues.m_pValues.Ptr()->Begin(); - SphAttr_t * pValMax = pVal + dValues.m_pValues->GetLength(); ESphAttr eType = SPH_ATTR_UINT32SET; - for ( ;pValGetLength()>0 ) { - SphAttr_t uVal = *pVal; - if ( uVal>UINT_MAX ) + // got MVA values, let's process them + dValues.m_pValues->Uniq(); // don't need dupes within MVA + tUpd.m_dPool.Add ( dValues.m_pValues->GetLength()*2 ); + SphAttr_t * pVal = dValues.m_pValues.Ptr()->Begin(); + SphAttr_t * pValMax = pVal + dValues.m_pValues->GetLength(); + for ( ;pValUINT_MAX ) + { + eType = SPH_ATTR_UINT64SET; + } + tUpd.m_dPool.Add ( (DWORD)uVal ); + tUpd.m_dPool.Add ( (DWORD)( uVal>>32 ) ); } - tUpd.m_dPool.Add ( (DWORD)uVal ); - tUpd.m_dPool.Add ( (DWORD)( uVal>>32 ) ); + } else + { + // no values, means we should delete the attribute + // we signal that to the update code by putting a single zero + // to the values pool (meaning a zero-length MVA values list) + tUpd.m_dPool.Add ( 0 ); } + AddUpdatedAttr ( sName, eType ); } @@ -8126,11 +8183,10 @@ bool SqlParser_c::AddUservarFilter ( const CSphString & sCol, const CSphString & sVar, bool bExclude ) { - g_tUservarsMutex.Lock(); + CSphScopedLock tLock ( g_tUservarsMutex ); Uservar_t * pVar = g_hUservars ( sVar ); if ( !pVar ) { - g_tUservarsMutex.Unlock(); yyerror ( this, "undefined global variable in IN clause" ); return false; } @@ -8141,10 +8197,16 @@ return false; pFilter->m_bExclude = bExclude; - // INT_SET uservars must get sorted on SET once - // FIXME? maybe we should do a readlock instead of copying? - pFilter->m_dValues = *pVar->m_pVal; - g_tUservarsMutex.Unlock(); + // tricky black magic + // we want to avoid copying the data, hence external values in the filter + // we need to guarantee the data (uservar value) lifetime, then + // suddenly, enter mutex-protected refcounted value objects + // suddenly, we need to track those values in the statement object, too + assert ( pVar->m_pVal ); + CSphRefcountedPtr & tRef = m_pStmt->m_dRefs.Add(); + tRef = pVar->m_pVal; // take over semantics, and thus NO (!) automatic addref + pVar->m_pVal->AddRef(); // so do that addref manually + pFilter->SetExternalValues ( pVar->m_pVal->Begin(), pVar->m_pVal->GetLength() ); return true; } @@ -8221,14 +8283,6 @@ { tQuery.m_sSelect.SetBinary ( tParser.m_pBuf + tQuery.m_iSQLSelectStart, tQuery.m_iSQLSelectEnd - tQuery.m_iSQLSelectStart ); - - // finally check for agent magic - if ( tQuery.m_sSelect.Begins ( "*,*" ) ) // this is the mark of agent. - { - tQuery.m_dItems.Remove(0); - tQuery.m_dItems.Remove(0); - tQuery.m_bAgent = true; - } } } @@ -8311,6 +8365,11 @@ EXCERPT_FLAG_FILES_SCATTERED = 1024 }; +enum +{ + PROCESSED_ITEM = -2, + EOF_ITEM = -1 +}; struct SnippetWorker_t { int64_t m_iTotal; @@ -8319,7 +8378,7 @@ SnippetWorker_t() : m_iTotal ( 0 ) - , m_iHead ( -1 ) // -1 is the marker of the end of the list + , m_iHead ( EOF_ITEM ) , m_bLocal ( false ) {} }; @@ -8448,7 +8507,7 @@ + q.m_sRawPassageBoundary.Length(); m_iNumDocs = 0; - for ( int iDoc = tWorker.m_iHead; iDoc!=-1; iDoc=dQueries[iDoc].m_iNext ) + for ( int iDoc = tWorker.m_iHead; iDoc!=EOF_ITEM; iDoc=dQueries[iDoc].m_iNext ) { ++m_iNumDocs; m_iReqLen += 4 + dQueries[iDoc].m_sSource.Length(); @@ -8463,7 +8522,10 @@ tOut.SendInt ( m_iReqLen ); tOut.SendInt ( 0 ); - tOut.SendInt ( q.m_iRawFlags ); + + if ( m_bScattered ) + tOut.SendInt ( q.m_iRawFlags & ~EXCERPT_FLAG_LOAD_FILES ); + tOut.SendString ( sIndex ); tOut.SendString ( q.m_sWords.cstr() ); tOut.SendString ( q.m_sBeforeMatch.cstr() ); @@ -8479,7 +8541,7 @@ tOut.SendString ( q.m_sRawPassageBoundary.cstr() ); tOut.SendInt ( m_iNumDocs ); - for ( int iDoc = tWorker.m_iHead; iDoc!=-1; iDoc=dQueries[iDoc].m_iNext ) + for ( int iDoc = tWorker.m_iHead; iDoc!=EOF_ITEM; iDoc=dQueries[iDoc].m_iNext ) tOut.SendString ( dQueries[iDoc].m_sSource.cstr() ); } @@ -8493,7 +8555,7 @@ int iDoc = tWorker.m_iHead; bool bOk = true; - while ( iDoc!=-1 ) + while ( iDoc!=EOF_ITEM ) { if ( ( dQueries[iDoc].m_iLoadFiles&2 )!=0 ) // NOLINT { @@ -8507,7 +8569,8 @@ if ( strcmp ( sRes, dQueries[iDoc].m_sRes )!=0 ) bOk = false; SafeDelete ( dQueries[iDoc].m_sRes ); - } + } else + dQueries[iDoc].m_sError = ""; dQueries[iDoc].m_sRes = sRes; } @@ -8515,8 +8578,9 @@ continue; } dQueries[iDoc].m_sRes = tReq.GetString().Leak(); - iDoc = dQueries[iDoc].m_iNext; - dQueries[iDoc].m_iNext = -2; // mark as processed + int iNextDoc = dQueries[iDoc].m_iNext; + dQueries[iDoc].m_iNext = PROCESSED_ITEM; + iDoc = iNextDoc; } return bOk; @@ -8696,7 +8760,7 @@ bool bDone = ( *pDesc->m_pCurQuery==pDesc->m_iQueries ); pDesc->m_pLock->Unlock(); - if ( pQuery->m_iNext!=-2 ) + if ( pQuery->m_iNext!=PROCESSED_ITEM ) continue; pQuery->m_sRes = sphBuildExcerpt ( *pQuery, tCtx.m_pDict, tCtx.m_tTokenizer.Ptr(), @@ -8735,7 +8799,11 @@ g_tDistLock.Lock(); DistributedIndex_t * pDist = g_hDistIndexes ( sIndex ); bool bRemote = pDist!=NULL; + + // hack! load_files && load_files_scattered is the 'final' call. It will report the absent files as errors. + // simple load_files_scattered without load_files just omits the absent files (returns empty strings). bool bScattered = ( q.m_iLoadFiles & 2 )!=0; + bool bSkipAbsentFiles = !( q.m_iLoadFiles & 1 ); if ( bRemote ) { @@ -8793,7 +8861,7 @@ /////////////////// bool bOk = true; - int iAbsentHead = -1; + int iAbsentHead = EOF_ITEM; if ( g_iDistThreads<=1 || dQueries.GetLength()<2 ) { // boring single threaded loop @@ -8811,7 +8879,7 @@ // get file sizes ARRAY_FOREACH ( i, dQueries ) { - dQueries[i].m_iNext = -2; + dQueries[i].m_iNext = PROCESSED_ITEM; if ( dQueries[i].m_iLoadFiles ) { struct stat st; @@ -8823,7 +8891,7 @@ pServed->Unlock(); return false; } - dQueries[i].m_iNext = -1; + dQueries[i].m_iNext = EOF_ITEM; } dQueries[i].m_iSize = -st.st_size; // so that sort would put bigger ones first } else @@ -8834,20 +8902,22 @@ } // tough jobs first - dQueries.Sort ( bind ( &ExcerptQuery_t::m_iSize ) ); + if ( !bScattered ) + dQueries.Sort ( bind ( &ExcerptQuery_t::m_iSize ) ); ARRAY_FOREACH ( i, dQueries ) - if ( dQueries[i].m_iNext==-1 ) + if ( dQueries[i].m_iNext==EOF_ITEM ) { dQueries[i].m_iNext = iAbsentHead; iAbsentHead = i; - dQueries[i].m_sError.SetSprintf ( "failed to stat %s: %s", dQueries[i].m_sSource.cstr(), strerror(errno) ); + if ( !bSkipAbsentFiles ) + dQueries[i].m_sError.SetSprintf ( "failed to stat %s: %s", dQueries[i].m_sSource.cstr(), strerror(errno) ); } // check if all files are available locally. - if ( bScattered && iAbsentHead==-1 ) + if ( bScattered && iAbsentHead==EOF_ITEM ) { bRemote = false; dRemoteSnippets.m_dAgents.Reset(); @@ -8867,7 +8937,7 @@ if ( bScattered ) { - // on scattered case - the queries with m_iNext==-2 are here, and has to be scheduled to local agent + // on scattered case - the queries with m_iNext==PROCESSED_ITEM are here, and has to be scheduled to local agent // the rest has to be sent to remotes, all of them! for ( int i=0; iEXCERPT_MAX_ENTRIES ) + if ( iCount<=0 || iCount>EXCERPT_MAX_ENTRIES ) { tReq.SendErrorReply ( "invalid entries count %d", iCount ); return; @@ -9238,7 +9308,7 @@ int & iSuccesses, int & iUpdated, SearchFailuresLog_c & dFails, const ServedIndex_t * pServed ) { - if ( !pServed || !pServed->m_pIndex ) + if ( !pServed || !pServed->m_pIndex || !pServed->m_bEnabled ) { dFails.Submit ( sIndex, "index not available" ); return; @@ -9258,6 +9328,19 @@ } } +static const ServedIndex_t * UpdateGetLockedIndex ( const CSphString & sName, bool bMvaUpdate ) +{ + const ServedIndex_t * pLocked = g_pIndexes->GetRlockedEntry ( sName ); + if ( !pLocked ) + return NULL; + + if ( !( bMvaUpdate && pLocked->m_bRT ) ) + return pLocked; + + pLocked->Unlock(); + return g_pIndexes->GetWlockedEntry ( sName ); +} + void HandleCommandUpdate ( int iSock, int iVer, InputBuffer_c & tReq ) { @@ -9269,6 +9352,8 @@ CSphAttrUpdate tUpd; CSphVector dMva; + bool bMvaUpdate = false; + tUpd.m_dAttrs.Resize ( tReq.GetDword() ); // FIXME! check this ARRAY_FOREACH ( i, tUpd.m_dAttrs ) { @@ -9277,8 +9362,13 @@ tUpd.m_dAttrs[i].m_eAttrType = SPH_ATTR_INTEGER; if ( iVer>=0x102 ) + { if ( tReq.GetDword() ) + { tUpd.m_dAttrs[i].m_eAttrType = SPH_ATTR_UINT32SET; + bMvaUpdate = true; + } + } } int iNumUpdates = tReq.GetInt (); // FIXME! check this @@ -9331,7 +9421,7 @@ } // check index names - CSphVector dIndexNames; + CSphVector dIndexNames; ParseIndexList ( sIndexes, dIndexNames ); if ( !dIndexNames.GetLength() ) @@ -9343,16 +9433,15 @@ CSphVector dDistributed ( dIndexNames.GetLength() ); // lock safe storage for distributed indexes ARRAY_FOREACH ( i, dIndexNames ) { - if ( !g_pIndexes->Exists ( dIndexNames[i].m_sName ) ) + if ( !g_pIndexes->Exists ( dIndexNames[i] ) ) { // search amongst distributed and copy for further processing g_tDistLock.Lock(); - const DistributedIndex_t * pDistIndex = g_hDistIndexes ( dIndexNames[i].m_sName ); + const DistributedIndex_t * pDistIndex = g_hDistIndexes ( dIndexNames[i] ); if ( pDistIndex ) { dDistributed[i] = *pDistIndex; - dDistributed[i].m_bToDelete = true; // our presence flag } g_tDistLock.Unlock(); @@ -9361,7 +9450,7 @@ continue; else { - tReq.SendErrorReply ( "unknown index '%s' in update request", dIndexNames[i].m_sName.cstr() ); + tReq.SendErrorReply ( "unknown index '%s' in update request", dIndexNames[i].cstr() ); return; } } @@ -9374,21 +9463,21 @@ ARRAY_FOREACH ( iIdx, dIndexNames ) { - const char * sReqIndex = dIndexNames[iIdx].m_sName.cstr(); - const ServedIndex_t * pLocked = g_pIndexes->GetWlockedEntry ( sReqIndex ); + const char * sReqIndex = dIndexNames[iIdx].cstr(); + const ServedIndex_t * pLocked = UpdateGetLockedIndex ( sReqIndex, bMvaUpdate ); if ( pLocked ) { DoCommandUpdate ( sReqIndex, tUpd, iSuccesses, iUpdated, dFails, pLocked ); pLocked->Unlock(); } else { - assert ( dDistributed[iIdx].m_bToDelete ); + assert ( dDistributed[iIdx].m_dLocal.GetLength() || dDistributed[iIdx].m_dAgents.GetLength() ); CSphVector& dLocal = dDistributed[iIdx].m_dLocal; ARRAY_FOREACH ( i, dLocal ) { const char * sLocal = dLocal[i].cstr(); - const ServedIndex_t * pServed = g_pIndexes->GetWlockedEntry ( sLocal ); + const ServedIndex_t * pServed = UpdateGetLockedIndex ( sLocal, bMvaUpdate ); DoCommandUpdate ( sLocal, tUpd, iSuccesses, iUpdated, dFails, pServed ); if ( pServed ) pServed->Unlock(); @@ -9396,7 +9485,7 @@ } // update remote agents - if ( dDistributed[iIdx].m_bToDelete ) + if ( dDistributed[iIdx].m_dAgents.GetLength() ) { DistributedIndex_t & tDist = dDistributed[iIdx]; @@ -9568,7 +9657,7 @@ dStatus.Add().SetSprintf ( "%d", tMeta.m_iMatches ); dStatus.Add ( "total_found" ); - dStatus.Add().SetSprintf ( "%d", tMeta.m_iTotalMatches ); + dStatus.Add().SetSprintf ( INT64_FMT, tMeta.m_iTotalMatches ); dStatus.Add ( "time" ); dStatus.Add().SetSprintf ( "%d.%03d", tMeta.m_iQueryTime/1000, tMeta.m_iQueryTime%1000 ); @@ -9583,10 +9672,10 @@ dStatus.Add ( tMeta.m_hWordStats.IterateGetKey() ); dStatus.Add().SetSprintf ( "docs[%d]", iWord ); - dStatus.Add().SetSprintf ( "%d", tStat.m_iDocs ); + dStatus.Add().SetSprintf ( INT64_FMT, tStat.m_iDocs ); dStatus.Add().SetSprintf ( "hits[%d]", iWord ); - dStatus.Add().SetSprintf ( "%d", tStat.m_iHits ); + dStatus.Add().SetSprintf ( INT64_FMT, tStat.m_iHits ); iWord++; } @@ -9769,14 +9858,17 @@ || iLength<0 || iLength>g_iMaxPacketSize ) { // unknown command, default response header - tBuf.SendErrorReply ( "unknown command (code=%d)", iCommand ); + tBuf.SendErrorReply ( "invalid command (code=%d, len=%d)", iCommand, iLength ); // if request length is insane, low level comm is broken, so we bail out if ( iLength<0 || iLength>g_iMaxPacketSize ) - { sphWarning ( "ill-formed client request (length=%d out of bounds)", iLength ); - return; - } + + // if command is insane, low level comm is broken, so we bail out + if ( iCommand<0 || iCommand>=SEARCHD_COMMAND_TOTAL ) + sphWarning ( "ill-formed client request (command=%d, SEARCHD_COMMAND_TOTAL=%d)", iCommand, SEARCHD_COMMAND_TOTAL ); + + return; } // count commands @@ -9791,7 +9883,7 @@ assert ( iLength>=0 && iLength<=g_iMaxPacketSize ); if ( iLength && !tBuf.ReadFrom ( iLength ) ) { - sphWarning ( "failed to receive client request body (client=%s, exp=%d)", sClientIP, iLength ); + sphWarning ( "failed to receive client request body (client=%s, exp=%d, error='%s')", sClientIP, iLength, sphSockError() ); return; } @@ -10014,7 +10106,8 @@ tOut.SendBytes ( sVarLen, iLen ); // packed affected rows & insert_id if ( iWarns<0 ) iWarns = 0; if ( iWarns>65535 ) iWarns = 65535; - tOut.SendLSBDword ( iWarns ); // N warnings, 0 status + DWORD uWarnStatus = iWarns<<16; + tOut.SendLSBDword ( uWarnStatus ); // N warnings, 0 status if ( iMsgLen > 0 ) tOut.SendBytes ( sMessage, iMsgLen ); } @@ -10219,13 +10312,22 @@ sError.SetSprintf ( "raw %d, column %d: MVA value specified for a non-MVA column", 1+c, 1+iQuerySchemaIdx ); // 1 for human base break; } + if ( ( tCol.m_eAttrType==SPH_ATTR_UINT32SET || tCol.m_eAttrType==SPH_ATTR_UINT64SET ) && tVal.m_iType!=TOK_CONST_MVA ) + { + sError.SetSprintf ( "raw %d, column %d: non-MVA value specified for a MVA column", 1+c, 1+iQuerySchemaIdx ); // 1 for human base + break; + } if ( tCol.m_eAttrType==SPH_ATTR_UINT32SET || tCol.m_eAttrType==SPH_ATTR_UINT64SET ) { // collect data from scattered insvals // FIXME! maybe remove this mess, and just have a single m_dMvas pool in parser instead? - tVal.m_pVals->Uniq(); - int iLen = tVal.m_pVals->GetLength(); + int iLen = 0; + if ( tVal.m_pVals.Ptr() ) + { + tVal.m_pVals->Uniq(); + iLen = tVal.m_pVals->GetLength(); + } if ( tCol.m_eAttrType==SPH_ATTR_UINT64SET ) { dMvas.Add ( iLen*2 ); @@ -10817,7 +10919,7 @@ CSphString sError; // check index names - CSphVector dIndexNames; + CSphVector dIndexNames; ParseIndexList ( tStmt.m_sIndex, dIndexNames ); if ( !dIndexNames.GetLength() ) @@ -10830,16 +10932,15 @@ CSphVector dDistributed ( dIndexNames.GetLength() ); // lock safe storage for distributed indexes ARRAY_FOREACH ( i, dIndexNames ) { - if ( !g_pIndexes->Exists ( dIndexNames[i].m_sName ) ) + if ( !g_pIndexes->Exists ( dIndexNames[i] ) ) { // search amongst distributed and copy for further processing g_tDistLock.Lock(); - const DistributedIndex_t * pDistIndex = g_hDistIndexes ( dIndexNames[i].m_sName ); + const DistributedIndex_t * pDistIndex = g_hDistIndexes ( dIndexNames[i] ); if ( pDistIndex ) { dDistributed[i] = *pDistIndex; - dDistributed[i].m_bToDelete = true; // our presence flag } g_tDistLock.Unlock(); @@ -10848,7 +10949,7 @@ continue; else { - sError.SetSprintf ( "unknown index '%s' in update request", dIndexNames[i].m_sName.cstr() ); + sError.SetSprintf ( "unknown index '%s' in update request", dIndexNames[i].cstr() ); SendMysqlErrorPacket ( tOut, uPacketID, tStmt.m_sStmt, sError.cstr() ); return; } @@ -10861,28 +10962,35 @@ int iUpdated = 0; int iWarns = 0; + bool bMvaUpdate = false; + ARRAY_FOREACH_COND ( i, tStmt.m_tUpdate.m_dAttrs, !bMvaUpdate ) + { + bMvaUpdate = ( tStmt.m_tUpdate.m_dAttrs[i].m_eAttrType==SPH_ATTR_UINT32SET + || tStmt.m_tUpdate.m_dAttrs[i].m_eAttrType==SPH_ATTR_UINT64SET ); + } + ARRAY_FOREACH ( iIdx, dIndexNames ) { - const char * sReqIndex = dIndexNames[iIdx].m_sName.cstr(); - const ServedIndex_t * pLocked = g_pIndexes->GetWlockedEntry ( sReqIndex ); + const char * sReqIndex = dIndexNames[iIdx].cstr(); + const ServedIndex_t * pLocked = UpdateGetLockedIndex ( sReqIndex, bMvaUpdate ); if ( pLocked ) { DoExtendedUpdate ( sReqIndex, tStmt, iSuccesses, iUpdated, bCommit, dFails, pLocked ); } else { - assert ( dDistributed[iIdx].m_bToDelete ); + assert ( dDistributed[iIdx].m_dLocal.GetLength() || dDistributed[iIdx].m_dAgents.GetLength() ); CSphVector& dLocal = dDistributed[iIdx].m_dLocal; ARRAY_FOREACH ( i, dLocal ) { const char * sLocal = dLocal[i].cstr(); - const ServedIndex_t * pServed = g_pIndexes->GetWlockedEntry ( sLocal ); + const ServedIndex_t * pServed = UpdateGetLockedIndex ( sLocal, bMvaUpdate ); DoExtendedUpdate ( sLocal, tStmt, iSuccesses, iUpdated, bCommit, dFails, pServed ); } } // update remote agents - if ( dDistributed[iIdx].m_bToDelete ) + if ( dDistributed[iIdx].m_dAgents.GetLength() ) { DistributedIndex_t & tDist = dDistributed[iIdx]; @@ -11059,14 +11167,16 @@ // empty result sets just might carry the full uberschema // bummer! lets protect ourselves against that - int iAttrs = 1; + int iSchemaAttrsCount = 0; + int iAttrsCount = 1; if ( tRes.m_dMatches.GetLength() ) { - iAttrs = tRes.m_tSchema.GetAttrsCount(); + iSchemaAttrsCount = SendGetAttrCount ( tRes.m_tSchema ); + iAttrsCount = iSchemaAttrsCount; if ( g_bCompatResults ) - iAttrs += 2; + iAttrsCount += 2; } - if ( iAttrs>=251 ) + if ( iAttrsCount>=251 ) { // this will show up as success in query log, as the query itself was ok // but we need some kind of a notice anyway, to nail down issues based on logs only @@ -11077,7 +11187,7 @@ // result set header packet tOut.SendLSBDword ( ((uPacketID++)<<24) + 2 ); - tOut.SendByte ( BYTE(iAttrs) ); + tOut.SendByte ( BYTE(iAttrsCount) ); tOut.SendByte ( 0 ); // extra // field packets @@ -11094,7 +11204,7 @@ SendMysqlFieldPacket ( tOut, uPacketID++, "weight", MYSQL_COL_LONG ); } - for ( int i=0; im_eType==USERVAR_INT_SET ); - pVar->m_pVal->SwapData ( tStmt.m_dSetValues ); + assert ( pVar->m_pVal ); + pVar->m_pVal->Release(); + pVar->m_pVal = NULL; } else { + // create a shiny new variable Uservar_t tVar; - tVar.m_eType = USERVAR_INT_SET; - tVar.m_pVal = new CSphVector; - tVar.m_pVal->SwapData ( tStmt.m_dSetValues ); - tVar.m_pVal->Sort(); - g_hUservars.Add ( tVar, tStmt.m_sSetName ); // FIXME? free those on shutdown? + g_hUservars.Add ( tVar, tStmt.m_sSetName ); + pVar = g_hUservars ( tStmt.m_sSetName ); } + + // swap in the new value + assert ( pVar ); + assert ( !pVar->m_pVal ); + pVar->m_eType = USERVAR_INT_SET; + pVar->m_pVal = new UservarIntSet_c(); + pVar->m_pVal->SwapData ( tStmt.m_dSetValues ); g_tUservarsMutex.Unlock(); break; } @@ -11643,7 +11768,8 @@ if ( !pIndex || !pIndex->m_bEnabled || !pIndex->m_bRT ) { - pIndex->Unlock(); + if ( pIndex ) + pIndex->Unlock(); SendMysqlErrorPacket ( tOut, uPacketID, tStmt.m_sStmt, "FLUSH RTINDEX requires an existing RT index" ); return; } @@ -11957,7 +12083,8 @@ if ( sphSockSend ( iSock, g_sMysqlHandshake, g_iMysqlHandshake )!=g_iMysqlHandshake ) { - sphWarning ( "failed to send server version (client=%s)", sClientIP ); + int iErrno = sphSockGetErrno (); + sphWarning ( "failed to send server version (client=%s, error: %d '%s')", sClientIP, iErrno, sphSockError ( iErrno ) ); return; } @@ -12043,7 +12170,8 @@ } else if ( uMysqlCmd==MYSQL_COM_SET_OPTION ) { // bMulti = ( tIn.GetWord()==MYSQL_OPTION_MULTI_STATEMENTS_ON ); // that's how we could double check and validate multi query - SendMysqlOkPacket ( tOut, uPacketID ); + // server reporting success in response to COM_SET_OPTION and COM_DEBUG + SendMysqlEofPacket ( tOut, uPacketID, 0 ); continue; } else if ( uMysqlCmd!=MYSQL_COM_QUERY ) @@ -14527,6 +14655,25 @@ } +void FailClient ( int iSock, SearchdStatus_e eStatus, const char * sMessage ) +{ + assert ( eStatus==SEARCHD_RETRY || eStatus==SEARCHD_ERROR ); + + int iRespLen = 4 + strlen(sMessage); + + NetOutputBuffer_c tOut ( iSock ); + tOut.SendInt ( SPHINX_SEARCHD_PROTO ); + tOut.SendWord ( (WORD)eStatus ); + tOut.SendWord ( 0 ); // version doesn't matter + tOut.SendInt ( iRespLen ); + tOut.SendString ( sMessage ); + tOut.Flush (); + + // FIXME? without some wait, client fails to receive the response on windows + sphSockClose ( iSock ); +} + + Listener_t * DoAccept ( int * pClientSock, char * sClientName ) { int iMaxFD = 0; @@ -14620,8 +14767,22 @@ // accepted! #if !USE_WINDOWS + // FIXME!!! either get git of select() or allocate list of FD (with dup2 back instead close for thouse FD) + // with threads workers to prevent dup2 closes valid FD + if ( SPH_FDSET_OVERFLOW ( iClientSock ) ) - iClientSock = dup2 ( iClientSock, g_iClientFD ); + { + if ( ( g_eWorkers==MPM_FORK || g_eWorkers==MPM_PREFORK ) ) + { + iClientSock = dup2 ( iClientSock, g_iClientFD ); + } else + { + FailClient ( iClientSock, SEARCHD_RETRY, "server maxed out, retry in a second" ); + sphWarning ( "maxed out, dismissing client (socket=%d)", iClientSock ); + sphSockClose ( iClientSock ); + return NULL; + } + } #endif *pClientSock = iClientSock; @@ -14666,25 +14827,6 @@ } -void FailClient ( int iSock, SearchdStatus_e eStatus, const char * sMessage ) -{ - assert ( eStatus==SEARCHD_RETRY || eStatus==SEARCHD_ERROR ); - - int iRespLen = 4 + strlen(sMessage); - - NetOutputBuffer_c tOut ( iSock ); - tOut.SendInt ( SPHINX_SEARCHD_PROTO ); - tOut.SendWord ( (WORD)eStatus ); - tOut.SendWord ( 0 ); // version doesn't matter - tOut.SendInt ( iRespLen ); - tOut.SendString ( sMessage ); - tOut.Flush (); - - // FIXME? without some wait, client fails to receive the response on windows - sphSockClose ( iSock ); -} - - void HandlerThread ( void * pArg ) { // setup query guard for threaded mode @@ -14768,7 +14910,7 @@ if ( !pListener ) return; - if ( ( g_iMaxChildren && g_dChildren.GetLength()>=g_iMaxChildren ) + if ( ( g_iMaxChildren && ( g_dChildren.GetLength()>=g_iMaxChildren || g_dThd.GetLength()>=g_iMaxChildren ) ) || ( g_iRotateCount && !g_bSeamlessRotate ) ) { FailClient ( iClientSock, SEARCHD_RETRY, "server maxed out, retry in a second" ); @@ -15425,6 +15567,8 @@ if ( !g_bOptNoLock ) OpenDaemonLog ( hConf["searchd"]["searchd"] ); bVisualLoad = SetWatchDog ( iDevNull ); + close ( g_iLogFile ); // just the 'IT Happens' magic - switch off, then on. + OpenDaemonLog ( hConf["searchd"]["searchd"] ); } #endif @@ -15855,19 +15999,19 @@ } -extern bool ( *g_pUservarsHook )( const CSphString & sUservar, CSphVector & dVals ); +extern UservarIntSet_c * ( *g_pUservarsHook )( const CSphString & sUservar ); -bool UservarsHook ( const CSphString & sUservar, CSphVector & dVals ) +UservarIntSet_c * UservarsHook ( const CSphString & sUservar ) { - g_tUservarsMutex.Lock(); + CSphScopedLock tLock ( g_tUservarsMutex ); + Uservar_t * pVar = g_hUservars ( sUservar ); - if ( pVar ) - { - assert ( pVar->m_eType==USERVAR_INT_SET ); - dVals = *pVar->m_pVal; - } - g_tUservarsMutex.Unlock(); - return ( pVar!=NULL ); + if ( !pVar ) + return NULL; + + assert ( pVar->m_eType==USERVAR_INT_SET ); + pVar->m_pVal->AddRef(); + return pVar->m_pVal; } @@ -15919,5 +16063,5 @@ } // -// $Id: searchd.cpp 3017 2011-11-15 22:22:49Z shodan $ +// $Id: searchd.cpp 3127 2012-03-01 00:26:39Z shodan $ // diff -Nru sphinxsearch-0.9.9+2.0.2beta/src/spelldump.cpp sphinxsearch-2.0.4/src/spelldump.cpp --- sphinxsearch-0.9.9+2.0.2beta/src/spelldump.cpp 2011-09-23 16:31:11.000000000 +0000 +++ sphinxsearch-2.0.4/src/spelldump.cpp 2012-01-30 23:07:35.000000000 +0000 @@ -1,10 +1,10 @@ // -// $Id: spelldump.cpp 2968 2011-09-23 16:31:11Z shodan $ +// $Id: spelldump.cpp 3087 2012-01-30 23:07:35Z shodan $ // // -// Copyright (c) 2001-2011, Andrew Aksyonoff -// Copyright (c) 2008-2011, Sphinx Technologies Inc +// Copyright (c) 2001-2012, Andrew Aksyonoff +// Copyright (c) 2008-2012, Sphinx Technologies Inc // All rights reserved // // This program is free software; you can redistribute it and/or modify @@ -1191,5 +1191,5 @@ } // -// $Id: spelldump.cpp 2968 2011-09-23 16:31:11Z shodan $ +// $Id: spelldump.cpp 3087 2012-01-30 23:07:35Z shodan $ // diff -Nru sphinxsearch-0.9.9+2.0.2beta/src/sphinx.cpp sphinxsearch-2.0.4/src/sphinx.cpp --- sphinxsearch-0.9.9+2.0.2beta/src/sphinx.cpp 2011-11-14 14:29:46.000000000 +0000 +++ sphinxsearch-2.0.4/src/sphinx.cpp 2012-03-01 19:34:23.000000000 +0000 @@ -1,10 +1,10 @@ // -// $Id: sphinx.cpp 3012 2011-11-14 14:29:46Z tomat $ +// $Id: sphinx.cpp 3134 2012-03-01 19:34:23Z tomat $ // // -// Copyright (c) 2001-2011, Andrew Aksyonoff -// Copyright (c) 2008-2011, Sphinx Technologies Inc +// Copyright (c) 2001-2012, Andrew Aksyonoff +// Copyright (c) 2008-2012, Sphinx Technologies Inc // All rights reserved // // This program is free software; you can redistribute it and/or modify @@ -514,6 +514,7 @@ CSphAutofile::CSphAutofile () : m_iFD ( -1 ) , m_bTemporary ( false ) + , m_bWouldTemporary ( false ) , m_pProgress ( NULL ) , m_pStat ( NULL ) { @@ -523,6 +524,7 @@ CSphAutofile::CSphAutofile ( const CSphString & sName, int iMode, CSphString & sError, bool bTemp ) : m_iFD ( -1 ) , m_bTemporary ( false ) + , m_bWouldTemporary ( false ) , m_pProgress ( NULL ) , m_pStat ( NULL ) { @@ -547,7 +549,10 @@ if ( m_iFD<0 ) sError.SetSprintf ( "failed to open %s: %s", sName.cstr(), strerror(errno) ); else + { m_bTemporary = bTemp; // only if we managed to actually open it + m_bWouldTemporary = true; // if a shit happen - we could delete the file. + } return m_iFD; } @@ -565,6 +570,12 @@ m_iFD = -1; m_sFilename = ""; m_bTemporary = false; + m_bWouldTemporary = false; +} + +void CSphAutofile::SetTemporary() +{ + m_bTemporary = m_bWouldTemporary; } @@ -1302,7 +1313,7 @@ /// this is my actual VLN-compressed phrase index implementation -class CSphIndex_VLN : public ISphIndex_VLN +class CSphIndex_VLN : public CSphIndex { friend class DiskIndexQwordSetup_c; friend class CSphMerger; @@ -1357,8 +1368,6 @@ virtual const CSphSourceStats & GetStats () const { return m_tStats; } - virtual void SetDynamize ( const CSphVector & dDynamize ); - private: static const int MIN_WRITE_BUFFER = 262144; ///< min write buffer size @@ -1439,8 +1448,6 @@ bool m_bIsEmpty; ///< do we have actually indexed documents (m_iTotalDocuments is just fetched documents, not indexed!) - CSphVector m_dDynamize; ///< string attributes that my parent RT index wants dynamized - private: CSphString GetIndexFileName ( const char * sExt ) const; @@ -2338,6 +2345,7 @@ bool CheckEof (); int HexDigit ( int c ); int ParseCharsetCode (); + bool AddRange ( const CSphRemapRange & tRange, CSphVector & dRanges ); }; @@ -2429,6 +2437,20 @@ return iCode; } +bool CSphCharsetDefinitionParser::AddRange ( const CSphRemapRange & tRange, CSphVector & dRanges ) +{ + if ( tRange.m_iRemapStart>=0x20 ) + { + dRanges.Add ( tRange ); + return true; + } + + CSphString sError; + sError.SetSprintf ( "dest range (U+0x%x) below U+0x20, not allowed", tRange.m_iRemapStart ); + Error ( sError.cstr() ); + return false; +} + bool CSphCharsetDefinitionParser::Parse ( const char * sConfig, CSphVector & dRanges ) { @@ -2456,7 +2478,9 @@ if ( !*m_pCurrent || *m_pCurrent==',' ) { // stray char - dRanges.Add ( CSphRemapRange ( iStart, iStart, iStart ) ); + if ( !AddRange ( CSphRemapRange ( iStart, iStart, iStart ), dRanges ) ) + return false; + if ( IsEof () ) break; m_pCurrent++; @@ -2471,7 +2495,8 @@ int iDest = ParseCharsetCode (); if ( iDest<0 ) return false; - dRanges.Add ( CSphRemapRange ( iStart, iStart, iDest ) ); + if ( !AddRange ( CSphRemapRange ( iStart, iStart, iDest ), dRanges ) ) + return false; // it's either end of line now, or must be followed by comma if ( *m_pCurrent ) @@ -2502,7 +2527,9 @@ // stray range? if ( !*m_pCurrent || *m_pCurrent==',' ) { - dRanges.Add ( CSphRemapRange ( iStart, iEnd, iStart ) ); + if ( !AddRange ( CSphRemapRange ( iStart, iEnd, iStart ), dRanges ) ) + return false; + if ( IsEof () ) break; m_pCurrent++; @@ -2514,8 +2541,10 @@ { for ( int i=iStart; im_iEnd++; } return TOK_EQ; + + case '\'': + { + const char cEnd = *m_pCur; + for ( const char * s = m_pCur+1; *s; s++ ) + { + if ( *s==cEnd ) + { + m_pCur = s+1; + return TOK_CONST_STRING; + } + } + return -1; + } } // return char as a token @@ -5418,6 +5463,20 @@ } } +void CSphWriter::UnlinkFile() +{ + if ( m_bOwnFile ) + { + if ( m_iFD>=0 ) + ::close ( m_iFD ); + + m_iFD = -1; + ::unlink ( m_sName.cstr() ); + m_sName = ""; + } + SafeDeleteArray ( m_pBuffer ); +} + void CSphWriter::PutByte ( int data ) { @@ -5813,7 +5872,10 @@ { UpdateCache (); if ( !m_iBuffUsed ) + { + memset ( pData, 0, iSize ); return; // unexpected io failure + } } } @@ -5833,7 +5895,7 @@ UpdateCache (); if ( m_iBuffPos+iSize>m_iBuffUsed ) { - memset ( pOut, 0, iSize ); // unexpected io failure + memset ( pData, 0, iSize ); // unexpected io failure return; } } @@ -5955,7 +6017,7 @@ DWORD CSphReader::GetDword () { - DWORD uRes; + DWORD uRes = 0; GetBytes ( &uRes, sizeof(DWORD) ); return uRes; } @@ -5963,7 +6025,7 @@ SphOffset_t CSphReader::GetOffset () { - SphOffset_t uRes; + SphOffset_t uRes = 0; GetBytes ( &uRes, sizeof(SphOffset_t) ); return uRes; } @@ -6448,32 +6510,6 @@ } ////////////////////////////////////////////////////////////////////////// -// PROCESS-SHARED MUTEX -////////////////////////////////////////////////////////////////////////// - -/// scoped mutex lock -template < typename T > -class CSphScopedLock : ISphNoncopyable -{ -public: - /// lock on creation - explicit CSphScopedLock ( T & tMutex ) - : m_tMutexRef ( tMutex ) - { - m_tMutexRef.Lock(); - } - - /// unlock on going out of scope - ~CSphScopedLock () - { - m_tMutexRef.Unlock (); - } - -protected: - T & m_tMutexRef; -}; - -////////////////////////////////////////////////////////////////////////// // GLOBAL MVA STORAGE ARENA ////////////////////////////////////////////////////////////////////////// @@ -7127,7 +7163,7 @@ , m_bKeepFilesOpen ( false ) , m_bPreloadWordlist ( true ) , m_bStripperInited ( true ) - , m_bEnableStar ( false ) + , m_bEnableStar ( false ) , m_bId32to64 ( false ) , m_pTokenizer ( NULL ) , m_pDict ( NULL ) @@ -7209,7 +7245,7 @@ CSphIndex_VLN::CSphIndex_VLN ( const char* sIndexName, const char * sFilename ) - : ISphIndex_VLN ( sIndexName, sFilename ) + : CSphIndex ( sIndexName, sFilename ) , m_iLockFD ( -1 ) { m_sFilename = sFilename; @@ -7291,7 +7327,7 @@ return 0; if ( g_pBinlog ) - g_pBinlog->BinlogUpdateAttributes ( m_sIndexName.cstr(), ++m_iTID, tUpd ); + g_pBinlog->BinlogUpdateAttributes ( &m_iTID, m_sIndexName.cstr(), tUpd ); // remap update schema to index schema CSphVector dLocators; @@ -7740,7 +7776,7 @@ for ( DWORD uIndexEntry=0; uIndexEntryUnlinkFile(); + + ARRAY_FOREACH ( i, m_dAutofiles ) + m_dAutofiles[i]->SetTemporary(); + } + } + inline void AddWriter ( CSphWriter* pWr ) + { + if ( pWr ) + m_dWriters.Add ( pWr ); + } + inline void AddAutofile ( CSphAutofile* pAf ) + { + if ( pAf ) + m_dAutofiles.Add ( pAf ); + } + inline void AllIsDone() + { + m_bShitHappened = false; + } +private: + bool m_bShitHappened; + CSphVector m_dWriters; + CSphVector m_dAutofiles; +}; + int CSphIndex_VLN::Build ( const CSphVector & dSources, int iMemoryLimit, int iWriteBuffer ) { @@ -9780,6 +9852,16 @@ return 0; tStrWriter.PutByte ( 0 ); // dummy byte, to reserve magic zero offset + DeleteOnFail dFileWatchdog; + + if ( m_bInplaceSettings ) + { + dFileWatchdog.AddAutofile ( &fdHits ); + dFileWatchdog.AddAutofile ( &fdDocinfos ); + } + + dFileWatchdog.AddWriter ( &tStrWriter ); + if ( fdLock.GetFD()<0 || fdHits.GetFD()<0 || fdDocinfos.GetFD()<0 || fdTmpFieldMVAs.GetFD ()<0 ) return 0; @@ -10392,7 +10474,7 @@ // initialize MVA reader CSphAutoreader rdMva; if ( !rdMva.Open ( GetIndexFileName("spm"), m_sLastError ) ) - return false; + return 0; SphDocID_t uMvaID = rdMva.GetDocid(); @@ -10913,6 +10995,7 @@ PROFILER_DONE (); PROFILE_SHOW (); + dFileWatchdog.AllIsDone(); return 1; } // NOLINT function length @@ -12112,7 +12195,7 @@ if ( m_pDocinfoHash.GetLength() ) { SphDocID_t uFirst = DOCINFO2ID ( &m_pDocinfo[0] ); - SphDocID_t uLast = DOCINFO2ID ( &m_pDocinfo[(m_uDocinfo-1)*iStride] ); + SphDocID_t uLast = DOCINFO2ID ( &m_pDocinfo[( int64_t ( m_uDocinfo-1 ) )*iStride] ); if ( uDocIDuLast ) return NULL; @@ -12125,13 +12208,13 @@ } const DWORD * pFound = NULL; - if ( uDocID==DOCINFO2ID ( &m_pDocinfo [ iStart*iStride ] ) ) + if ( uDocID==DOCINFO2ID ( &m_pDocinfo [ (int64_t(iStart))*iStride ] ) ) { - pFound = &m_pDocinfo [ iStart*iStride ]; + pFound = &m_pDocinfo [ (int64_t(iStart))*iStride ]; - } else if ( uDocID==DOCINFO2ID ( &m_pDocinfo [ iEnd*iStride ] ) ) + } else if ( uDocID==DOCINFO2ID ( &m_pDocinfo [ (int64_t(iEnd))*iStride ] ) ) { - pFound = &m_pDocinfo [ iEnd*iStride ]; + pFound = &m_pDocinfo [ (int64_t(iEnd))*iStride ]; } else { @@ -12139,19 +12222,19 @@ { // check if nothing found if ( - uDocID < DOCINFO2ID ( &m_pDocinfo [ iStart*iStride ] ) || - uDocID > DOCINFO2ID ( &m_pDocinfo [ iEnd*iStride ] ) ) + uDocID < DOCINFO2ID ( &m_pDocinfo [ (int64_t(iStart))*iStride ] ) || + uDocID > DOCINFO2ID ( &m_pDocinfo [ (int64_t(iEnd))*iStride ] ) ) break; - assert ( uDocID > DOCINFO2ID ( &m_pDocinfo [ iStart*iStride ] ) ); - assert ( uDocID < DOCINFO2ID ( &m_pDocinfo [ iEnd*iStride ] ) ); + assert ( uDocID > DOCINFO2ID ( &m_pDocinfo [ (int64_t(iStart))*iStride ] ) ); + assert ( uDocID < DOCINFO2ID ( &m_pDocinfo [ (int64_t(iEnd))*iStride ] ) ); int iMid = iStart + (iEnd-iStart)/2; - if ( uDocID==DOCINFO2ID ( &m_pDocinfo [ iMid*iStride ] ) ) + if ( uDocID==DOCINFO2ID ( &m_pDocinfo [ (int64_t(iMid))*iStride ] ) ) { - pFound = &m_pDocinfo [ iMid*iStride ]; + pFound = &m_pDocinfo [ (int64_t(iMid))*iStride ]; break; } - if ( uDocIDm_uValue : sphGetRowAttr ( tMatch.m_pStatic, pCtx->m_dOverrideIn[i] ) ); } - - // dynamize if necessary - ARRAY_FOREACH ( j, m_dDynamize ) - tMatch.SetAttr ( m_dDynamize[j].m_tTo, tMatch.GetAttr ( m_dDynamize[j].m_tFrom ) ); -} - - -void CSphIndex_VLN::SetDynamize ( const CSphVector & dDynamize ) -{ - m_dDynamize = dDynamize; } @@ -12392,71 +12465,94 @@ if ( !tCtx.SetupOverrides ( pQuery, pResult, m_tSchema ) ) return false; - // do scan + // prepare to work them rows bool bRandomize = ppSorters[0]->m_bRandomize; - int iCutoff = pQuery->m_iCutoff; - if ( iCutoff<=0 ) - iCutoff = -1; CSphMatch tMatch; tMatch.Reset ( pResult->m_tSchema.GetDynamicSize() ); tMatch.m_iWeight = pQuery->GetIndexWeight ( m_sIndexName.cstr() ); + tMatch.m_iTag = tCtx.m_dCalcFinal.GetLength() ? -1 : iTag; - DWORD uStride = DOCINFO_IDSIZE + m_tSchema.GetRowSize(); - DWORD uStart = pQuery->m_bReverseScan ? ( m_uDocinfoIndex-1 ) : 0; - int iStep = pQuery->m_bReverseScan ? -1 : 1; - int iMyTag = tCtx.m_dCalcFinal.GetLength() ? -1 : iTag; - for ( DWORD uIndexEntry=uStart; uIndexEntrym_dFilters.GetLength()==1 + && pQuery->m_dFilters[0].m_eType==SPH_FILTER_VALUES + && pQuery->m_dFilters[0].m_bExclude==false + && pQuery->m_dFilters[0].m_sAttrName=="@id" + && !pExtraFilters ) + { + // run id lookups + for ( int i=0; im_dFilters[0].GetNumValues(); i++ ) + { + SphDocID_t uDocid = (SphDocID_t) pQuery->m_dFilters[0].GetValue(i); + const DWORD * pRow = FindDocinfo ( uDocid ); + if ( !pRow ) + continue; - const DWORD * pMin = &m_pDocinfoIndex[2*uIndexEntry*uStride]; - const DWORD * pMax = pMin + uStride; + assert ( uDocid==DOCINFO2ID(pRow) ); + tMatch.m_iDocID = uDocid; + CopyDocinfo ( &tCtx, tMatch, pRow ); - // check applicable filters - if ( tCtx.m_pFilter && !tCtx.m_pFilter->EvalBlock ( pMin, pMax ) ) - continue; + // submit match to sorters + tCtx.CalcSort ( tMatch ); + if ( bRandomize ) + tMatch.m_iWeight = ( sphRand() & 0xffff ); - /////////////////////// - // row-level filtering - /////////////////////// + for ( int iSorter=0; iSorterPush ( tMatch ); + } + } else + { + // do scan + DWORD uStride = DOCINFO_IDSIZE + m_tSchema.GetRowSize(); + DWORD uStart = pQuery->m_bReverseScan ? ( m_uDocinfoIndex-1 ) : 0; + int iStep = pQuery->m_bReverseScan ? -1 : 1; - const DWORD * pBlockStart = &m_pDocinfo [ uStride*uIndexEntry*DOCINFO_INDEX_FREQ ]; - const DWORD * pBlockEnd = &m_pDocinfo [ uStride*( Min ( (uIndexEntry+1)*DOCINFO_INDEX_FREQ, m_uDocinfo ) - 1 ) ]; + int iCutoff = pQuery->m_iCutoff; + if ( iCutoff<=0 ) + iCutoff = -1; - for ( const DWORD * pDocinfo=pBlockStart; pDocinfo<=pBlockEnd; pDocinfo+=uStride ) + for ( DWORD uIndexEntry=uStart; uIndexEntryEval ( tMatch ) ) + // check applicable filters + if ( tCtx.m_pFilter && !tCtx.m_pFilter->EvalBlock ( pMin, pMax ) ) continue; - // submit match to sorters - tCtx.CalcSort ( tMatch ); - if ( bRandomize ) - tMatch.m_iWeight = ( sphRand() & 0xffff ); - - tMatch.m_iTag = iMyTag; + // row-level filtering + const DWORD * pBlockStart = &m_pDocinfo [ ( int64_t ( uIndexEntry ) )*uStride*DOCINFO_INDEX_FREQ ]; + const DWORD * pBlockEnd = &m_pDocinfo [ ( int64_t ( Min ( ( uIndexEntry+1 )*DOCINFO_INDEX_FREQ, m_uDocinfo ) - 1 ) )*uStride ]; + + for ( const DWORD * pDocinfo=pBlockStart; pDocinfo<=pBlockEnd; pDocinfo+=uStride ) + { + tMatch.m_iDocID = DOCINFO2ID ( pDocinfo ); + CopyDocinfo ( &tCtx, tMatch, pDocinfo ); + + // early filter only (no late filters in full-scan because of no @weight) + tCtx.CalcFilter ( tMatch ); + if ( tCtx.m_pFilter && !tCtx.m_pFilter->Eval ( tMatch ) ) + continue; - bool bNewMatch = false; - for ( int iSorter=0; iSorterPush ( tMatch ); + // submit match to sorters + tCtx.CalcSort ( tMatch ); + if ( bRandomize ) + tMatch.m_iWeight = ( sphRand() & 0xffff ); + + bool bNewMatch = false; + for ( int iSorter=0; iSorterPush ( tMatch ); - // handle cutoff - if ( bNewMatch ) - if ( --iCutoff==0 ) + // handle cutoff + if ( bNewMatch && --iCutoff==0 ) { uIndexEntry = m_uDocinfoIndex; // outer break break; } + } } - if ( iCutoff==0 ) - break; } // do final expression calculations @@ -13509,10 +13605,6 @@ if ( m_pProgress ) m_pProgress ( &m_tProgress, true ); - sphLogDebug ( "Prereading .mvp" ); - if ( !LoadPersistentMVA ( m_sLastError ) ) - return false; - ////////////////////// // precalc everything ////////////////////// @@ -13541,7 +13633,7 @@ { int iStride = DOCINFO_IDSIZE + m_tSchema.GetRowSize(); SphDocID_t uFirst = DOCINFO2ID ( &m_pDocinfo[0] ); - SphDocID_t uRange = DOCINFO2ID ( &m_pDocinfo[(m_uDocinfo-1)*iStride] ) - uFirst; + SphDocID_t uRange = DOCINFO2ID ( &m_pDocinfo[( int64_t ( m_uDocinfo-1 ) )*iStride] ) - uFirst; DWORD iShift = 0; while ( uRange>=( 1 << DOCINFO_HASH_BITS ) ) { @@ -13556,10 +13648,10 @@ for ( DWORD i=1; iuFirst - && DOCINFO2ID ( &m_pDocinfo[(i-1)*iStride] ) < DOCINFO2ID ( &m_pDocinfo[i*iStride] ) + assert ( DOCINFO2ID ( &m_pDocinfo[( int64_t ( i ) )*iStride] )>uFirst + && DOCINFO2ID ( &m_pDocinfo[( int64_t ( i-1 ) )*iStride] ) < DOCINFO2ID ( &m_pDocinfo[( int64_t ( i ) )*iStride] ) && "descending document ID found" ); - DWORD uHash = (DWORD)( ( DOCINFO2ID ( &m_pDocinfo[i*iStride] ) - uFirst ) >> iShift ); + DWORD uHash = (DWORD)( ( DOCINFO2ID ( &m_pDocinfo[( int64_t ( i ) )*iStride] ) - uFirst ) >> iShift ); if ( uHash==uLastHash ) continue; @@ -13571,6 +13663,11 @@ pHash [ ++uLastHash ] = m_uDocinfo; } + // persist MVA needs valid DocinfoHash + sphLogDebug ( "Prereading .mvp" ); + if ( !LoadPersistentMVA ( m_sLastError ) ) + return false; + // build "indexes" for full-scan if ( m_uVersion < 20 && !PrecomputeMinMax() ) return false; @@ -14104,7 +14201,6 @@ return iMaxChild+iHeight; } -#define SPH_DAEMON_STACK_HEIGHT 30*1024 #define SPH_EXTNODE_STACK_SIZE 120 bool sphCheckQueryHeight ( const XQNode_t * pRoot, CSphString & sError ) @@ -14113,11 +14209,11 @@ if ( pRoot ) iHeight = sphQueryHeightCalc ( pRoot ); - int iQueryStack = iHeight*SPH_EXTNODE_STACK_SIZE+SPH_DAEMON_STACK_HEIGHT; + int64_t iQueryStack = sphGetStackUsed() + iHeight*SPH_EXTNODE_STACK_SIZE; bool bValid = ( sphMyStackSize()>=iQueryStack ); if ( !bValid ) sError.SetSprintf ( "query too complex, not enough stack (thread_stack_size=%dK or higher required)", - ( ( iQueryStack+1024-( iQueryStack%1024 ) ) / 1024 ) ); + (int)( ( iQueryStack + 1024 - ( iQueryStack%1024 ) ) / 1024 ) ); return bValid; } @@ -14126,10 +14222,7 @@ { assert ( pNode ); - XQNode_t * pRes = new XQNode_t; - pRes->m_bFieldSpec = pNode->m_bFieldSpec; - pRes->m_dFieldMask = pNode->m_dFieldMask; - pRes->m_iFieldMaxPos = pNode->m_iFieldMaxPos; + XQNode_t * pRes = new XQNode_t ( pNode->m_dSpec ); pRes->m_dWords = pNode->m_dWords; return pRes; } @@ -14137,7 +14230,9 @@ static XQNode_t * ExpandKeyword ( XQNode_t * pNode, const CSphIndexSettings & tSettings ) { - XQNode_t * pExpand = new XQNode_t; + assert ( pNode ); + + XQNode_t * pExpand = new XQNode_t ( pNode->m_dSpec ); pExpand->SetOp ( SPH_QUERY_OR, pNode ); if ( tSettings.m_iMinInfixLen>0 ) @@ -14182,7 +14277,7 @@ assert ( pNode->m_dWords.GetLength()>1 ); ARRAY_FOREACH ( i, pNode->m_dWords ) { - XQNode_t * pWord = new XQNode_t; + XQNode_t * pWord = new XQNode_t ( pNode->m_dSpec ); pWord->m_dWords.Add ( pNode->m_dWords[i] ); pNode->m_dChildren.Add ( ExpandKeyword ( pWord, tSettings ) ); pNode->m_dChildren.Last()->m_iAtomPos = pNode->m_dWords[i].m_iAtomPos; @@ -14223,7 +14318,7 @@ CSphVector dArgs; ARRAY_FOREACH ( i, pNode->m_dWords ) { - XQNode_t * pAnd = new XQNode_t(); + XQNode_t * pAnd = new XQNode_t ( pNode->m_dSpec ); pAnd->m_dWords.Add ( pNode->m_dWords[i] ); dArgs.Add ( pAnd ); } @@ -14327,7 +14422,7 @@ assert ( pNode->m_dWords.GetLength()>1 ); ARRAY_FOREACH ( i, pNode->m_dWords ) { - XQNode_t * pWord = new XQNode_t; + XQNode_t * pWord = new XQNode_t ( pNode->m_dSpec ); pWord->m_dWords.Add ( pNode->m_dWords[i] ); pNode->m_dChildren.Add ( sphExpandXQNode ( pWord, tCtx ) ); pNode->m_dChildren.Last()->m_iAtomPos = pNode->m_dWords[i].m_iAtomPos; @@ -18207,7 +18302,7 @@ bool CSphHTMLStripper::SetIndexedAttrs ( const char * sConfig, CSphString & sError ) { - if ( !sConfig ) + if ( !sConfig || !*sConfig ) return true; char sTag[256], sAttr[256]; @@ -18300,7 +18395,7 @@ bool CSphHTMLStripper::SetRemovedElements ( const char * sConfig, CSphString & ) { - if ( !sConfig ) + if ( !sConfig || !*sConfig ) return true; const char * p = sConfig; @@ -18380,7 +18475,7 @@ { // yet another mini parser! // index_zones = {tagname | prefix*} [, ...] - if ( !sZones ) + if ( !sZones || !*sZones ) return true; const char * s = sZones; @@ -19424,10 +19519,6 @@ bool CSphSource::SetStripHTML ( const char * sExtractAttrs, const char * sRemoveElements, bool bDetectParagraphs, const char * sZones, CSphString & sError ) { - m_bStripHTML = ( sExtractAttrs!=NULL ); - if ( !m_bStripHTML ) - return false; - if ( !m_pStripper->SetIndexedAttrs ( sExtractAttrs, sError ) ) return false; @@ -19440,6 +19531,7 @@ if ( !m_pStripper->SetZones ( sZones, sError ) ) return false; + m_bStripHTML = true; return true; } @@ -19751,11 +19843,17 @@ { BYTE * pZone = (BYTE*) m_pTokenizer->GetBufferPtr(); BYTE * pEnd = pZone; - while ( *pEnd!=MAGIC_CODE_ZONE ) + while ( *pEnd && *pEnd!=MAGIC_CODE_ZONE ) + { pEnd++; - *pEnd = '\0'; - m_tHits.AddHit ( uDocid, m_pDict->GetWordID ( pZone-1 ), m_tState.m_iHitPos ); - m_pTokenizer->SetBufferPtr ( (const char*) pEnd+1 ); + } + + if ( *pEnd && *pEnd==MAGIC_CODE_ZONE ) + { + *pEnd = '\0'; + m_tHits.AddHit ( uDocid, m_pDict->GetWordID ( pZone-1 ), m_tState.m_iHitPos ); + m_pTokenizer->SetBufferPtr ( (const char*) pEnd+1 ); + } } m_tState.m_iBuildLastStep = 1; @@ -19765,6 +19863,17 @@ } +// track blended start and reset on not blended token +static int TrackBlendedStart ( const ISphTokenizer * pTokenizer, int iBlendedHitsStart, int iHitsCount ) +{ + iBlendedHitsStart = ( ( pTokenizer->TokenIsBlended() || pTokenizer->TokenIsBlendedPart() ) ? iBlendedHitsStart : -1 ); + if ( pTokenizer->TokenIsBlended() ) + iBlendedHitsStart = iHitsCount; + + return iBlendedHitsStart; +} + + #define BUILD_SUBSTRING_HITS_COUNT 4 void CSphSource_Document::BuildSubstringHits ( SphDocID_t uDocid, bool bPayload, ESphWordpart eWordpart, bool bSkipEndMarker ) @@ -19785,10 +19894,15 @@ else iIterHitCount += ( ( m_iMinInfixLen+SPH_MAX_WORD_LEN ) * ( SPH_MAX_WORD_LEN-m_iMinInfixLen ) / 2 ); + // FIELDEND_MASK at blended token stream should be set for HEAD token too + int iBlendedHitsStart = -1; + // index all infixes while ( ( m_iMaxHits==0 || m_tHits.m_dData.GetLength()+iIterHitCountGetToken() )!=NULL ) { + iBlendedHitsStart = TrackBlendedStart ( m_pTokenizer, iBlendedHitsStart, m_tHits.Length() ); + if ( !bPayload ) { HITMAN::AddPos ( &m_tState.m_iHitPos, m_tState.m_iBuildLastStep + m_pTokenizer->GetOvershortCount()*m_iOvershortStep ); @@ -19889,6 +20003,18 @@ for ( ; pHit>=m_tHits.First() && pHit->m_iWordPos==uRefPos; pHit-- ) HITMAN::SetEndMarker ( &pHit->m_iWordPos ); + + // mark blended HEAD as trailing too + if ( iBlendedHitsStart>=0 ) + { + assert ( iBlendedHitsStart>=0 && iBlendedHitsStart ( m_tHits.First()+iBlendedHitsStart ); + uRefPos = pHit->m_iWordPos; + + const CSphWordHit * pEnd = m_tHits.First()+m_tHits.Length(); + for ( ; pHitm_iWordPos==uRefPos; pHit++ ) + HITMAN::SetEndMarker ( &pHit->m_iWordPos ); + } } } @@ -19906,10 +20032,15 @@ BYTE * sWord = NULL; BYTE sBuf [ 16+3*SPH_MAX_WORD_LEN ]; + // FIELDEND_MASK at blended token stream should be set for HEAD token too + int iBlendedHitsStart = -1; + // index words only while ( ( m_iMaxHits==0 || m_tHits.m_dData.GetLength()+BUILD_REGULAR_HITS_COUNTGetToken() )!=NULL ) { + iBlendedHitsStart = TrackBlendedStart ( m_pTokenizer, iBlendedHitsStart, m_tHits.Length() ); + if ( !bPayload ) { HITMAN::AddPos ( &m_tState.m_iHitPos, m_tState.m_iBuildLastStep + m_pTokenizer->GetOvershortCount()*m_iOvershortStep ); @@ -19954,6 +20085,14 @@ { CSphWordHit * pHit = const_cast < CSphWordHit * > ( m_tHits.Last() ); HITMAN::SetEndMarker ( &pHit->m_iWordPos ); + + // mark blended HEAD as trailing too + if ( iBlendedHitsStart>=0 ) + { + assert ( iBlendedHitsStart>=0 && iBlendedHitsStart ( m_tHits.First() + iBlendedHitsStart ); + HITMAN::SetEndMarker ( &pBlendedHit->m_iWordPos ); + } } } @@ -20914,17 +21053,32 @@ int iIndex = m_tSchema.m_dFields[iFieldIndex].m_iIndex; const char * pData = SqlColumn(iIndex); - if ( pData==NULL || pData[0]==0 ) - return pData; + if ( pData==NULL ) + return NULL; + + int iPackedLen = SqlColumnLength(iIndex); + if ( iPackedLen<=0 ) + return NULL; + CSphVector & tBuffer = m_dUnpackBuffers[iFieldIndex]; switch ( eFormat ) { case SPH_UNPACK_MYSQL_COMPRESS: { + if ( iPackedLen<=4 ) + { + if ( !m_bUnpackFailed ) + { + m_bUnpackFailed = true; + sphWarn ( "failed to unpack '%s', invalid column size (size=%d), docid="DOCID_FMT, SqlFieldName(iIndex), iPackedLen, m_tDocInfo.m_iDocID ); + } + return NULL; + } + unsigned long uSize = 0; for ( int i=0; i<4; i++ ) - uSize += (unsigned long)pData[i] << ( 8*i ); + uSize += ((unsigned long)((BYTE)pData[i])) << ( 8*i ); uSize &= 0x3FFFFFFF; if ( uSize > m_tParams.m_uUnpackMemoryLimit ) @@ -20932,14 +21086,15 @@ if ( !m_bUnpackOverflow ) { m_bUnpackOverflow = true; - sphWarn ( "failed to unpack '%s', column size limit exceeded (size=%d)", SqlFieldName(iIndex), (int)uSize ); + sphWarn ( "failed to unpack '%s', column size limit exceeded (size=%d), docid="DOCID_FMT, SqlFieldName(iIndex), (int)uSize, m_tDocInfo.m_iDocID ); } return NULL; } int iResult; tBuffer.Resize ( uSize + 1 ); - iResult = uncompress ( (Bytef *)&tBuffer[0], &uSize, (Bytef *)pData + 4, SqlColumnLength(iIndex) ); + unsigned long uLen = iPackedLen-4; + iResult = uncompress ( (Bytef *)tBuffer.Begin(), &uSize, (Bytef *)pData + 4, uLen ); if ( iResult==Z_OK ) { tBuffer[uSize] = 0; @@ -20959,7 +21114,7 @@ tStream.zalloc = Z_NULL; tStream.zfree = Z_NULL; tStream.opaque = Z_NULL; - tStream.avail_in = SqlColumnLength(iIndex); + tStream.avail_in = iPackedLen; tStream.next_in = (Bytef *)SqlColumn(iIndex); iResult = inflateInit ( &tStream ); @@ -23347,6 +23502,9 @@ } +#define MS_SQL_BUFFER_GAP 16 + + bool CSphSource_ODBC::SqlQuery ( const char * sQuery ) { if ( SQLAllocHandle ( SQL_HANDLE_STMT, m_hDBC, &m_hStmt )==SQL_ERROR ) @@ -23402,8 +23560,8 @@ else if ( uColSize ) iBuffLen = Min ( uColSize+1, (SQLULEN) MAX_COL_SIZE ); // got data from driver - tCol.m_dContents.Resize ( iBuffLen ); - tCol.m_dRaw.Resize ( iBuffLen ); + tCol.m_dContents.Resize ( iBuffLen + MS_SQL_BUFFER_GAP ); + tCol.m_dRaw.Resize ( iBuffLen + MS_SQL_BUFFER_GAP ); tCol.m_iInd = 0; tCol.m_iBufferSize = iBuffLen; tCol.m_bUnicode = m_bUnicode && ( iDataType==SQL_WCHAR || iDataType==SQL_WVARCHAR || iDataType==SQL_WLONGVARCHAR ); @@ -23412,7 +23570,7 @@ if ( SQLBindCol ( m_hStmt, (SQLUSMALLINT)(i+1), tCol.m_bUnicode ? SQL_UNICODE : SQL_C_CHAR, - tCol.m_bUnicode ? &(tCol.m_dRaw[0]) : &(tCol.m_dContents[0]), + tCol.m_bUnicode ? tCol.m_dRaw.Begin() : tCol.m_dContents.Begin(), iBuffLen, &(tCol.m_iInd) )==SQL_ERROR ) return false; } @@ -23528,8 +23686,7 @@ if ( tCol.m_bUnicode ) { // WideCharToMultiByte should get NULL terminated string - for ( int i=0; iGetLength() ) { Token_t & tToken = (*m_dTokens)[m_iToken++]; - if ( tToken.m_eType!=ExcerptGen_c::TOK_WORD ) + if ( !( tToken.m_eType==ExcerptGen_c::TOK_WORD || tToken.m_eType==ExcerptGen_c::TOK_SPZ ) ) continue; if ( tToken.m_iWordID==m_iWordID || tToken.m_iBlendID==m_iWordID ) @@ -739,9 +739,17 @@ if ( iSPZ && *sWord>=iSPZ && ( m_dTokens.GetLength()==0 || m_dTokens.Last().m_eType!=TOK_SPZ ) ) { + BYTE * sWordSPZ = sWord; + if ( (*sWord)==MAGIC_CODE_SENTENCE ) + sWordSPZ = (BYTE *)MAGIC_WORD_SENTENCE; + else if ( (*sWord)==MAGIC_CODE_PARAGRAPH ) + sWordSPZ = (BYTE *)MAGIC_WORD_PARAGRAPH; + Token_t & tLast = m_dTokens.Add(); tLast.Reset(); tLast.m_eType = TOK_SPZ; + tLast.m_iWordID = pDict->GetWordID ( sWordSPZ ); + tLast.m_uPosition = uPosition; if ( *sWord==MAGIC_CODE_SENTENCE ) { @@ -1026,7 +1034,7 @@ { if ( !( ExtractPassages ( tQuery ) && HighlightBestPassages ( tQuery ) ) ) { - if ( tQuery.m_bAllowEmpty ) + if ( !tQuery.m_bAllowEmpty ) HighlightStart ( tQuery ); } } @@ -1894,6 +1902,7 @@ int FindWord ( SphWordID_t iWordID, const BYTE * sWord, int iWordLen ) const; void AddHits ( SphWordID_t iWordID, const BYTE * sWord, int iWordLen, DWORD uPosition ); bool Parse ( const char * sQuery, ISphTokenizer * pTokenizer, CSphDict * pDict, const CSphSchema * pSchema, CSphString & sError, int iStopwordStep ); + int GetSPZ () const; protected: bool MatchStar ( const ExcerptGen_c::Keyword_t & tTok, const BYTE * sWord, int iWordLen ) const; @@ -2039,6 +2048,24 @@ } +int SnippetsDocIndex_c::GetSPZ () const +{ + // with sentence in query we should consider SENTECE, PARAGRAPH, ZONE + // with paragraph in query we should consider PARAGRAPH, ZONE + // with zone in query we should consider ZONE + if ( m_bSentence ) + return MAGIC_CODE_SENTENCE; + + if ( m_bParagraph ) + return MAGIC_CODE_PARAGRAPH; + + if ( m_tQuery.m_dZones.GetLength() ) + return MAGIC_CODE_ZONE; + + return 0; +} + + void SnippetsDocIndex_c::AddWord ( SphWordID_t iWordID ) { assert ( iWordID ); @@ -2776,6 +2803,10 @@ if ( !tContainer.Parse ( tFixedSettings.m_sWords.cstr(), pQueryTokenizer, pDict, pSchema, sError, tIndexSettings.m_iStopwordStep ) ) return NULL; + // fast-path collects no passages but that flag says what SPZ should we collect + if ( tFixedSettings.m_bHighlightQuery && !tFixedSettings.m_iPassageBoundary ) + tFixedSettings.m_iPassageBoundary = tContainer.GetSPZ(); + // do highlighting if ( !tFixedSettings.m_bHighlightQuery ) { @@ -2784,7 +2815,7 @@ HighlightPlain_c tHighlighter ( tContainer, pTokenizer, pDict, tFixedSettings, tIndexSettings, sDoc, iDocLen ); TokenizeDocument ( tHighlighter, NULL ); - if ( !tHighlighter.m_iMatchesCount && !tFixedSettings.m_bAllowEmpty ) + if ( !tHighlighter.m_iMatchesCount && tFixedSettings.m_bAllowEmpty ) tHighlighter.m_dResult.Reset(); // add trailing zero, and return @@ -2890,7 +2921,7 @@ HighlightQuery_c tHighlighter ( tContainer, pTokenizer, pDict, tFixedSettings, tIndexSettings, sDoc, iDocLen, dMarked ); TokenizeDocument ( tHighlighter, pStripper ); - if ( !tHighlighter.m_iMatchesCount && !tFixedSettings.m_bAllowEmpty ) + if ( !tHighlighter.m_iMatchesCount && tFixedSettings.m_bAllowEmpty ) tHighlighter.m_dResult.Reset(); // add trailing zero, and return @@ -3041,5 +3072,5 @@ } // -// $Id: sphinxexcerpt.cpp 3016 2011-11-15 19:15:26Z tomat $ +// $Id: sphinxexcerpt.cpp 3087 2012-01-30 23:07:35Z shodan $ // diff -Nru sphinxsearch-0.9.9+2.0.2beta/src/sphinxexcerpt.h sphinxsearch-2.0.4/src/sphinxexcerpt.h --- sphinxsearch-0.9.9+2.0.2beta/src/sphinxexcerpt.h 2011-09-23 16:50:22.000000000 +0000 +++ sphinxsearch-2.0.4/src/sphinxexcerpt.h 2012-01-30 23:07:35.000000000 +0000 @@ -1,10 +1,10 @@ // -// $Id: sphinxexcerpt.h 2970 2011-09-23 16:50:22Z klirichek $ +// $Id: sphinxexcerpt.h 3087 2012-01-30 23:07:35Z shodan $ // // -// Copyright (c) 2001-2011, Andrew Aksyonoff -// Copyright (c) 2008-2011, Sphinx Technologies Inc +// Copyright (c) 2001-2012, Andrew Aksyonoff +// Copyright (c) 2008-2012, Sphinx Technologies Inc // All rights reserved // // This program is free software; you can redistribute it and/or modify @@ -70,5 +70,5 @@ #endif // _sphinxexcerpt_ // -// $Id: sphinxexcerpt.h 2970 2011-09-23 16:50:22Z klirichek $ +// $Id: sphinxexcerpt.h 3087 2012-01-30 23:07:35Z shodan $ // diff -Nru sphinxsearch-0.9.9+2.0.2beta/src/sphinxexpr.cpp sphinxsearch-2.0.4/src/sphinxexpr.cpp --- sphinxsearch-0.9.9+2.0.2beta/src/sphinxexpr.cpp 2011-11-13 12:36:32.000000000 +0000 +++ sphinxsearch-2.0.4/src/sphinxexpr.cpp 2012-03-01 07:18:52.000000000 +0000 @@ -1,10 +1,10 @@ // -// $Id: sphinxexpr.cpp 3008 2011-11-13 12:36:32Z klirichek $ +// $Id: sphinxexpr.cpp 3129 2012-03-01 07:18:52Z tomat $ // // -// Copyright (c) 2001-2011, Andrew Aksyonoff -// Copyright (c) 2008-2011, Sphinx Technologies Inc +// Copyright (c) 2001-2012, Andrew Aksyonoff +// Copyright (c) 2008-2012, Sphinx Technologies Inc // All rights reserved // // This program is free software; you can redistribute it and/or modify @@ -88,7 +88,7 @@ ////////////////////////////////////////////////////////////////////////// // hack hack hack -bool ( *g_pUservarsHook )( const CSphString & sUservar, CSphVector & dVals ) = NULL; +UservarIntSet_c * ( *g_pUservarsHook )( const CSphString & sUservar ); static bool g_bUdfEnabled = false; static CSphString g_sUdfDir; @@ -748,7 +748,7 @@ public: ExprParser_t ( CSphSchema * pExtra, ISphExprHook * pHook ) : m_pHook ( pHook ) - , m_pExtra ( pExtra ) + , m_pExtra ( pExtra ) {} ~ExprParser_t (); @@ -777,7 +777,7 @@ int AddNodeConstlist ( float iValue ); void AppendToConstlist ( int iNode, int64_t iValue ); void AppendToConstlist ( int iNode, float iValue ); - int ConstlistFromUservar ( int iUservar ); + int AddNodeUservar ( int iUservar ); int AddNodeHookIdent ( int iID ); int AddNodeHookFunc ( int iID, int iLeft ); @@ -1476,6 +1476,7 @@ case SPH_UDF_TYPE_FLOAT: *(float*)&m_dArgvals[i] = m_dArgs[i]->Eval ( tMatch ); break; case SPH_UDF_TYPE_STRING: tArgs.str_lengths[i] = m_dArgs[i]->StringEval ( tMatch, (const BYTE**)&tArgs.arg_values[i] ); break; case SPH_UDF_TYPE_UINT32SET: tArgs.arg_values[i] = (char*) m_dArgs[i]->MvaEval ( tMatch ); break; + case SPH_UDF_TYPE_UINT64SET: tArgs.arg_values[i] = (char*) m_dArgs[i]->MvaEval ( tMatch ); break; default: assert ( 0 ); m_dArgvals[i] = 0; break; } } @@ -1767,6 +1768,8 @@ Expr_ArgVsConstSet_c ( ISphExpr * pArg, ConstList_c * pConsts ) : Expr_ArgVsSet_c ( pArg ) { + if ( !pConsts ) + return; // can happen on uservar path if ( pConsts->m_eRetType==SPH_ATTR_FLOAT ) { m_dValues.Reserve ( pConsts->m_dFloats.GetLength() ); @@ -1882,22 +1885,61 @@ }; +/// IN() evaluator, arbitrary scalar expression vs. uservar +/// (for the sake of evaluator, uservar is a pre-sorted, refcounted external vector) +class Expr_InUservar_c : public Expr_ArgVsSet_c +{ +protected: + UservarIntSet_c * m_pConsts; + +public: + /// just get hold of args + explicit Expr_InUservar_c ( ISphExpr * pArg, UservarIntSet_c * pConsts ) + : Expr_ArgVsSet_c ( pArg ) + , m_pConsts ( pConsts ) // no addref, hook should have addref'd (otherwise there'd be a race) + {} + + /// release the uservar value + ~Expr_InUservar_c() + { + SafeRelease ( m_pConsts ); + } + + /// evaluate arg, check if the value is within set + virtual int IntEval ( const CSphMatch & tMatch ) const + { + int64_t iVal = ExprEval ( this->m_pArg, tMatch ); // 'this' fixes gcc braindamage + return m_pConsts->BinarySearch ( iVal )!=NULL; + } + + virtual void SetMVAPool ( const DWORD * pMvaPool ) { this->m_pArg->SetMVAPool ( pMvaPool ); } + virtual void SetStringPool ( const BYTE * pStrings ) { this->m_pArg->SetStringPool ( pStrings ); } +}; + + /// IN() evaluator, MVA attribute vs. constant values -template < bool IS_MVA64 > -class Expr_MVAIn_c : public Expr_ArgVsConstSet_c +template < bool MVA64 > +class Expr_MVAIn_c : public Expr_ArgVsConstSet_c { public: /// pre-sort values for binary search - Expr_MVAIn_c ( const CSphAttrLocator & tLoc, int iLocator, ConstList_c * pConsts ) - : Expr_ArgVsConstSet_c ( NULL, pConsts ) + Expr_MVAIn_c ( const CSphAttrLocator & tLoc, int iLocator, ConstList_c * pConsts, UservarIntSet_c * pUservar ) + : Expr_ArgVsConstSet_c ( NULL, pConsts ) , m_tLocator ( tLoc ) , m_iLocator ( iLocator ) , m_pMvaPool ( NULL ) + , m_pUservar ( pUservar ) { assert ( tLoc.m_iBitOffset>=0 && tLoc.m_iBitCount>0 ); + assert ( !pConsts || !pUservar ); // either constlist or uservar, not both this->m_dValues.Sort(); } + ~Expr_MVAIn_c() + { + SafeRelease ( m_pUservar ); + } + int MvaEval ( const DWORD * pMva ) const; /// evaluate arg, check if any values are within set @@ -1921,9 +1963,10 @@ } protected: - CSphAttrLocator m_tLocator; - int m_iLocator; - const DWORD * m_pMvaPool; + CSphAttrLocator m_tLocator; + int m_iLocator; + const DWORD * m_pMvaPool; + UservarIntSet_c * m_pUservar; }; @@ -1934,8 +1977,8 @@ DWORD uLen = *pMva++; const DWORD * pMvaMax = pMva+uLen; - const DWORD * pFilter = m_dValues.Begin(); - const DWORD * pFilterMax = pFilter + m_dValues.GetLength(); + const uint64_t * pFilter = m_pUservar ? (uint64_t*)m_pUservar->Begin() : m_dValues.Begin(); + const uint64_t * pFilterMax = pFilter + ( m_pUservar ? m_pUservar->GetLength() : m_dValues.GetLength() ); const DWORD * L = pMva; const DWORD * R = pMvaMax - 1; @@ -1966,8 +2009,8 @@ assert ( ( uLen%2 )==0 ); const DWORD * pMvaMax = pMva+uLen; - const DWORD * pFilter = m_dValues.Begin(); - const DWORD * pFilterMax = pFilter + m_dValues.GetLength(); + const uint64_t * pFilter = m_pUservar ? (uint64_t*)m_pUservar->Begin() : m_dValues.Begin(); + const uint64_t * pFilterMax = pFilter + ( m_pUservar ? m_pUservar->GetLength() : m_dValues.GetLength() ); const uint64_t * L = (const uint64_t *)pMva; const uint64_t * R = (const uint64_t *)( pMvaMax - 2 ); @@ -2293,34 +2336,64 @@ ISphExpr * ExprParser_t::CreateInNode ( int iNode ) { - const ExprNode_t & tNode = m_dNodes[iNode]; + const ExprNode_t & tLeft = m_dNodes[m_dNodes[iNode].m_iLeft]; + const ExprNode_t & tRight = m_dNodes[m_dNodes[iNode].m_iRight]; - if ( m_dNodes[tNode.m_iRight].m_iToken!=TOK_CONST_LIST ) + switch ( tRight.m_iToken ) { - m_sCreateError = "IN() arguments must be constants (except the 1st one)"; - return NULL; - } - - assert ( m_dNodes[tNode.m_iRight].m_iToken==TOK_CONST_LIST ); - ConstList_c * pConst = m_dNodes[tNode.m_iRight].m_pConsts; + // create IN(arg,constlist) + case TOK_CONST_LIST: + switch ( tLeft.m_iToken ) + { + case TOK_ATTR_MVA32: + return new Expr_MVAIn_c ( tLeft.m_tLocator, tLeft.m_iLocator, tRight.m_pConsts, NULL ); + case TOK_ATTR_MVA64: + return new Expr_MVAIn_c ( tLeft.m_tLocator, tLeft.m_iLocator, tRight.m_pConsts, NULL ); + default: + { + ISphExpr * pArg = CreateTree ( m_dNodes[iNode].m_iLeft ); + switch ( tRight.m_pConsts->m_eRetType ) + { + case SPH_ATTR_INTEGER: return new Expr_In_c ( pArg, tRight.m_pConsts ); break; + case SPH_ATTR_BIGINT: return new Expr_In_c ( pArg, tRight.m_pConsts ); break; + default: return new Expr_In_c ( pArg, tRight.m_pConsts ); break; + } + } + } + break; - bool bMVA = ( m_dNodes[tNode.m_iLeft].m_iToken==TOK_ATTR_MVA32 - || m_dNodes[tNode.m_iLeft].m_iToken==TOK_ATTR_MVA64 ); - if ( bMVA ) - { - if ( m_dNodes[tNode.m_iLeft].m_iToken==TOK_ATTR_MVA32 ) - return new Expr_MVAIn_c ( m_dNodes[tNode.m_iLeft].m_tLocator, m_dNodes[tNode.m_iLeft].m_iLocator, pConst ); - else - return new Expr_MVAIn_c ( m_dNodes[tNode.m_iLeft].m_tLocator, m_dNodes[tNode.m_iLeft].m_iLocator, pConst ); - } else - { - ISphExpr * pArg = CreateTree ( tNode.m_iLeft ); - switch ( pConst->m_eRetType ) + // create IN(arg,uservar) + case TOK_USERVAR: { - case SPH_ATTR_INTEGER: return new Expr_In_c ( pArg, pConst ); break; - case SPH_ATTR_BIGINT: return new Expr_In_c ( pArg, pConst ); break; - default: return new Expr_In_c ( pArg, pConst ); break; + if ( !g_pUservarsHook ) + { + m_sCreateError.SetSprintf ( "internal error: no uservars hook" ); + return NULL; + } + + UservarIntSet_c * pUservar = g_pUservarsHook ( m_dUservars[(int)tRight.m_iConst] ); + if ( !pUservar ) + { + m_sCreateError.SetSprintf ( "undefined user variable '%s'", m_dUservars[(int)tRight.m_iConst].cstr() ); + return NULL; + } + + switch ( tLeft.m_iToken ) + { + case TOK_ATTR_MVA32: + return new Expr_MVAIn_c ( tLeft.m_tLocator, tLeft.m_iLocator, NULL, pUservar ); + case TOK_ATTR_MVA64: + return new Expr_MVAIn_c ( tLeft.m_tLocator, tLeft.m_iLocator, NULL, pUservar ); + default: + return new Expr_InUservar_c ( CreateTree ( m_dNodes[iNode].m_iLeft ), pUservar ); + } + break; } + + // oops, unhandled case + default: + m_sCreateError = "IN() arguments must be constants (except the 1st one)"; + return NULL; } } @@ -2739,6 +2812,9 @@ case SPH_ATTR_UINT32SET: eRes = SPH_UDF_TYPE_UINT32SET; break; + case SPH_ATTR_UINT64SET: + eRes = SPH_UDF_TYPE_UINT64SET; + break; default: m_sParserError.SetSprintf ( "internal error: unmapped UDF argument type (arg=%d, type=%d)", i, dArgTypes[i] ); return -1; @@ -2798,24 +2874,12 @@ m_dNodes[iNode].m_pConsts->Add ( iValue ); } -int ExprParser_t::ConstlistFromUservar ( int iUservar ) +int ExprParser_t::AddNodeUservar ( int iUservar ) { - if ( g_pUservarsHook ) - { - ExprNode_t & tNode = m_dNodes.Add(); - tNode.m_iToken = TOK_CONST_LIST; - tNode.m_pConsts = new ConstList_c(); - if ( g_pUservarsHook ( m_dUservars[iUservar], tNode.m_pConsts->m_dInts ) ) - { - return m_dNodes.GetLength()-1; - } else - { - SafeDelete ( tNode.m_pConsts ); - m_dNodes.Pop(); - } - } - m_sParserError.SetSprintf ( "undefined user variable '%s'", m_dUservars[iUservar].cstr() ); - return -1; + ExprNode_t & tNode = m_dNodes.Add(); + tNode.m_iToken = TOK_USERVAR; + tNode.m_iConst = iUservar; + return m_dNodes.GetLength()-1; } int ExprParser_t::AddNodeHookIdent ( int iID ) @@ -2930,6 +2994,36 @@ Dump ( m_iParsed ); #endif + // check expression stack + if ( m_dNodes.GetLength()>100 ) + { + CSphVector dNodes; + dNodes.Reserve ( m_dNodes.GetLength()/2 ); + int iMaxHeight = 1; + int iHeight = 1; + dNodes.Add ( m_iParsed ); + while ( dNodes.GetLength() ) + { + const ExprNode_t & tExpr = m_dNodes[dNodes.Pop()]; + iHeight += ( tExpr.m_iLeft>=0 || tExpr.m_iRight>=0 ? 1 : -1 ); + iMaxHeight = Max ( iMaxHeight, iHeight ); + if ( tExpr.m_iRight>=0 ) + dNodes.Add ( tExpr.m_iRight ); + if ( tExpr.m_iLeft>=0 ) + dNodes.Add ( tExpr.m_iLeft ); + } + +#define SPH_EXPRNODE_STACK_SIZE 110 + int64_t iExprStack = sphGetStackUsed() + iMaxHeight*SPH_EXPRNODE_STACK_SIZE; + if ( sphMyStackSize()<=iExprStack ) + { + sError.SetSprintf ( "query too complex, not enough stack (thread_stack_size=%dK or higher required)", + (int)( ( iExprStack + 1024 - ( iExprStack%1024 ) ) / 1024 ) ); + return NULL; + } + } + + // create evaluator ISphExpr * pRes = CreateTree ( m_iParsed ); if ( !m_sCreateError.IsEmpty() ) @@ -3203,5 +3297,5 @@ } // -// $Id: sphinxexpr.cpp 3008 2011-11-13 12:36:32Z klirichek $ +// $Id: sphinxexpr.cpp 3129 2012-03-01 07:18:52Z tomat $ // diff -Nru sphinxsearch-0.9.9+2.0.2beta/src/sphinxexpr.h sphinxsearch-2.0.4/src/sphinxexpr.h --- sphinxsearch-0.9.9+2.0.2beta/src/sphinxexpr.h 2011-10-01 02:56:53.000000000 +0000 +++ sphinxsearch-2.0.4/src/sphinxexpr.h 2012-01-30 23:07:35.000000000 +0000 @@ -1,10 +1,10 @@ // -// $Id: sphinxexpr.h 2976 2011-10-01 02:56:53Z shodan $ +// $Id: sphinxexpr.h 3087 2012-01-30 23:07:35Z shodan $ // // -// Copyright (c) 2001-2011, Andrew Aksyonoff -// Copyright (c) 2008-2011, Sphinx Technologies Inc +// Copyright (c) 2001-2012, Andrew Aksyonoff +// Copyright (c) 2008-2012, Sphinx Technologies Inc // All rights reserved // // This program is free software; you can redistribute it and/or modify @@ -124,5 +124,5 @@ #endif // _sphinxexpr_ // -// $Id: sphinxexpr.h 2976 2011-10-01 02:56:53Z shodan $ +// $Id: sphinxexpr.h 3087 2012-01-30 23:07:35Z shodan $ // diff -Nru sphinxsearch-0.9.9+2.0.2beta/src/sphinxexpr.y sphinxsearch-2.0.4/src/sphinxexpr.y --- sphinxsearch-0.9.9+2.0.2beta/src/sphinxexpr.y 2011-07-08 15:23:04.000000000 +0000 +++ sphinxsearch-2.0.4/src/sphinxexpr.y 2012-01-31 23:27:40.000000000 +0000 @@ -37,10 +37,12 @@ %token TOK_ATTR_SINT %type attr +%type attr_mva %type expr %type arg %type arglist %type constlist +%type constlist_or_uservar %type function %left TOK_OR @@ -66,6 +68,12 @@ | TOK_ATTR_FLOAT { $$ = pParser->AddNodeAttr ( TOK_ATTR_FLOAT, $1 ); } ; +attr_mva: + attr + | TOK_ATTR_MVA32 { $$ = pParser->AddNodeAttr ( TOK_ATTR_MVA32, $1 ) } + | TOK_ATTR_MVA64 { $$ = pParser->AddNodeAttr ( TOK_ATTR_MVA64, $1 ) } + ; + expr: attr | function @@ -74,7 +82,7 @@ | TOK_ATID { $$ = pParser->AddNodeID(); } | TOK_ATWEIGHT { $$ = pParser->AddNodeWeight(); } | TOK_ID { $$ = pParser->AddNodeID(); } - | TOK_WEIGHT '(' ')' { $$ = pParser->AddNodeWeight(); } + | TOK_WEIGHT '(' ')' { $$ = pParser->AddNodeWeight(); } | TOK_HOOK_IDENT { $$ = pParser->AddNodeHookIdent ( $1 ); } | '-' expr %prec TOK_NEG { $$ = pParser->AddNodeOp ( TOK_NEG, $2, -1 ); } | TOK_NOT expr { $$ = pParser->AddNodeOp ( TOK_NOT, $2, -1 ); if ( $$<0 ) YYERROR; } @@ -101,8 +109,8 @@ arg: expr | TOK_ATTR_STRING { $$ = pParser->AddNodeAttr ( TOK_ATTR_STRING, $1 ); } - | TOK_ATTR_MVA32 { $$ = pParser->AddNodeAttr ( TOK_ATTR_MVA32, $1 ); } - | TOK_ATTR_MVA64 { $$ = pParser->AddNodeAttr ( TOK_ATTR_MVA64, $1 ); } + | TOK_ATTR_MVA32 { $$ = pParser->AddNodeAttr ( TOK_ATTR_MVA32, $1 ); } + | TOK_ATTR_MVA64 { $$ = pParser->AddNodeAttr ( TOK_ATTR_MVA64, $1 ); } | TOK_CONST_STRING { $$ = pParser->AddNodeString ( $1 ); } ; @@ -118,12 +126,17 @@ | constlist ',' TOK_CONST_FLOAT { pParser->AppendToConstlist ( $$, $3 ); } ; +constlist_or_uservar: + constlist + | TOK_USERVAR { $$ = pParser->AddNodeUservar ( $1 ); } + ; + function: TOK_FUNC '(' arglist ')' { $$ = pParser->AddNodeFunc ( $1, $3 ); if ( $$<0 ) YYERROR; } | TOK_FUNC '(' ')' { $$ = pParser->AddNodeFunc ( $1, -1 ); if ( $$<0 ) YYERROR; } | TOK_UDF '(' arglist ')' { $$ = pParser->AddNodeUdf ( $1, $3 ); if ( $$<0 ) YYERROR; } | TOK_UDF '(' ')' { $$ = pParser->AddNodeUdf ( $1, -1 ); if ( $$<0 ) YYERROR; } - | TOK_FUNC_IN '(' attr ',' constlist ')' + | TOK_FUNC_IN '(' attr_mva ',' constlist_or_uservar ')' { $$ = pParser->AddNodeFunc ( $1, $3, $5 ); } @@ -135,24 +148,12 @@ { $$ = pParser->AddNodeFunc ( $1, pParser->AddNodeID(), $5 ); } - | TOK_FUNC_IN '(' TOK_ATTR_MVA32 ',' constlist ')' - { - $$ = pParser->AddNodeAttr ( TOK_ATTR_MVA32, $3 ); - $$ = pParser->AddNodeFunc ( $1, $$, $5 ); - } - | TOK_FUNC_IN '(' TOK_ATTR_MVA64 ',' constlist ')' - { - $$ = pParser->AddNodeAttr ( TOK_ATTR_MVA64, $3 ); - $$ = pParser->AddNodeFunc ( $1, $$, $5 ); - } - | TOK_FUNC_IN '(' attr ',' TOK_USERVAR ')' + | TOK_HOOK_FUNC '(' arglist ')' { - int iConstlist = pParser->ConstlistFromUservar ( $5 ); - if ( iConstlist<0 ) + $$ = pParser->AddNodeHookFunc ( $1, $3 ); + if ( $$<0 ) YYERROR; - $$ = pParser->AddNodeFunc ( $1, $3, iConstlist ); } - | TOK_HOOK_FUNC '(' arglist ')' { $$ = pParser->AddNodeHookFunc ( $1, $3 ); if ( $$<0 ) YYERROR; } ; %% diff -Nru sphinxsearch-0.9.9+2.0.2beta/src/sphinxfilter.cpp sphinxsearch-2.0.4/src/sphinxfilter.cpp --- sphinxsearch-0.9.9+2.0.2beta/src/sphinxfilter.cpp 2011-07-08 15:23:04.000000000 +0000 +++ sphinxsearch-2.0.4/src/sphinxfilter.cpp 2012-01-30 23:07:35.000000000 +0000 @@ -1,10 +1,10 @@ // -// $Id: sphinxfilter.cpp 2876 2011-07-08 15:23:04Z tomat $ +// $Id: sphinxfilter.cpp 3087 2012-01-30 23:07:35Z shodan $ // // -// Copyright (c) 2001-2011, Andrew Aksyonoff -// Copyright (c) 2008-2011, Sphinx Technologies Inc +// Copyright (c) 2001-2012, Andrew Aksyonoff +// Copyright (c) 2008-2012, Sphinx Technologies Inc // All rights reserved // // This program is free software; you can redistribute it and/or modify @@ -691,5 +691,5 @@ } // -// $Id: sphinxfilter.cpp 2876 2011-07-08 15:23:04Z tomat $ +// $Id: sphinxfilter.cpp 3087 2012-01-30 23:07:35Z shodan $ // diff -Nru sphinxsearch-0.9.9+2.0.2beta/src/sphinxfilter.h sphinxsearch-2.0.4/src/sphinxfilter.h --- sphinxsearch-0.9.9+2.0.2beta/src/sphinxfilter.h 2011-01-01 02:33:06.000000000 +0000 +++ sphinxsearch-2.0.4/src/sphinxfilter.h 2012-01-30 23:07:35.000000000 +0000 @@ -1,10 +1,10 @@ // -// $Id: sphinxfilter.h 2616 2011-01-01 02:33:06Z shodan $ +// $Id: sphinxfilter.h 3087 2012-01-30 23:07:35Z shodan $ // // -// Copyright (c) 2001-2011, Andrew Aksyonoff -// Copyright (c) 2008-2011, Sphinx Technologies Inc +// Copyright (c) 2001-2012, Andrew Aksyonoff +// Copyright (c) 2008-2012, Sphinx Technologies Inc // All rights reserved // // This program is free software; you can redistribute it and/or modify @@ -58,5 +58,5 @@ #endif // _sphinxfilter_ // -// $Id: sphinxfilter.h 2616 2011-01-01 02:33:06Z shodan $ +// $Id: sphinxfilter.h 3087 2012-01-30 23:07:35Z shodan $ // diff -Nru sphinxsearch-0.9.9+2.0.2beta/src/sphinx.h sphinxsearch-2.0.4/src/sphinx.h --- sphinxsearch-0.9.9+2.0.2beta/src/sphinx.h 2011-11-13 12:36:32.000000000 +0000 +++ sphinxsearch-2.0.4/src/sphinx.h 2012-03-01 09:04:19.000000000 +0000 @@ -1,10 +1,10 @@ // -// $Id: sphinx.h 3008 2011-11-13 12:36:32Z klirichek $ +// $Id: sphinx.h 3131 2012-03-01 09:04:19Z deogar $ // // -// Copyright (c) 2001-2011, Andrew Aksyonoff -// Copyright (c) 2008-2011, Sphinx Technologies Inc +// Copyright (c) 2001-2012, Andrew Aksyonoff +// Copyright (c) 2008-2012, Sphinx Technologies Inc // All rights reserved // // This program is free software; you can redistribute it and/or modify @@ -196,8 +196,8 @@ #define SPHINX_TAG "-dev" #endif -#define SPHINX_VERSION "2.0.2" SPHINX_BITS_TAG SPHINX_TAG " (" SPH_SVN_TAGREV ")" -#define SPHINX_BANNER "Sphinx " SPHINX_VERSION "\nCopyright (c) 2001-2011, Andrew Aksyonoff\nCopyright (c) 2008-2011, Sphinx Technologies Inc (http://sphinxsearch.com)\n\n" +#define SPHINX_VERSION "2.0.4" SPHINX_BITS_TAG SPHINX_TAG " (" SPH_SVN_TAGREV ")" +#define SPHINX_BANNER "Sphinx " SPHINX_VERSION "\nCopyright (c) 2001-2012, Andrew Aksyonoff\nCopyright (c) 2008-2012, Sphinx Technologies Inc (http://sphinxsearch.com)\n\n" #define SPHINX_SEARCHD_PROTO 1 #define SPH_MAX_WORD_LEN 42 // so that any UTF-8 word fits 127 bytes @@ -528,8 +528,8 @@ /// get original tokenized multiform (if any); NULL means there was none virtual BYTE * GetTokenizedMultiform () { return NULL; } - virtual bool TokenIsBlended () { return m_bBlended; } - virtual bool TokenIsBlendedPart () { return m_bBlendedPart; } + virtual bool TokenIsBlended () const { return m_bBlended; } + virtual bool TokenIsBlendedPart () const { return m_bBlendedPart; } virtual int SkipBlended () { return 0; } public: @@ -2287,8 +2287,8 @@ struct WordStat_t { - int m_iDocs; ///< document count for this term - int m_iHits; ///< hit count for this term + int64_t m_iDocs; ///< document count for this term + int64_t m_iHits; ///< hit count for this term bool m_bExpanded; ///< is this term from query itself or was expanded WordStat_t() @@ -2300,14 +2300,14 @@ SmallStringHash_T m_hWordStats; ///< hash of i-th search term (normalized word form) int m_iMatches; ///< total matches returned (upto MAX_MATCHES) - int m_iTotalMatches; ///< total matches found (unlimited) + int64_t m_iTotalMatches; ///< total matches found (unlimited) CSphString m_sError; ///< error message CSphString m_sWarning; ///< warning message CSphQueryResultMeta (); ///< ctor virtual ~CSphQueryResultMeta () {} ///< dtor - void AddStat ( const CSphString & sWord, int iDocs, int iHits, bool bExpanded ); + void AddStat ( const CSphString & sWord, int64_t iDocs, int64_t iHits, bool bExpanded ); CSphQueryResultMeta ( const CSphQueryResultMeta & tMeta ); ///< copy ctor CSphQueryResultMeta & operator= ( const CSphQueryResultMeta & tMeta ); ///< copy @@ -2474,7 +2474,7 @@ { public: bool m_bRandomize; - int m_iTotal; + int64_t m_iTotal; protected: CSphSchema m_tSchema; ///< sorter schema (adds dynamic attributes on top of index schema) @@ -2522,7 +2522,7 @@ virtual int GetLength () const = 0; /// get total count of non-duplicates Push()ed through this queue - virtual int GetTotalCount () const { return m_iTotal; } + virtual int64_t GetTotalCount () const { return m_iTotal; } /// get first entry ptr /// used for docinfo lookup @@ -2794,5 +2794,5 @@ #endif // _sphinx_ // -// $Id: sphinx.h 3008 2011-11-13 12:36:32Z klirichek $ +// $Id: sphinx.h 3131 2012-03-01 09:04:19Z deogar $ // diff -Nru sphinxsearch-0.9.9+2.0.2beta/src/sphinxint.h sphinxsearch-2.0.4/src/sphinxint.h --- sphinxsearch-0.9.9+2.0.2beta/src/sphinxint.h 2011-11-14 14:29:46.000000000 +0000 +++ sphinxsearch-2.0.4/src/sphinxint.h 2012-02-22 20:30:36.000000000 +0000 @@ -1,10 +1,10 @@ // -// $Id: sphinxint.h 3012 2011-11-14 14:29:46Z tomat $ +// $Id: sphinxint.h 3117 2012-02-22 20:30:36Z tomat $ // // -// Copyright (c) 2001-2011, Andrew Aksyonoff -// Copyright (c) 2008-2011, Sphinx Technologies Inc +// Copyright (c) 2001-2012, Andrew Aksyonoff +// Copyright (c) 2008-2012, Sphinx Technologies Inc // All rights reserved // // This program is free software; you can redistribute it and/or modify @@ -81,6 +81,7 @@ bool OpenFile ( const CSphString & sName, CSphString & sErrorBuffer ); void SetFile ( int iFD, SphOffset_t * pSharedOffset ); void CloseFile ( bool bTruncate = false ); ///< note: calls Flush(), ie. IsError() might get true after this call + void UnlinkFile (); /// some shit happened (outside) and the file is no more actual. void PutByte ( int uValue ); void PutBytes ( const void * pData, int iSize ); @@ -131,6 +132,7 @@ int m_iFD; ///< my file descriptior CSphString m_sFilename; ///< my file name bool m_bTemporary; ///< whether to unlink this file on Close() + bool m_bWouldTemporary; ///< backup of the m_bTemporary CSphIndex::ProgressCallback_t * m_pProgress; ///< for displaying progress CSphIndexProgress * m_pStat; @@ -142,6 +144,7 @@ int Open ( const CSphString & sName, int iMode, CSphString & sError, bool bTemp=false ); void Close (); + void SetTemporary(); ///< would be set if a shit happened and the file is not actual. public: int GetFD () const { return m_iFD; } @@ -436,7 +439,7 @@ void Prepare ( DWORD * pOutBuffer, DWORD * pOutMax ); void CollectWithoutMvas ( const DWORD * pCur, bool bUseMvas ); - bool Collect ( const DWORD * pCur, const DWORD * pMvas, int64_t iMvasCount, CSphString & sError ); + bool Collect ( const DWORD * pCur, const DWORD * pMvas, int64_t iMvasCount, CSphString & sError, bool bHasMvaID ); void Collect ( const DWORD * pCur, const struct CSphDocMVA & dMvas ); void CollectMVA ( DOCID uDocID, const CSphVector< CSphVector > & dCurInfo ); @@ -681,7 +684,7 @@ } template < typename DOCID > -bool AttrIndexBuilder_t::Collect ( const DWORD * pCur, const DWORD * pMvas, int64_t iMvasCount, CSphString & sError ) +bool AttrIndexBuilder_t::Collect ( const DWORD * pCur, const DWORD * pMvas, int64_t iMvasCount, CSphString & sError, bool bHasMvaID ) { CollectWithoutMvas ( pCur, true ); @@ -704,13 +707,13 @@ const DWORD * pMva = pMvas + uOff; // don't care about updates at this point - if ( i==0 && DOCINFO2ID_T ( pMva-DWSIZEOF(DOCID) )!=uDocID ) + if ( bHasMvaID && i==0 && DOCINFO2ID_T ( pMva-DWSIZEOF(DOCID) )!=uDocID ) { sError.SetSprintf ( "broken index: mva docid verification failed, id=" DOCID_FMT, (SphDocID_t)uDocID ); return false; } - DWORD uCount = *pMva; + DWORD uCount = *pMva++; if ( ( uOff+uCount>=iMvasCount ) || ( i>=m_iMva64 && ( uCount%2 )!=0 ) ) { sError.SetSprintf ( "broken index: mva list out of bounds, id=" DOCID_FMT, (SphDocID_t)uDocID ); @@ -1122,16 +1125,6 @@ CSphAttrLocator m_tTo; ///< destination (dynamized) locator }; -/// internal disk index interface (that exposes some guts) -struct ISphIndex_VLN : public CSphIndex -{ - explicit ISphIndex_VLN ( const char * sIndexName, const char * sFilename ) - : CSphIndex ( sIndexName, sFilename ) - {} - - virtual void SetDynamize ( const CSphVector & dDynamize ) = 0; -}; - ////////////////////////////////////////////////////////////////////////// // DICTIONARY INTERNALS ////////////////////////////////////////////////////////////////////////// @@ -1195,6 +1188,15 @@ }; ////////////////////////////////////////////////////////////////////////// +// USER VARIABLES +////////////////////////////////////////////////////////////////////////// + +/// value container for the intset uservar type +class UservarIntSet_c : public CSphVector, public ISphRefcountedMT +{ +}; + +////////////////////////////////////////////////////////////////////////// // BINLOG INTERNALS ////////////////////////////////////////////////////////////////////////// @@ -1204,7 +1206,7 @@ public: virtual ~ISphBinlog () {} - virtual void BinlogUpdateAttributes ( const char * sIndexName, int64_t iTID, const CSphAttrUpdate & tUpd ) = 0; + virtual void BinlogUpdateAttributes ( int64_t * pTID, const char * sIndexName, const CSphAttrUpdate & tUpd ) = 0; virtual void NotifyIndexFlush ( const char * sIndexName, int64_t iTID, bool bShutdown ) = 0; }; @@ -1223,7 +1225,6 @@ ISphExpr * sphSortSetupExpr ( const CSphString & sName, const CSphSchema & tIndexSchema ); bool sphSortGetStringRemap ( const CSphSchema & tSorterSchema, const CSphSchema & tIndexSchema, CSphVector & dAttrs ); -void sphSortRemoveInternalAttrs ( CSphSchema & tSchema ); bool sphIsSortStringInternal ( const char * sColumnName ); bool sphWriteThrottled ( int iFD, const void * pBuf, int64_t iCount, const char * sName, CSphString & sError ); @@ -1411,5 +1412,5 @@ #endif // _sphinxint_ // -// $Id: sphinxint.h 3012 2011-11-14 14:29:46Z tomat $ +// $Id: sphinxint.h 3117 2012-02-22 20:30:36Z tomat $ // diff -Nru sphinxsearch-0.9.9+2.0.2beta/src/sphinxmetaphone.cpp sphinxsearch-2.0.4/src/sphinxmetaphone.cpp --- sphinxsearch-0.9.9+2.0.2beta/src/sphinxmetaphone.cpp 2011-01-01 02:33:06.000000000 +0000 +++ sphinxsearch-2.0.4/src/sphinxmetaphone.cpp 2012-01-30 23:07:35.000000000 +0000 @@ -1,10 +1,10 @@ // -// $Id: sphinxmetaphone.cpp 2616 2011-01-01 02:33:06Z shodan $ +// $Id: sphinxmetaphone.cpp 3087 2012-01-30 23:07:35Z shodan $ // // -// Copyright (c) 2001-2011, Andrew Aksyonoff -// Copyright (c) 2008-2011, Sphinx Technologies Inc +// Copyright (c) 2001-2012, Andrew Aksyonoff +// Copyright (c) 2008-2012, Sphinx Technologies Inc // All rights reserved // // This program is free software; you can redistribute it and/or modify @@ -659,5 +659,5 @@ } // -// $Id: sphinxmetaphone.cpp 2616 2011-01-01 02:33:06Z shodan $ +// $Id: sphinxmetaphone.cpp 3087 2012-01-30 23:07:35Z shodan $ // diff -Nru sphinxsearch-0.9.9+2.0.2beta/src/sphinxql.y sphinxsearch-2.0.4/src/sphinxql.y --- sphinxsearch-0.9.9+2.0.2beta/src/sphinxql.y 2011-11-03 12:36:36.000000000 +0000 +++ sphinxsearch-2.0.4/src/sphinxql.y 2011-12-20 13:17:09.000000000 +0000 @@ -675,7 +675,8 @@ const_int { $$.m_iInstype = TOK_CONST_INT; $$.m_iValue = $1.m_iValue; } | const_float { $$.m_iInstype = TOK_CONST_FLOAT; $$.m_fValue = $1.m_fValue; } | TOK_QUOTED_STRING { $$.m_iInstype = TOK_QUOTED_STRING; $$.m_sValue = $1.m_sValue; } - | '(' const_list ')' { $$.m_iInstype = TOK_CONST_MVA; $$.m_iValue = $2.m_pValues->GetLength(); $$.m_pValues = $2.m_pValues; } + | '(' const_list ')' { $$.m_iInstype = TOK_CONST_MVA; $$.m_pValues = $2.m_pValues; } + | '(' ')' { $$.m_iInstype = TOK_CONST_MVA; } ; ////////////////////////////////////////////////////////////////////////// @@ -825,7 +826,8 @@ } | TOK_IDENT '=' '(' ')' // special case () means delete mva { - pParser->UpdateAttr ( $1.m_sValue, NULL, SPH_ATTR_UINT32SET ); + SqlNode_t tNoValues; + pParser->UpdateMVAAttr ( $1.m_sValue, tNoValues ); } ; diff -Nru sphinxsearch-0.9.9+2.0.2beta/src/sphinxquery.cpp sphinxsearch-2.0.4/src/sphinxquery.cpp --- sphinxsearch-0.9.9+2.0.2beta/src/sphinxquery.cpp 2011-09-23 16:31:11.000000000 +0000 +++ sphinxsearch-2.0.4/src/sphinxquery.cpp 2012-02-21 14:52:21.000000000 +0000 @@ -1,10 +1,10 @@ // -// $Id: sphinxquery.cpp 2968 2011-09-23 16:31:11Z shodan $ +// $Id: sphinxquery.cpp 3114 2012-02-21 14:52:21Z klirichek $ // // -// Copyright (c) 2001-2011, Andrew Aksyonoff -// Copyright (c) 2008-2011, Sphinx Technologies Inc +// Copyright (c) 2001-2012, Andrew Aksyonoff +// Copyright (c) 2008-2012, Sphinx Technologies Inc // All rights reserved // // This program is free software; you can redistribute it and/or modify @@ -54,6 +54,15 @@ XQNode_t * SweepNulls ( XQNode_t * pNode ); bool FixupNots ( XQNode_t * pNode ); + inline void SetFieldSpec ( const CSphSmallBitvec& uMask, int iMaxPos ) + { + m_dStateSpec.SetFieldSpec ( uMask, iMaxPos ); + } + inline void SetZoneVec ( int iZoneVec ) + { + m_dStateSpec.SetZoneSpec ( m_dZoneVecs[iZoneVec] ); + } + public: const CSphVector & GetZoneVec ( int iZoneVec ) const { @@ -93,6 +102,7 @@ CSphVector m_dIntTokens; CSphVector < CSphVector > m_dZoneVecs; + XQLimitSpec_t m_dStateSpec; }; ////////////////////////////////////////////////////////////////////////// @@ -112,15 +122,20 @@ ////////////////////////////////////////////////////////////////////////// +void XQLimitSpec_t::SetFieldSpec ( const CSphSmallBitvec& uMask, int iMaxPos ) +{ + m_bFieldSpec = true; + m_dFieldMask = uMask; + m_iFieldMaxPos = iMaxPos; +} + + + void XQNode_t::SetFieldSpec ( const CSphSmallBitvec& uMask, int iMaxPos ) { // set it, if we do not yet have one - if ( !m_bFieldSpec ) - { - m_bFieldSpec = true; - m_dFieldMask = uMask; - m_iFieldMaxPos = iMaxPos; - } + if ( !m_dSpec.m_bFieldSpec ) + m_dSpec.SetFieldSpec ( uMask, iMaxPos ); // some of the children might not yet have a spec, even if the node itself has // eg. 'hello @title world' (whole node has '@title' spec but 'hello' node does not have any!) @@ -128,11 +143,17 @@ m_dChildren[i]->SetFieldSpec ( uMask, iMaxPos ); } +void XQLimitSpec_t::SetZoneSpec ( const CSphVector & dZones ) +{ + m_dZones = dZones; +} + + void XQNode_t::SetZoneSpec ( const CSphVector & dZones ) { // set it, if we do not yet have one - if ( !m_dZones.GetLength() ) - m_dZones = dZones; + if ( !m_dSpec.m_dZones.GetLength() ) + m_dSpec.SetZoneSpec ( dZones ); // some of the children might not yet have a spec, even if the node itself has ARRAY_FOREACH ( i, m_dChildren ) @@ -144,17 +165,17 @@ if ( !pSpecs ) return; - if ( pSpecs->m_bFieldSpec ) - SetFieldSpec ( pSpecs->m_dFieldMask, pSpecs->m_iFieldMaxPos ); + if ( !m_dSpec.m_bFieldSpec ) + m_dSpec.SetFieldSpec ( pSpecs->m_dSpec.m_dFieldMask, pSpecs->m_dSpec.m_iFieldMaxPos ); - if ( pSpecs->m_dZones.GetLength() ) - SetZoneSpec ( pSpecs->m_dZones ); + if ( !m_dSpec.m_dZones.GetLength() ) + m_dSpec.SetZoneSpec ( pSpecs->m_dSpec.m_dZones ); } void XQNode_t::ClearFieldMask () { - m_dFieldMask.Set(); + m_dSpec.m_dFieldMask.Set(); ARRAY_FOREACH ( i, m_dChildren ) m_dChildren[i]->ClearFieldMask(); @@ -791,7 +812,7 @@ XQKeyword_t tAW ( sKeyword, m_iAtomPos ); tAW.m_uStarPosition = uStarPosition; - XQNode_t * pNode = new XQNode_t(); + XQNode_t * pNode = new XQNode_t ( m_dStateSpec ); pNode->m_dWords.Add ( tAW ); m_dSpawned.Add ( pNode ); @@ -822,7 +843,7 @@ if ( eOp==SPH_QUERY_NOT ) { - XQNode_t * pNode = new XQNode_t(); + XQNode_t * pNode = new XQNode_t ( m_dStateSpec ); pNode->SetOp ( SPH_QUERY_NOT, pLeft ); m_dSpawned.Add ( pNode ); return pNode; @@ -839,30 +860,33 @@ // eg. '@title hello' vs 'world' pRight->CopySpecs ( pLeft ); + XQNode_t * pDonor = pRight; + if ( pRight->m_dSpec.m_bInvisible ) + pDonor = pLeft; + + m_dStateSpec = pDonor->m_dSpec; + // build a new node XQNode_t * pResult = NULL; if ( pLeft->m_dChildren.GetLength() && pLeft->GetOp()==eOp && pLeft->m_iOpArg==iOpArg ) { pLeft->m_dChildren.Add ( pRight ); pResult = pLeft; + if ( pRight->m_dSpec.m_bFieldSpec ) + pResult->m_dSpec.SetFieldSpec ( pRight->m_dSpec.m_dFieldMask, pRight->m_dSpec.m_iFieldMaxPos ); + + if ( pRight->m_dSpec.m_dZones.GetLength() ) + pResult->m_dSpec.SetZoneSpec ( pRight->m_dSpec.m_dZones ); } else { - XQNode_t * pNode = new XQNode_t(); + // however, it's right (!) spec which is chosen for the resulting node, + // eg. '@title hello' + 'world @body program' + XQNode_t * pNode = new XQNode_t ( pDonor->m_dSpec ); pNode->SetOp ( eOp, pLeft, pRight ); pNode->m_iOpArg = iOpArg; m_dSpawned.Add ( pNode ); pResult = pNode; } - - // however, it's right (!) spec which is chosen for the resulting node, - // eg. '@title hello' + 'world @body program' - if ( pRight->m_bFieldSpec ) - { - pResult->m_bFieldSpec = true; - pResult->m_dFieldMask = pRight->m_dFieldMask; - pResult->m_iFieldMaxPos = pRight->m_iFieldMaxPos; - } - return pResult; } @@ -968,7 +992,7 @@ // must be some NOTs within AND at this point, convert this node to ANDNOT assert ( pNode->GetOp()==SPH_QUERY_AND && pNode->m_dChildren.GetLength() && dNots.GetLength() ); - XQNode_t * pAnd = new XQNode_t(); + XQNode_t * pAnd = new XQNode_t ( pNode->m_dSpec ); pAnd->SetOp ( SPH_QUERY_AND, pNode->m_dChildren ); m_dSpawned.Add ( pAnd ); @@ -978,7 +1002,7 @@ pNot = dNots[0]; } else { - pNot = new XQNode_t(); + pNot = new XQNode_t ( pNode->m_dSpec ); pNot->SetOp ( SPH_QUERY_OR, dNots ); m_dSpawned.Add ( pNot ); } @@ -995,7 +1019,7 @@ for ( int i = 0; i < pNode->m_dChildren.GetLength (); ) { - if ( pNode->m_dChildren[i]->m_dFieldMask.TestAll() ) + if ( pNode->m_dChildren[i]->m_dSpec.m_dFieldMask.TestAll() ) { // this should be a leaf node assert ( pNode->m_dChildren[i]->m_dChildren.GetLength()==0 ); @@ -1063,7 +1087,7 @@ const int OPTION_RELAXED_LEN = strlen ( OPTION_RELAXED ); m_bStopOnInvalid = true; - if ( strncmp ( sQuery, OPTION_RELAXED, OPTION_RELAXED_LEN )==0 && !sphIsAlpha ( sQuery[OPTION_RELAXED_LEN] ) ) + if ( sQuery && strncmp ( sQuery, OPTION_RELAXED, OPTION_RELAXED_LEN )==0 && !sphIsAlpha ( sQuery[OPTION_RELAXED_LEN] ) ) { sQuery += OPTION_RELAXED_LEN; m_bStopOnInvalid = false; @@ -1072,7 +1096,7 @@ // setup parser m_pParsed = &tParsed; m_sQuery = (BYTE*) sQuery; - m_iQueryLen = strlen(sQuery); + m_iQueryLen = sQuery ? strlen(sQuery) : 0; m_pTokenizer = pMyTokenizer.Ptr(); m_pSchema = pSchema; m_pDict = pDict; @@ -1118,7 +1142,7 @@ // all ok; might want to create a dummy node to indicate that m_dSpawned.Reset(); - tParsed.m_pRoot = m_pRoot ? m_pRoot : new XQNode_t (); + tParsed.m_pRoot = m_pRoot ? m_pRoot : new XQNode_t ( m_dStateSpec ); return true; } @@ -1520,7 +1544,7 @@ XQNode_t * pNode; if ( !hBranches.Exists(j) ) { - pNode = new XQNode_t; + pNode = new XQNode_t ( pTree->m_dSpec ); pNode->SetOp ( m_eOp, pTree->m_dChildren[i] ); hBranches.Add ( pNode, j ); } else @@ -1539,7 +1563,7 @@ { if ( !pOtherChildren ) { - pOtherChildren = new XQNode_t; + pOtherChildren = new XQNode_t ( pTree->m_dSpec ); pOtherChildren->SetOp ( m_eOp, pTree->m_dChildren[i] ); } else pOtherChildren->m_dChildren.Add ( pTree->m_dChildren[i] ); @@ -1735,5 +1759,5 @@ } // -// $Id: sphinxquery.cpp 2968 2011-09-23 16:31:11Z shodan $ +// $Id: sphinxquery.cpp 3114 2012-02-21 14:52:21Z klirichek $ // diff -Nru sphinxsearch-0.9.9+2.0.2beta/src/sphinxquery.h sphinxsearch-2.0.4/src/sphinxquery.h --- sphinxsearch-0.9.9+2.0.2beta/src/sphinxquery.h 2011-08-13 15:54:34.000000000 +0000 +++ sphinxsearch-2.0.4/src/sphinxquery.h 2012-02-21 14:52:21.000000000 +0000 @@ -1,10 +1,10 @@ // -// $Id: sphinxquery.h 2914 2011-08-13 15:54:34Z tomat $ +// $Id: sphinxquery.h 3114 2012-02-21 14:52:21Z klirichek $ // // -// Copyright (c) 2001-2011, Andrew Aksyonoff -// Copyright (c) 2008-2011, Sphinx Technologies Inc +// Copyright (c) 2001-2012, Andrew Aksyonoff +// Copyright (c) 2008-2012, Sphinx Technologies Inc // All rights reserved // // This program is free software; you can redistribute it and/or modify @@ -76,6 +76,60 @@ SPH_QUERY_PARAGRAPH }; +// the limit of field or zone +struct XQLimitSpec_t +{ + bool m_bFieldSpec; ///< whether field spec was already explicitly set + bool m_bInvisible; ///< totally ignore this set + CSphSmallBitvec m_dFieldMask; ///< fields mask (spec part) + int m_iFieldMaxPos; ///< max position within field (spec part) + CSphVector m_dZones; ///< zone indexes in per-query zones list + +public: + XQLimitSpec_t () + { + Reset(); + } + + inline void Reset () + { + m_bInvisible = false; + m_bFieldSpec = false; + m_iFieldMaxPos = 0; + m_dFieldMask.Set(); + m_dZones.Reset(); + } + + inline void Hide () + { + m_bInvisible = true; + } + + XQLimitSpec_t ( const XQLimitSpec_t& dLimit ) + { + if ( this==&dLimit ) + return; + Reset(); + *this = dLimit; + } + + XQLimitSpec_t & operator = ( const XQLimitSpec_t& dLimit ) + { + if ( this==&dLimit ) + return *this; + + if ( dLimit.m_bFieldSpec ) + SetFieldSpec ( dLimit.m_dFieldMask, dLimit.m_iFieldMaxPos ); + + if ( dLimit.m_dZones.GetLength() ) + SetZoneSpec ( dLimit.m_dZones ); + + return *this; + } +public: + void SetZoneSpec ( const CSphVector & dZones ); + void SetFieldSpec ( const CSphSmallBitvec& uMask, int iMaxPos ); +}; /// extended query node /// plain nodes are just an atom @@ -94,12 +148,7 @@ public: CSphVector m_dChildren; ///< non-plain node children - - bool m_bFieldSpec; ///< whether field spec was already explicitly set - CSphSmallBitvec m_dFieldMask; ///< fields mask (spec part) - int m_iFieldMaxPos; ///< max position within field (spec part) - - CSphVector m_dZones; ///< zone indexes in per-query zones list + XQLimitSpec_t m_dSpec; ///< specification by field, zone(s), etc. CSphVector m_dWords; ///< query words (plain node) int m_iOpArg; ///< operator argument (proximity distance, quorum count) @@ -109,21 +158,18 @@ public: /// ctor - XQNode_t () + explicit XQNode_t ( const XQLimitSpec_t& dSpec ) : m_pParent ( NULL ) , m_eOp ( SPH_QUERY_AND ) , m_iOrder ( 0 ) , m_iCounter ( 0 ) , m_iMagicHash ( 0 ) - , m_bFieldSpec ( false ) - , m_iFieldMaxPos ( 0 ) + , m_dSpec ( dSpec ) , m_iOpArg ( 0 ) , m_iAtomPos ( -1 ) , m_bVirtuallyPlain ( false ) , m_bNotWeighted ( false ) - { - m_dFieldMask.Set(); - } + {} /// dtor ~XQNode_t () @@ -249,5 +295,5 @@ #endif // _sphinxquery_ // -// $Id: sphinxquery.h 2914 2011-08-13 15:54:34Z tomat $ +// $Id: sphinxquery.h 3114 2012-02-21 14:52:21Z klirichek $ // diff -Nru sphinxsearch-0.9.9+2.0.2beta/src/sphinxquery.y sphinxsearch-2.0.4/src/sphinxquery.y --- sphinxsearch-0.9.9+2.0.2beta/src/sphinxquery.y 2011-07-19 15:55:08.000000000 +0000 +++ sphinxsearch-2.0.4/src/sphinxquery.y 2012-02-21 14:52:21.000000000 +0000 @@ -40,7 +40,6 @@ %type sentence %type paragraph %type atom -%type atomf %type orlist %type orlistf %type beforelist @@ -54,46 +53,31 @@ expr { pParser->AddQuery ( $1 ); } ; -rawkeyword: - TOK_KEYWORD { $$ = $1; } - | TOK_INT { $$ = pParser->AddKeyword ( ( $1.iStrIndex>=0 ) ? pParser->m_dIntTokens[$1.iStrIndex].cstr() : NULL ); } - ; - -keyword: - rawkeyword - | rawkeyword '$' { $$ = $1; assert ( $$->m_dWords.GetLength()==1 ); $$->m_dWords[0].m_bFieldEnd = true; } - | '^' rawkeyword { $$ = $2; assert ( $$->m_dWords.GetLength()==1 ); $$->m_dWords[0].m_bFieldStart = true; } - | '^' rawkeyword '$' { $$ = $2; assert ( $$->m_dWords.GetLength()==1 ); $$->m_dWords[0].m_bFieldStart = true; $$->m_dWords[0].m_bFieldEnd = true; } - ; - -phrasetoken: - keyword { $$ = $1; } - | '(' { $$ = NULL; } - | ')' { $$ = NULL; } - | '-' { $$ = NULL; } - | '|' { $$ = NULL; } - | '~' { $$ = NULL; } - | '/' { $$ = NULL; } +expr: + beforelist { $$ = $1; } + | expr beforelist { $$ = pParser->AddOp ( SPH_QUERY_AND, $1, $2 ); } ; -phrase: - phrasetoken { $$ = $1; } - | phrase phrasetoken { $$ = pParser->AddKeyword ( $1, $2 ); } +tok_limiter: + // empty + | TOK_FIELDLIMIT { pParser->SetFieldSpec ( $1.dMask, $1.iMaxPos ); } + | TOK_ZONE { pParser->SetZoneVec ( $1 ); } ; -sp_item: - keyword { $$ = $1; } - | '"' phrase '"' { $$ = $2; if ( $$ ) { assert ( $$->m_dWords.GetLength() ); $$->SetOp ( SPH_QUERY_PHRASE); } } +beforelist: + orlistf { $$ = $1; } + | beforelist TOK_BEFORE orlistf { $$ = pParser->AddOp ( SPH_QUERY_BEFORE, $1, $3 ); } + | beforelist TOK_NEAR orlistf { $$ = pParser->AddOp ( SPH_QUERY_NEAR, $1, $3, $2.iValue ); } ; -sentence: - sp_item TOK_SENTENCE sp_item { $$ = pParser->AddOp ( SPH_QUERY_SENTENCE, $1, $3 ); } - | sentence TOK_SENTENCE sp_item { $$ = pParser->AddOp ( SPH_QUERY_SENTENCE, $1, $3 ); } +orlistf: + orlist { $$ = $1; } + | tok_limiter '-' orlist { $$ = pParser->AddOp ( SPH_QUERY_NOT, $3, NULL ); } ; -paragraph: - sp_item TOK_PARAGRAPH sp_item { $$ = pParser->AddOp ( SPH_QUERY_PARAGRAPH, $1, $3 ); } - | paragraph TOK_PARAGRAPH sp_item { $$ = pParser->AddOp ( SPH_QUERY_PARAGRAPH, $1, $3 ); } +orlist: + tok_limiter atom { $$ = $2; } + | orlist '|' tok_limiter atom { $$ = pParser->AddOp ( SPH_QUERY_OR, $1, $4 ); } ; atom: @@ -106,37 +90,53 @@ | '"' phrase '"' { $$ = $2; if ( $$ ) { assert ( $$->m_dWords.GetLength() ); $$->SetOp ( SPH_QUERY_PHRASE); } } | '"' phrase '"' '~' TOK_INT { $$ = $2; if ( $$ ) { assert ( $$->m_dWords.GetLength() ); $$->SetOp ( SPH_QUERY_PROXIMITY ); $$->m_iOpArg = $5.iValue; } } | '"' phrase '"' '/' TOK_INT { $$ = $2; if ( $$ ) { assert ( $$->m_dWords.GetLength() ); $$->SetOp ( SPH_QUERY_QUORUM ); $$->m_iOpArg = $5.iValue; } } - | '(' expr ')' { $$ = $2; if ( $$ ) $$->m_bFieldSpec = false; } + | '(' expr ')' { $$ = $2; if ( $$ ) $$->m_dSpec.Hide(); pParser->m_dStateSpec.Reset(); } + ; -atomf: - atom { $$ = $1; } - | TOK_FIELDLIMIT atom { $$ = $2; if ( $$ ) $$->SetFieldSpec ( $1.dMask, $1.iMaxPos ); } - | TOK_ZONE atom { $$ = $2; if ( $$ ) $$->SetZoneSpec ( pParser->GetZoneVec ( $1 ) ); } +keyword: + rawkeyword + | rawkeyword '$' { $$ = $1; assert ( $$->m_dWords.GetLength()==1 ); $$->m_dWords[0].m_bFieldEnd = true; } + | '^' rawkeyword { $$ = $2; assert ( $$->m_dWords.GetLength()==1 ); $$->m_dWords[0].m_bFieldStart = true; } + | '^' rawkeyword '$' { $$ = $2; assert ( $$->m_dWords.GetLength()==1 ); $$->m_dWords[0].m_bFieldStart = true; $$->m_dWords[0].m_bFieldEnd = true; } ; -orlist: - atomf { $$ = $1; } - | orlist '|' atomf { $$ = pParser->AddOp ( SPH_QUERY_OR, $1, $3 ); } +rawkeyword: + TOK_KEYWORD { $$ = $1; } + | TOK_INT { $$ = pParser->AddKeyword ( ( $1.iStrIndex>=0 ) ? pParser->m_dIntTokens[$1.iStrIndex].cstr() : NULL ); } ; -orlistf: - orlist { $$ = $1; } - | '-' orlist { $$ = pParser->AddOp ( SPH_QUERY_NOT, $2, NULL ); } - | TOK_FIELDLIMIT '-' orlist { $$ = pParser->AddOp ( SPH_QUERY_NOT, $3, NULL ); $$->SetFieldSpec ( $1.dMask, $1.iMaxPos ); } +sentence: + sp_item TOK_SENTENCE sp_item { $$ = pParser->AddOp ( SPH_QUERY_SENTENCE, $1, $3 ); } + | sentence TOK_SENTENCE sp_item { $$ = pParser->AddOp ( SPH_QUERY_SENTENCE, $1, $3 ); } ; -beforelist: - orlistf - | beforelist TOK_BEFORE orlistf { $$ = pParser->AddOp ( SPH_QUERY_BEFORE, $1, $3 ); } - | beforelist TOK_NEAR orlistf { $$ = pParser->AddOp ( SPH_QUERY_NEAR, $1, $3, $2.iValue ); } +paragraph: + sp_item TOK_PARAGRAPH sp_item { $$ = pParser->AddOp ( SPH_QUERY_PARAGRAPH, $1, $3 ); } + | paragraph TOK_PARAGRAPH sp_item { $$ = pParser->AddOp ( SPH_QUERY_PARAGRAPH, $1, $3 ); } ; -expr: - beforelist { $$ = $1; } - | expr beforelist { $$ = pParser->AddOp ( SPH_QUERY_AND, $1, $2 ); } +sp_item: + keyword { $$ = $1; } + | '"' phrase '"' { $$ = $2; if ( $$ ) { assert ( $$->m_dWords.GetLength() ); $$->SetOp ( SPH_QUERY_PHRASE); } } + ; + +phrase: + phrasetoken { $$ = $1; } + | phrase phrasetoken { $$ = pParser->AddKeyword ( $1, $2 ); } + ; + +phrasetoken: + keyword { $$ = $1; } + | '(' { $$ = NULL; } + | ')' { $$ = NULL; } + | '-' { $$ = NULL; } + | '|' { $$ = NULL; } + | '~' { $$ = NULL; } + | '/' { $$ = NULL; } ; + %% #if USE_WINDOWS diff -Nru sphinxsearch-0.9.9+2.0.2beta/src/sphinxrt.cpp sphinxsearch-2.0.4/src/sphinxrt.cpp --- sphinxsearch-0.9.9+2.0.2beta/src/sphinxrt.cpp 2011-11-15 22:22:49.000000000 +0000 +++ sphinxsearch-2.0.4/src/sphinxrt.cpp 2012-03-01 01:44:34.000000000 +0000 @@ -1,10 +1,10 @@ // -// $Id: sphinxrt.cpp 3017 2011-11-15 22:22:49Z shodan $ +// $Id: sphinxrt.cpp 3128 2012-03-01 01:44:34Z shodan $ // // -// Copyright (c) 2001-2011, Andrew Aksyonoff -// Copyright (c) 2008-2011, Sphinx Technologies Inc +// Copyright (c) 2001-2012, Andrew Aksyonoff +// Copyright (c) 2008-2012, Sphinx Technologies Inc // All rights reserved // // This program is free software; you can redistribute it and/or modify @@ -782,7 +782,7 @@ explicit RtAccum_t ( bool bKeywordDict ); ~RtAccum_t(); - void SetupDict ( RtIndex_t * pIndex, CSphDict * pDict ); + void SetupDict ( RtIndex_t * pIndex, CSphDict * pDict, bool bKeywordDict ); void ResetDict (); void Sort (); @@ -913,8 +913,8 @@ RtBinlog_c (); ~RtBinlog_c (); - void BinlogCommit ( const char * sIndexName, int64_t iTID, const RtSegment_t * pSeg, const CSphVector & dKlist, bool bKeywordDict ); - void BinlogUpdateAttributes ( const char * sIndexName, int64_t iTID, const CSphAttrUpdate & tUpd ); + void BinlogCommit ( int64_t * pTID, const char * sIndexName, const RtSegment_t * pSeg, const CSphVector & dKlist, bool bKeywordDict ); + void BinlogUpdateAttributes ( int64_t * pTID, const char * sIndexName, const CSphAttrUpdate & tUpd ); void NotifyIndexFlush ( const char * sIndexName, int64_t iTID, bool bShutdown ); void Configure ( const CSphConfigSection & hSearchd, bool bTestMode ); @@ -1000,9 +1000,6 @@ int m_iLockFD; mutable RtDiskKlist_t m_tKlist; - CSphSchema m_tOutboundSchema; - CSphVector m_dDynamize; - int64_t m_iSavedTID; int64_t m_iSavedRam; int64_t m_tmSaved; @@ -1020,9 +1017,9 @@ virtual void Commit (); virtual void RollBack (); void CommitReplayable ( RtSegment_t * pNewSeg, CSphVector & dAccKlist ); // FIXME? protect? - virtual void DumpToDisk ( const char * sFilename ); virtual void CheckRamFlush (); virtual void ForceRamFlush ( bool bPeriodic=false ); + virtual void ForceDiskChunk (); virtual bool AttachDiskIndex ( CSphIndex * pIndex, CSphString & sError ); private: @@ -1045,7 +1042,6 @@ bool LoadRamChunk ( DWORD uVersion ); bool SaveRamChunk (); - void ComputeOutboundSchema(); virtual void GetPrefixedWords ( const char * sWord, int iWordLen, CSphVector & dPrefixedWords, BYTE * pDictBuf, int iFD ) const; public: @@ -1100,7 +1096,7 @@ CSphDict * SetupExactDict ( CSphScopedPtr & tContainer, CSphDict * pPrevDict, ISphTokenizer * pTokenizer ) const; CSphDict * SetupStarDict ( CSphScopedPtr & tContainer, CSphDict * pPrevDict, ISphTokenizer * pTokenizer ) const; - virtual const CSphSchema & GetMatchSchema () const { return m_tOutboundSchema; } + virtual const CSphSchema & GetMatchSchema () const { return m_tSchema; } virtual const CSphSchema & GetInternalSchema () const { return m_tSchema; } int64_t GetUsedRam () const; @@ -1112,31 +1108,6 @@ }; -void RtIndex_t::ComputeOutboundSchema() -{ - m_tOutboundSchema.ResetAttrs(); - for ( int i=0; i pTokenizer ( m_pTokenizer->Clone ( false ) ); // avoid race - CSphSource_StringVector tSrc ( iFields, ppFields, m_tOutboundSchema ); + CSphSource_StringVector tSrc ( iFields, ppFields, m_tSchema ); tSrc.Setup ( m_tSettings ); tSrc.SetTokenizer ( pTokenizer.Ptr() ); tSrc.SetDict ( pAcc->m_pDict ); if ( !tSrc.Connect ( m_sLastError ) ) return false; - tSrc.m_tDocInfo.Clone ( tDoc, m_tOutboundSchema.GetRowSize() ); + tSrc.m_tDocInfo.Clone ( tDoc, m_tSchema.GetRowSize() ); if ( !tSrc.IterateStart ( sError ) || !tSrc.IterateDocument ( sError ) ) return false; @@ -1414,7 +1372,7 @@ assert ( pAcc->m_pIndex==NULL || pAcc->m_pIndex==this ); pAcc->m_pIndex = this; - pAcc->SetupDict ( this, m_pDict ); + pAcc->SetupDict ( this, m_pDict, m_bKeywordDict ); return pAcc; } @@ -1424,7 +1382,7 @@ RtAccum_t * pAcc = AcquireAccum ( &sError ); if ( pAcc ) - pAcc->AddDocument ( pHits, tDoc, m_tOutboundSchema.GetRowSize(), ppStr, dMvas ); + pAcc->AddDocument ( pHits, tDoc, m_tSchema.GetRowSize(), ppStr, dMvas ); return ( pAcc!=NULL ); } @@ -1450,15 +1408,16 @@ SafeDelete ( m_pDictRt ); } -void RtAccum_t::SetupDict ( RtIndex_t * pIndex, CSphDict * pDict ) +void RtAccum_t::SetupDict ( RtIndex_t * pIndex, CSphDict * pDict, bool bKeywordDict ) { - if ( pIndex!=m_pRefIndex || pDict!=m_pRefDict ) + if ( pIndex!=m_pRefIndex || pDict!=m_pRefDict || bKeywordDict!=m_bKeywordDict ) { SafeDelete ( m_pDictCloned ); SafeDelete ( m_pDictRt ); m_pDict = NULL; m_pRefIndex = pIndex; m_pRefDict = pDict; + m_bKeywordDict = bKeywordDict; } if ( !m_pDict ) @@ -1585,7 +1544,8 @@ // cook checkpoints - make NULL terminating strings from offsets static void FixupSegmentCheckpoints ( RtSegment_t * pSeg ) { - assert ( !pSeg->m_dWordCheckpoints.GetLength() || pSeg->m_dKeywordCheckpoints.GetLength() ); + assert ( pSeg && + ( !pSeg->m_dWordCheckpoints.GetLength() || pSeg->m_dKeywordCheckpoints.GetLength() ) ); if ( !pSeg->m_dWordCheckpoints.GetLength() ) return; @@ -2110,15 +2070,6 @@ return iLen; } - -void CopyDocid ( SphDocID_t uDocid, CSphTightVector & dDst ) -{ - int iLen = dDst.GetLength(); - dDst.Resize ( iLen + sizeof(uDocid) ); - DOCINFOSETID ( dDst.Begin()+iLen, uDocid ); -} - - static void ExtractLocators ( const CSphSchema & tSchema, ESphAttr eAttrType, CSphVector & dLocators ) { for ( int i=0; i & GetLocators () const { return m_dLocators; } - void SetDocid ( SphDocID_t uDocid ) - { - CopyDocid ( uDocid, m_dDst ); - } + void SetDocid ( SphDocID_t ) {} DWORD CopyAttr ( const DWORD * pSrc ) { @@ -2267,7 +2215,7 @@ assert ( uOff && uOffm_sWord+1, *pWords1->m_sWord, (const char *)pWords2->m_sWord+1, *pWords2->m_sWord ) - : ( pWords1->m_uWordIDm_uWordID ? I64C(-1) : pWords1->m_uWordID-pWords2->m_uWordID ) ); + int iCmp = 0; + if ( m_bKeywordDict ) + { + iCmp = sphDictCmpStrictly ( (const char *)pWords1->m_sWord+1, *pWords1->m_sWord, (const char *)pWords2->m_sWord+1, *pWords2->m_sWord ); + } else + { + if ( pWords1->m_uWordIDm_uWordID ) + iCmp = -1; + else if ( pWords1->m_uWordID>pWords2->m_uWordID ) + iCmp = 1; + } if ( iCmp==0 ) break; @@ -2440,10 +2396,10 @@ // phase 0, build a new segment // accum and segment are thread local; so no locking needed yet // segment might be NULL if we're only killing rows this txn - pAcc->CleanupDuplacates ( m_tOutboundSchema.GetRowSize() ); + pAcc->CleanupDuplacates ( m_tSchema.GetRowSize() ); pAcc->Sort(); - RtSegment_t * pNewSeg = pAcc->CreateSegment ( m_tOutboundSchema.GetRowSize(), m_iWordsCheckpoint ); + RtSegment_t * pNewSeg = pAcc->CreateSegment ( m_tSchema.GetRowSize(), m_iWordsCheckpoint ); assert ( !pNewSeg || pNewSeg->m_iRows>0 ); assert ( !pNewSeg || pNewSeg->m_iAliveRows>0 ); assert ( !pNewSeg || pNewSeg->m_bTlsKlist==false ); @@ -2482,7 +2438,7 @@ Verify ( m_tWriterMutex.Lock() ); // first of all, binlog txn data for recovery - g_pRtBinlog->BinlogCommit ( m_sIndexName.cstr(), ++m_iTID, pNewSeg, dAccKlist, m_bKeywordDict ); + g_pRtBinlog->BinlogCommit ( &m_iTID, m_sIndexName.cstr(), pNewSeg, dAccKlist, m_bKeywordDict ); // let merger know that existing segments are subject to additional, TLS K-list filter // safe despite the readers, flag must only be used by writer @@ -2509,7 +2465,7 @@ // enforce RAM usage limit int64_t iRamLeft = m_iRamSize; ARRAY_FOREACH ( i, dSegments ) - iRamLeft = Max ( 0, iRamLeft - dSegments[i]->GetUsedRam() ); + iRamLeft = Max ( iRamLeft - dSegments[i]->GetUsedRam(), 0 ); // skip merging if no rows were added or no memory left bool bDump = ( iRamLeft==0 ); @@ -2541,7 +2497,9 @@ CSphTightVectorPolicy::Relimit ( 0, LOC_ESTIMATE ( m_dWords ) ) + CSphTightVectorPolicy::Relimit ( 0, LOC_ESTIMATE ( m_dDocs ) ) + CSphTightVectorPolicy::Relimit ( 0, LOC_ESTIMATE ( m_dHits ) ) + - CSphTightVectorPolicy::Relimit ( 0, LOC_ESTIMATE ( m_dStrings ) ); + CSphTightVectorPolicy::Relimit ( 0, LOC_ESTIMATE ( m_dStrings ) + + CSphTightVectorPolicy::Relimit ( 0, LOC_ESTIMATE ( m_dMvas ) ) + + CSphTightVectorPolicy::Relimit ( 0, LOC_ESTIMATE ( m_dKeywordCheckpoints ) ) ); #undef LOC_ESTIMATE #undef LOC_ESTIMATE1 @@ -2636,26 +2594,34 @@ if ( !pSeg->m_bTlsKlist ) continue; // should be fresh enough - bool bKlistChanged = false; - // this segment was not created by this txn // so we need to merge additional K-list from current txn into it + CSphVector dKlistAddon; ARRAY_FOREACH ( j, dAccKlist ) { + // tricky bit! + // we can NOT append ids to segment k-list directly + // because FindAliveRow() will binary search it + // and it will expect a sorted list SphDocID_t uDocid = dAccKlist[j]; if ( pSeg->FindAliveRow ( uDocid ) ) - { - pSeg->m_dKlist.Add ( uDocid ); - pSeg->m_iAliveRows--; - assert ( pSeg->m_iAliveRows>=0 ); - bKlistChanged = true; - } + dKlistAddon.Add ( uDocid ); } - // we did not check for existence in K-list, only in segment - // so need to use Uniq(), not just Sort() - if ( bKlistChanged ) + // now actually update it + if ( dKlistAddon.GetLength() ) + { + // copy data, update counters + ARRAY_FOREACH ( i, dKlistAddon ) + pSeg->m_dKlist.Add ( dKlistAddon[i] ); + + pSeg->m_iAliveRows -= dKlistAddon.GetLength(); + assert ( pSeg->m_iAliveRows>=0 ); + + // we did not check for existence in K-list, only in segment + // so need to use Uniq(), not just Sort() pSeg->m_dKlist.Uniq (); + } // mark as good pSeg->m_bTlsKlist = false; @@ -2753,17 +2719,18 @@ }; -void RtIndex_t::DumpToDisk ( const char * sFilename ) +void RtIndex_t::ForceDiskChunk () { MEMORY ( SPH_MEM_IDX_RT ); Verify ( m_tWriterMutex.Lock() ); Verify ( m_tRwlock.WriteLock() ); - SaveDiskData ( sFilename ); + SaveDiskChunk(); Verify ( m_tRwlock.Unlock() ); Verify ( m_tWriterMutex.Unlock() ); } + // Here is the devil of saving id32 chunk from id64 binary daemon template < typename DOCID, typename WORDID > void RtIndex_t::SaveDiskDataImpl ( const char * sFilename ) const @@ -2771,7 +2738,7 @@ typedef RtDoc_T RTDOC; typedef RtWord_T RTWORD; - CSphString sName, sError; + CSphString sName, sError; // FIXME!!! report collected (sError) errors CSphWriter wrHits, wrDocs, wrDict, wrRows; sName.SetSprintf ( "%s.spp", sFilename ); wrHits.OpenFile ( sName.cstr(), sError ); @@ -3001,6 +2968,9 @@ // write checkpoints SphOffset_t uOff = m_bKeywordDict ? 0 : wrDocs.GetPos() - uLastDocpos; + // FIXME!!! don't write to wrDict if iWords==0 + // however plain index becomes m_bIsEmpty and full scan does not work there + // we'll get partly working RT ( RAM chunk works and disk chunks give empty result set ) wrDict.ZipInt ( 0 ); // indicate checkpoint wrDict.ZipOffset ( uOff ); // store last doclist length @@ -3026,8 +2996,11 @@ } } + //////////////////// // write attributes - // the new, template-param aligned iStride instead of index-wide. + //////////////////// + + // the new, template-param aligned iStride instead of index-wide int iStride = DWSIZEOF(DOCID) + m_tSchema.GetRowSize(); CSphVector*> pRowIterators ( m_pSegments.GetLength() ); ARRAY_FOREACH ( i, m_pSegments ) @@ -3041,6 +3014,7 @@ int iTotalDocs = 0; ARRAY_FOREACH ( i, m_pSegments ) iTotalDocs += m_pSegments[i]->m_iAliveRows; + AttrIndexBuilder_t tMinMaxBuilder ( m_tSchema ); CSphVector dMinMaxBuffer ( tMinMaxBuilder.GetExpectedSize ( iTotalDocs ) ); tMinMaxBuilder.Prepare ( dMinMaxBuffer.Begin(), dMinMaxBuffer.Begin() + dMinMaxBuffer.GetLength() ); @@ -3096,7 +3070,7 @@ #endif // collect min-max data - tMinMaxBuilder.Collect ( pRow, pSegment->m_dMvas.Begin(), pSegment->m_dMvas.GetLength(), sError ); + tMinMaxBuilder.Collect ( pRow, pSegment->m_dMvas.Begin(), pSegment->m_dMvas.GetLength(), sError, false ); if ( pSegment->m_dStrings.GetLength()>1 || pSegment->m_dMvas.GetLength()>1 ) // should be more then dummy zero elements { @@ -3126,9 +3100,10 @@ if ( tMinMaxBuilder.GetActualSize() ) wrRows.PutBytes ( dMinMaxBuffer.Begin(), sizeof(DWORD) * tMinMaxBuilder.GetActualSize() ); + tMvaWriter.CloseFile(); tStrWriter.CloseFile (); - // write dummy string attributes, mva and kill-list files + // write dummy kill-list files CSphWriter wrDummy; // dump killlist @@ -3143,8 +3118,6 @@ m_tKlist.KillListUnlock(); wrDummy.CloseFile (); - sName.SetSprintf ( "%s.spm", sFilename ); wrDummy.OpenFile ( sName.cstr(), sError ); wrDummy.CloseFile (); - // header SaveDiskHeader ( sFilename, dCheckpoints.GetLength(), iCheckpointsPosition, uKlistSize, iTotalDocs*iStride, m_bId32to64 ); @@ -3339,6 +3312,7 @@ sphDie ( "disk chunk %s: alloc failed", sChunk.cstr() ); pDiskChunk->SetWordlistPreload ( m_bPreloadWordlist ); + pDiskChunk->m_iExpansionLimit = m_iExpansionLimit; if ( !pDiskChunk->Prealloc ( false, m_bPathStripped, sWarning ) ) sphDie ( "disk chunk %s: prealloc failed: %s", sChunk.cstr(), pDiskChunk->GetLastError().cstr() ); @@ -3346,11 +3320,6 @@ if ( !pDiskChunk->Preread() ) sphDie ( "disk chunk %s: preread failed: %s", sChunk.cstr(), pDiskChunk->GetLastError().cstr() ); - ISphIndex_VLN * pChunk = dynamic_cast ( pDiskChunk ); - if ( !pChunk ) - sphDie ( "disk chunk %s: internal error on load, dynamic_cast failed", sChunk.cstr() ); - pChunk->SetDynamize ( m_dDynamize ); - return pDiskChunk; } @@ -3463,8 +3432,6 @@ return false; // update schema - m_tOutboundSchema = m_tSchema; - ComputeOutboundSchema(); m_iStride = DOCINFO_IDSIZE + m_tSchema.GetRowSize(); } @@ -3712,16 +3679,64 @@ } } + +#define LOC_FAIL(_args) \ + if ( ++iFails<=FAILS_THRESH ) \ +{ \ + fprintf ( fp, "FAILED, " ); \ + fprintf _args; \ + fprintf ( fp, "\n" ); \ + iFailsPrinted++; \ + \ + if ( iFails==FAILS_THRESH ) \ + fprintf ( fp, "(threshold reached; suppressing further output)\n" ); \ +} + int RtIndex_t::DebugCheck ( FILE * fp ) { + const int FAILS_THRESH = 100; int iFails = 0; + int iFailsPrinted = 0; + int iFailsPlain = 0; + + int64_t tmCheck = sphMicroTimer(); + + ARRAY_FOREACH ( i, m_pSegments ) + { + SphWordID_t uPrevWordID = 0; + RtWordReader_t tSeg ( m_pSegments[i], false, m_iWordsCheckpoint ); + const RtWord_t * pWord = NULL; + int iWord = 0; + + while ( ( pWord = tSeg.UnzipWord() )!=NULL ) + { + if ( pWord->m_uWordID<=uPrevWordID ) + { + LOC_FAIL(( fp, "wordid decreased (segment=%d, word=%d, wordid="UINT64_FMT", previd="UINT64_FMT")", + i, iWord, (uint64_t)pWord->m_uWordID, (uint64_t)uPrevWordID )); + } + uPrevWordID = pWord->m_uWordID; + iWord++; + } + } + ARRAY_FOREACH ( i, m_pDiskChunks ) { fprintf ( fp, "checking disk chunk %d(%d)...\n", i, m_pDiskChunks.GetLength() ); - iFails += m_pDiskChunks[i]->DebugCheck ( fp ); + iFailsPlain += m_pDiskChunks[i]->DebugCheck ( fp ); } - return iFails; + tmCheck = sphMicroTimer() - tmCheck; + if ( ( iFails+iFailsPlain )==0 ) + fprintf ( fp, "check passed" ); + else if ( iFails!=iFailsPrinted ) + fprintf ( fp, "check FAILED, %d of %d failures reported", iFailsPrinted, iFails+iFailsPlain ); + else + fprintf ( fp, "check FAILED, %d failures reported", iFails+iFailsPlain ); + + fprintf ( fp, ", %d.%d sec elapsed\n", (int)(tmCheck/1000000), (int)((tmCheck/100000)%10) ); + + return iFails + iFailsPlain; } void RtIndex_t::SetEnableStar ( bool bEnableStar ) @@ -3854,9 +3869,6 @@ if ( pCtx->m_bLookupFilter || pCtx->m_bLookupSort ) CopyDocinfo ( tMatch, FindDocinfo ( (RtSegment_t*)pCtx->m_pIndexData, tMatch.m_iDocID ) ); - ARRAY_FOREACH ( i, m_dDynamize ) - tMatch.SetAttr ( m_dDynamize[i].m_tTo, tMatch.GetAttr ( m_dDynamize[i].m_tFrom ) ); - pCtx->CalcFilter ( tMatch ); return pCtx->m_pFilter ? !pCtx->m_pFilter->Eval ( tMatch ) : false; } @@ -3967,9 +3979,18 @@ const RtWord_t * pWord = NULL; while ( ( pWord = tReader.UnzipWord() )!=NULL ) { - int64_t iCmp = ( bWordDict - ? sphDictCmpStrictly ( (const char *)pWord->m_sWord+1, pWord->m_sWord[0], sWord, iWordLen ) - : ( pWord->m_uWordIDm_uWordID-uWordID ) ); + int iCmp = 0; + if ( bWordDict ) + { + iCmp = sphDictCmpStrictly ( (const char *)pWord->m_sWord+1, pWord->m_sWord[0], sWord, iWordLen ); + } else + { + if ( pWord->m_uWordIDm_uWordID>uWordID ) + iCmp = 1; + } + if ( iCmp==0 ) { pQword->m_iDocs += pWord->m_uDocs; @@ -4216,6 +4237,9 @@ CSphVector dWrongWords; SmallStringHash_T hDiskStats; + int64_t tmMaxTimer = 0; + if ( pQuery->m_uMaxQueryMsec>0 ) + tmMaxTimer = sphMicroTimer() + pQuery->m_uMaxQueryMsec*1000; // max_query_time assert ( dExtra.GetLength()==m_pDiskChunks.GetLength() ); CSphVector dDiskStrings ( m_pDiskChunks.GetLength() ); @@ -4265,6 +4289,12 @@ // keep last chunk statistics to check vs rt settings if ( iChunk==m_pDiskChunks.GetLength()-1 ) hDiskStats = hSrcStats; + + if ( (iChunk+1)!=m_pDiskChunks.GetLength() && tmMaxTimer>0 && sphMicroTimer()>=tmMaxTimer ) + { + pResult->m_sWarning = "query time exceeded max_query_time"; + break; + } } if ( m_bKlistLocked ) @@ -4307,11 +4337,11 @@ int iIndexWeight = pQuery->GetIndexWeight ( m_sIndexName.cstr() ); // bind weights - tCtx.BindWeights ( pQuery, m_tOutboundSchema, iIndexWeight ); + tCtx.BindWeights ( pQuery, m_tSchema, iIndexWeight ); // parse query XQQuery_t tParsed; - if ( !sphParseExtendedQuery ( tParsed, pQuery->m_sQuery.cstr(), pTokenizer.Ptr(), &m_tOutboundSchema, pDict, m_tSettings.m_iStopwordStep ) ) + if ( !sphParseExtendedQuery ( tParsed, pQuery->m_sQuery.cstr(), pTokenizer.Ptr(), &m_tSchema, pDict, m_tSettings.m_iStopwordStep ) ) { pResult->m_sError = tParsed.m_sParseError; m_tRwlock.Unlock (); @@ -4386,6 +4416,8 @@ return true; } + // search segments no looking to max_query_time + // FIXME!!! move searching at segments before disk chunks as result set is safe with kill-lists if ( m_pSegments.GetLength() ) { // setup filters @@ -4448,8 +4480,6 @@ tMatch.m_iDocID = DOCINFO2ID(pRow); tMatch.m_pStatic = DOCINFO2ATTRS(pRow); // FIXME! overrides - ARRAY_FOREACH ( j, m_dDynamize ) - tMatch.SetAttr ( m_dDynamize[j].m_tTo, tMatch.GetAttr ( m_dDynamize[j].m_tFrom ) ); tCtx.CalcFilter ( tMatch ); if ( tCtx.m_pFilter && !tCtx.m_pFilter->Eval ( tMatch ) ) @@ -4509,9 +4539,6 @@ if ( tCtx.m_bLookupSort ) CopyDocinfo ( pMatch[i], FindDocinfo ( m_pSegments[iSeg], pMatch[i].m_iDocID ) ); - ARRAY_FOREACH ( j, m_dDynamize ) - pMatch[i].SetAttr ( m_dDynamize[j].m_tTo, pMatch[i].GetAttr ( m_dDynamize[j].m_tFrom ) ); - tCtx.CalcSort ( pMatch[i] ); tCtx.CalcFinal ( pMatch[i] ); // OPTIMIZE? could be possibly done later @@ -4547,9 +4574,34 @@ // coping match's attributes to external storage in result set ////////////////////// + CSphVector dStringGetLoc; + CSphVector dStringSetLoc; + CSphVector dMvaGetLoc; + CSphVector dMvaSetLoc; + for ( int i=0; im_tSchema.GetAttrsCount(); i++ ) + { + const CSphColumnInfo & tSetInfo = pResult->m_tSchema.GetAttr(i); + if ( tSetInfo.m_eAttrType==SPH_ATTR_STRING ) + { + const int iInLocator = m_tSchema.GetAttrIndex ( tSetInfo.m_sName.cstr() ); + assert ( iInLocator>=0 ); + + dStringGetLoc.Add ( m_tSchema.GetAttr ( iInLocator ).m_tLocator ); + dStringSetLoc.Add ( tSetInfo.m_tLocator ); + } else if ( tSetInfo.m_eAttrType==SPH_ATTR_UINT32SET || tSetInfo.m_eAttrType==SPH_ATTR_UINT64SET ) + { + const int iInLocator = m_tSchema.GetAttrIndex ( tSetInfo.m_sName.cstr() ); + assert ( iInLocator>=0 ); + + dMvaGetLoc.Add ( m_tSchema.GetAttr ( iInLocator ).m_tLocator ); + dMvaSetLoc.Add ( tSetInfo.m_tLocator ); + } + } + + bool bHasArenaAttrs = ( dStringSetLoc.GetLength()>0 || dMvaSetLoc.GetLength()>0 ); const int iSegmentsTotal = m_pSegments.GetLength(); - const int iStaticSize = m_tSchema.GetStaticSize() + DWSIZEOF ( SphDocID_t ); - if ( iStaticSize>0 && iSegmentsTotal>0 ) + bool bSegmentMatchesFixup = ( m_tSchema.GetStaticSize()>0 && iSegmentsTotal>0 ); + if ( bSegmentMatchesFixup || bHasArenaAttrs ) { MEMORY ( SPH_MEM_IDX_RT_RES_MATCHES ); @@ -4566,6 +4618,12 @@ const CSphMatch * pMatches = pSorter->Finalize(); const int iMatchesCount = pSorter->GetLength(); + if ( bHasArenaAttrs ) + { + iFixupCount += iMatchesCount; + continue; + } + for ( int i=0; i0 ) + if ( iFixupCount>0 || bHasArenaAttrs ) { + const int iStaticSize = m_tSchema.GetStaticSize() + DWSIZEOF ( SphDocID_t ); CSphRowitem * pAttr = new CSphRowitem [ iFixupCount * iStaticSize ]; pResult->m_dStorage2Free.Add ( (BYTE*)pAttr ); #ifndef NDEBUG @@ -4592,7 +4651,7 @@ for ( int i=0; i=0 && iMatchSegment< iSegmentsTotal ) + if ( ( iMatchSegment>=0 && iMatchSegment< iSegmentsTotal ) || bHasArenaAttrs ) { assert ( pAttr+iStaticSize<=pEnd ); @@ -4613,33 +4672,7 @@ MEMORY ( SPH_MEM_IDX_RT_RES_STRINGS ); - CSphVector dStringGetLoc; - CSphVector dStringSetLoc; - CSphVector dMvaGetLoc; - CSphVector dMvaSetLoc; - for ( int i=0; im_tSchema.GetAttrsCount(); i++ ) - { - const CSphColumnInfo & tSetInfo = pResult->m_tSchema.GetAttr(i); - if ( tSetInfo.m_eAttrType==SPH_ATTR_STRING ) - { - const int iInLocator = m_tSchema.GetAttrIndex ( tSetInfo.m_sName.cstr() ); - assert ( iInLocator>=0 ); - - dStringGetLoc.Add ( m_tSchema.GetAttr ( iInLocator ).m_tLocator ); - dStringSetLoc.Add ( tSetInfo.m_tLocator ); - } else if ( tSetInfo.m_eAttrType==SPH_ATTR_UINT32SET || tSetInfo.m_eAttrType==SPH_ATTR_UINT64SET ) - { - const int iInLocator = m_tSchema.GetAttrIndex ( tSetInfo.m_sName.cstr() ); - assert ( iInLocator>=0 ); - - dMvaGetLoc.Add ( m_tSchema.GetAttr ( iInLocator ).m_tLocator ); - dMvaSetLoc.Add ( tSetInfo.m_tLocator ); - } - - assert ( ( tSetInfo.m_eAttrType!=SPH_ATTR_STRING && tSetInfo.m_eAttrType!=SPH_ATTR_UINT32SET && tSetInfo.m_eAttrType!=SPH_ATTR_UINT64SET ) - || tSetInfo.m_tLocator.m_bDynamic ); - } - if ( dStringGetLoc.GetLength() || dMvaGetLoc.GetLength() ) + if ( bHasArenaAttrs ) { assert ( !pResult->m_pStrings && !pResult->m_pMva ); CSphTightVector dStorageString; @@ -4660,7 +4693,6 @@ const int iSegCount = m_pSegments.GetLength(); assert ( tMatch.m_iTag>=1 && tMatch.m_iTag0 ) // have to fix up only existed attribute { assert ( uOff<( I64C(1)<<32 ) ); // should be 32 bit offset assert ( !bSegmentMatch || (int)uOffm_dStrings.GetLength() ); - DWORD uAttr = CopyPackedString ( pBaseString + uOff, dStorageString ); - tMatch.SetAttr ( dStringSetLoc[i], uAttr ); - - } else - { - tMatch.SetAttr ( dStringSetLoc[i], 0 ); + uAttr = CopyPackedString ( pBaseString + uOff, dStorageString ); } + + const CSphAttrLocator & tSet = dStringSetLoc[i]; + assert ( !tSet.m_bDynamic || tSet.GetMaxRowitem() < (int)tMatch.m_pDynamic[-1] ); + sphSetRowAttr ( tSet.m_bDynamic ? tMatch.m_pDynamic : const_cast( tMatch.m_pStatic ), tSet, uAttr ); } - bool bIdSet = false; ARRAY_FOREACH ( i, dMvaGetLoc ) { + DWORD uAttr = 0; const SphAttr_t uOff = tMatch.GetAttr ( dMvaGetLoc[i] ); if ( uOff>0 ) // have to fix up only existed attribute { assert ( uOff<( I64C(1)<<32 ) ); // should be 32 bit offset assert ( !bSegmentMatch || (int)uOffm_dMvas.GetLength() ); - if ( !bIdSet ) - { - CopyDocid ( tMatch.m_iDocID, dStorageMva ); - bIdSet = true; - } - - DWORD uAttr = CopyMva ( pBaseMva + uOff, dStorageMva ); - tMatch.SetAttr ( dMvaSetLoc[i], uAttr ); - } else - { - tMatch.SetAttr ( dMvaSetLoc[i], 0 ); + uAttr = CopyMva ( pBaseMva + uOff, dStorageMva ); } + + const CSphAttrLocator & tSet = dMvaSetLoc[i]; + assert ( !tSet.m_bDynamic || tSet.GetMaxRowitem() < (int)tMatch.m_pDynamic[-1] ); + sphSetRowAttr ( tSet.m_bDynamic ? tMatch.m_pDynamic : const_cast( tMatch.m_pStatic ), tSet, uAttr ); } } } @@ -4917,6 +4943,8 @@ return true; } + m_tRwlock.ReadLock(); + // do the update int iUpdated = 0; DWORD uUpdateMask = 0; @@ -5066,7 +5094,9 @@ // bump the counter, binlog the update! assert ( iIndex<0 ); - g_pBinlog->BinlogUpdateAttributes ( m_sIndexName.cstr(), ++m_iTID, tUpd ); + g_pBinlog->BinlogUpdateAttributes ( &m_iTID, m_sIndexName.cstr(), tUpd ); + + m_tRwlock.Unlock(); // all done return iUpdated; @@ -5125,9 +5155,7 @@ // copy schema from chunk0 schema m_tSchema = pIndex->GetMatchSchema(); - m_tOutboundSchema = m_tSchema; m_tStats = pIndex->GetStats(); - ComputeOutboundSchema(); m_iStride = DOCINFO_IDSIZE + m_tSchema.GetRowSize(); // copy tokenizer, dict etc settings from chunk0 @@ -5373,7 +5401,7 @@ } -void RtBinlog_c::BinlogCommit ( const char * sIndexName, int64_t iTID, const RtSegment_t * pSeg, const CSphVector & dKlist, bool bKeywordDict ) +void RtBinlog_c::BinlogCommit ( int64_t * pTID, const char * sIndexName, const RtSegment_t * pSeg, const CSphVector & dKlist, bool bKeywordDict ) { if ( m_bReplayMode || m_bDisabled ) return; @@ -5381,6 +5409,7 @@ MEMORY ( SPH_MEM_BINLOG ); Verify ( m_tWriteLock.Lock() ); + int64_t iTID = ++(*pTID); const int64_t tmNow = sphMicroTimer(); const int uIndex = GetWriteIndexID ( sIndexName, iTID, tmNow ); @@ -5436,7 +5465,7 @@ Verify ( m_tWriteLock.Unlock() ); } -void RtBinlog_c::BinlogUpdateAttributes ( const char * sIndexName, int64_t iTID, const CSphAttrUpdate & tUpd ) +void RtBinlog_c::BinlogUpdateAttributes ( int64_t * pTID, const char * sIndexName, const CSphAttrUpdate & tUpd ) { if ( m_bReplayMode || m_bDisabled ) return; @@ -5444,6 +5473,7 @@ MEMORY ( SPH_MEM_BINLOG ); Verify ( m_tWriteLock.Lock() ); + int64_t iTID = ++(*pTID); const int64_t tmNow = sphMicroTimer(); const int uIndex = GetWriteIndexID ( sIndexName, iTID, tmNow ); @@ -6128,7 +6158,7 @@ tIndex.m_sName.cstr(), tIndex.m_pRT->m_iTID, iTID, iTxnPos ); // cook checkpoint in case dict=keywords - if ( tIndex.m_pRT->IsWordDict() ) + if ( tIndex.m_pRT->IsWordDict() && pSeg.Ptr() ) FixupSegmentCheckpoints ( pSeg.Ptr() ); // actually replay @@ -6414,5 +6444,5 @@ } // -// $Id: sphinxrt.cpp 3017 2011-11-15 22:22:49Z shodan $ +// $Id: sphinxrt.cpp 3128 2012-03-01 01:44:34Z shodan $ // diff -Nru sphinxsearch-0.9.9+2.0.2beta/src/sphinxrt.h sphinxsearch-2.0.4/src/sphinxrt.h --- sphinxsearch-0.9.9+2.0.2beta/src/sphinxrt.h 2011-09-11 23:24:14.000000000 +0000 +++ sphinxsearch-2.0.4/src/sphinxrt.h 2012-02-28 15:39:55.000000000 +0000 @@ -1,10 +1,10 @@ // -// $Id: sphinxrt.h 2948 2011-09-11 23:24:14Z tomat $ +// $Id: sphinxrt.h 3125 2012-02-28 15:39:55Z shodan $ // // -// Copyright (c) 2001-2011, Andrew Aksyonoff -// Copyright (c) 2008-2011, Sphinx Technologies Inc +// Copyright (c) 2001-2012, Andrew Aksyonoff +// Copyright (c) 2008-2012, Sphinx Technologies Inc // All rights reserved // // This program is free software; you can redistribute it and/or modify @@ -46,15 +46,15 @@ /// undo pending changes virtual void RollBack () = 0; - /// dump index data to disk - virtual void DumpToDisk ( const char * sFilename ) = 0; - /// check and periodically flush RAM chunk to disk virtual void CheckRamFlush () = 0; /// forcibly flush RAM chunk to disk virtual void ForceRamFlush ( bool bPeriodic=false ) = 0; + /// forcibly save RAM chunk as a new disk chunk + virtual void ForceDiskChunk () = 0; + /// attach a disk chunk to current index virtual bool AttachDiskIndex ( CSphIndex * pIndex, CSphString & sError ) = 0; }; @@ -89,5 +89,5 @@ #endif // _sphinxrt_ // -// $Id: sphinxrt.h 2948 2011-09-11 23:24:14Z tomat $ +// $Id: sphinxrt.h 3125 2012-02-28 15:39:55Z shodan $ // diff -Nru sphinxsearch-0.9.9+2.0.2beta/src/sphinxsearch.cpp sphinxsearch-2.0.4/src/sphinxsearch.cpp --- sphinxsearch-0.9.9+2.0.2beta/src/sphinxsearch.cpp 2011-11-13 12:36:32.000000000 +0000 +++ sphinxsearch-2.0.4/src/sphinxsearch.cpp 2012-02-20 15:08:34.000000000 +0000 @@ -1,10 +1,10 @@ // -// $Id: sphinxsearch.cpp 3008 2011-11-13 12:36:32Z klirichek $ +// $Id: sphinxsearch.cpp 3111 2012-02-20 15:08:34Z klirichek $ // // -// Copyright (c) 2001-2011, Andrew Aksyonoff -// Copyright (c) 2008-2011, Sphinx Technologies Inc +// Copyright (c) 2001-2012, Andrew Aksyonoff +// Copyright (c) 2008-2012, Sphinx Technologies Inc // All rights reserved // // This program is free software; you can redistribute it and/or modify @@ -240,6 +240,46 @@ DWORD m_uFieldPos; }; +////////////////////////////////////////////////////////////////////////// + +/// per-document zone information (span start/end positions) +struct ZoneInfo_t +{ + CSphVector m_dStarts; + CSphVector m_dEnds; +}; + + +/// zone hash key, zoneid+docid +struct ZoneKey_t +{ + int m_iZone; + SphDocID_t m_uDocid; + + explicit ZoneKey_t ( int iZone=0, SphDocID_t uDocid=0 ) + : m_iZone ( iZone ) + , m_uDocid ( uDocid ) + {} + + bool operator == ( const ZoneKey_t & rhs ) const + { + return m_iZone==rhs.m_iZone && m_uDocid==rhs.m_uDocid; + } +}; + + +/// zone hashing function +struct ZoneHash_fn +{ + static inline int Hash ( const ZoneKey_t & tKey ) + { + return (DWORD)tKey.m_uDocid ^ ( tKey.m_iZone<<16 ); + } +}; + + +/// zone hash +typedef CSphOrderedHash < ZoneInfo_t, ZoneKey_t, ZoneHash_fn, 4096 > ZoneHash_c; /// single keyword streamer, with term position filtering template < TermPosFilter_e T > @@ -693,41 +733,7 @@ const ExtHit_t * m_pDotHit; ///< current in-chunk ptr }; -////////////////////////////////////////////////////////////////////////// - -/// per-document zone information (span start/end positions) -struct ZoneInfo_t -{ - CSphVector m_dStarts; - CSphVector m_dEnds; -}; - - -/// zone hash key, zoneid+docid -struct ZoneKey_t -{ - int m_iZone; - SphDocID_t m_uDocid; - - bool operator == ( const ZoneKey_t & rhs ) const - { - return m_iZone==rhs.m_iZone && m_uDocid==rhs.m_uDocid; - } -}; - -/// zone hashing function -struct ZoneHash_fn -{ - static inline int Hash ( const ZoneKey_t & tKey ) - { - return (DWORD)tKey.m_uDocid ^ ( tKey.m_iZone<<16 ); - } -}; - - -/// zone hash -typedef CSphOrderedHash < ZoneInfo_t, ZoneKey_t, ZoneHash_fn, 4096 > ZoneHash_c; /// ranker interface @@ -1072,17 +1078,17 @@ { assert ( pQword ); - if ( pNode->m_iFieldMaxPos ) + if ( pNode->m_dSpec.m_iFieldMaxPos ) pQword->m_iTermPos = TERM_POS_FIELD_LIMIT; - if ( pNode->m_dZones.GetLength() ) + if ( pNode->m_dSpec.m_dZones.GetLength() ) pQword->m_iTermPos = TERM_POS_ZONES; if ( !pQword->m_bHasHitlist ) { if ( tSetup.m_pWarning && pQword->m_iTermPos ) tSetup.m_pWarning->SetSprintf ( "hitlist unavailable, position limit ignored" ); - return new ExtTermHitless_c ( pQword, pNode->m_dFieldMask, tSetup, pNode->m_bNotWeighted ); + return new ExtTermHitless_c ( pQword, pNode->m_dSpec.m_dFieldMask, tSetup, pNode->m_bNotWeighted ); } switch ( pQword->m_iTermPos ) { @@ -1091,7 +1097,7 @@ case TERM_POS_FIELD_END: return new ExtTermPos_c ( pQword, pNode, tSetup ); case TERM_POS_FIELD_LIMIT: return new ExtTermPos_c ( pQword, pNode, tSetup ); case TERM_POS_ZONES: return new ExtTermPos_c ( pQword, pNode, tSetup ); - default: return new ExtTerm_c ( pQword, pNode->m_dFieldMask, tSetup, pNode->m_bNotWeighted ); + default: return new ExtTerm_c ( pQword, pNode->m_dSpec.m_dFieldMask, tSetup, pNode->m_bNotWeighted ); } } @@ -1230,8 +1236,8 @@ case SPH_QUERY_OR: pCur = new ExtOr_c ( pCur, pNext, tSetup ); break; case SPH_QUERY_AND: pCur = new ExtAnd_c ( pCur, pNext, tSetup ); break; case SPH_QUERY_ANDNOT: pCur = new ExtAndNot_c ( pCur, pNext, tSetup ); break; - case SPH_QUERY_SENTENCE: pCur = new ExtUnit_c ( pCur, pNext, pNode->m_dFieldMask, tSetup, MAGIC_WORD_SENTENCE ); break; - case SPH_QUERY_PARAGRAPH: pCur = new ExtUnit_c ( pCur, pNext, pNode->m_dFieldMask, tSetup, MAGIC_WORD_PARAGRAPH ); break; + case SPH_QUERY_SENTENCE: pCur = new ExtUnit_c ( pCur, pNext, pNode->m_dSpec.m_dFieldMask, tSetup, MAGIC_WORD_SENTENCE ); break; + case SPH_QUERY_PARAGRAPH: pCur = new ExtUnit_c ( pCur, pNext, pNode->m_dSpec.m_dFieldMask, tSetup, MAGIC_WORD_PARAGRAPH ); break; default: assert ( 0 && "internal error: unhandled op in ExtNode_i::Create()" ); break; } } @@ -1561,8 +1567,8 @@ template < TermPosFilter_e T > ExtTermPos_c::ExtTermPos_c ( ISphQword * pQword, const XQNode_t * pNode, const ISphQwordSetup & tSetup ) - : ExtTerm_c ( pQword, pNode->m_dFieldMask, tSetup, pNode->m_bNotWeighted ) - , m_iMaxFieldPos ( pNode->m_iFieldMaxPos ) + : ExtTerm_c ( pQword, pNode->m_dSpec.m_dFieldMask, tSetup, pNode->m_bNotWeighted ) + , m_iMaxFieldPos ( pNode->m_dSpec.m_iFieldMaxPos ) , m_uTermMaxID ( 0 ) , m_pRawDocs ( NULL ) , m_pRawDoc ( NULL ) @@ -1571,7 +1577,7 @@ , m_eState ( COPY_DONE ) , m_uDoneFor ( 0 ) , m_pZoneChecker ( tSetup.m_pZoneChecker ) - , m_dZones ( pNode->m_dZones ) + , m_dZones ( pNode->m_dSpec.m_dZones ) , m_uLastZonedId ( 0 ) , m_iCheckFrom ( 0 ) { @@ -1649,9 +1655,9 @@ Swap ( m_dZones[i], m_dZones[m_iCheckFrom] ); m_iCheckFrom++; break; - default: - break; - } + default: + break; + } } return false; } @@ -3803,7 +3809,7 @@ { // we have a match! // copy hits until next dot - if ( !SkipHitsLtePos ( &m_pDotHit, m_pDotHit->m_uHitpos, m_pDot, m_pDotDocs ) ) + if ( !SkipHitsLtePos ( &m_pDotHit, uMax, m_pDot, m_pDotDocs ) ) uSentenceEnd = UINT_MAX; // correction, no next dot, so make it "next document" else uSentenceEnd = m_pDotHit->m_uHitpos; @@ -4141,10 +4147,7 @@ if ( uMinDocid==DOCID_MAX ) continue; - ZoneKey_t tZoneStart; - tZoneStart.m_iZone = i; - tZoneStart.m_uDocid = uMinDocid; - Verify ( m_hZoneInfo.IterateStart ( tZoneStart ) ); + Verify ( m_hZoneInfo.IterateStart ( ZoneKey_t ( i, uMinDocid ) ) ); uMinDocid = DOCID_MAX; do { @@ -4188,10 +4191,7 @@ SphZoneHit_e ExtRanker_c::IsInZone ( int iZone, const ExtHit_t * pHit ) { // quick route, we have current docid cached - ZoneKey_t tKey; // OPTIMIZE? allow 2-component hash keys maybe? - tKey.m_uDocid = pHit->m_uDocid; - tKey.m_iZone = iZone; - + ZoneKey_t tKey ( iZone, pHit->m_uDocid ); // OPTIMIZE? allow 2-component hash keys maybe? ZoneInfo_t * pZone = m_hZoneInfo ( tKey ); if ( pZone ) { @@ -4329,8 +4329,7 @@ SphDocID_t uCur = pStartHits->m_uDocid; tKey.m_uDocid = uCur; - m_hZoneInfo.Add ( ZoneInfo_t(), tKey ); - pZone = m_hZoneInfo ( tKey ); // OPTIMIZE? return pointer from Add()? + pZone = m_hZoneInfo.AddUnique ( ZoneInfo_t(), tKey ); // load all the start hits for it while ( pStartHits ) @@ -6092,5 +6091,5 @@ } // -// $Id: sphinxsearch.cpp 3008 2011-11-13 12:36:32Z klirichek $ +// $Id: sphinxsearch.cpp 3111 2012-02-20 15:08:34Z klirichek $ // diff -Nru sphinxsearch-0.9.9+2.0.2beta/src/sphinxsearch.h sphinxsearch-2.0.4/src/sphinxsearch.h --- sphinxsearch-0.9.9+2.0.2beta/src/sphinxsearch.h 2011-10-23 13:23:17.000000000 +0000 +++ sphinxsearch-2.0.4/src/sphinxsearch.h 2012-01-30 23:07:35.000000000 +0000 @@ -1,10 +1,10 @@ // -// $Id: sphinxsearch.h 2990 2011-10-23 13:23:17Z klirichek $ +// $Id: sphinxsearch.h 3087 2012-01-30 23:07:35Z shodan $ // // -// Copyright (c) 2001-2011, Andrew Aksyonoff -// Copyright (c) 2008-2011, Sphinx Technologies Inc +// Copyright (c) 2001-2012, Andrew Aksyonoff +// Copyright (c) 2008-2012, Sphinx Technologies Inc // All rights reserved // // This program is free software; you can redistribute it and/or modify @@ -198,5 +198,5 @@ #endif // _sphinxsearch_ // -// $Id: sphinxsearch.h 2990 2011-10-23 13:23:17Z klirichek $ +// $Id: sphinxsearch.h 3087 2012-01-30 23:07:35Z shodan $ // diff -Nru sphinxsearch-0.9.9+2.0.2beta/src/sphinxselect.y sphinxsearch-2.0.4/src/sphinxselect.y --- sphinxsearch-0.9.9+2.0.2beta/src/sphinxselect.y 2011-06-02 04:33:13.000000000 +0000 +++ sphinxsearch-2.0.4/src/sphinxselect.y 2012-02-07 01:46:52.000000000 +0000 @@ -26,8 +26,12 @@ %token TOK_GTE %token TOK_EQ %token TOK_NE +%token TOK_CONST_STRING -%left TOK_AND TOK_OR +%left TOK_OR +%left TOK_AND +%left '|' +%left '&' %left TOK_EQ TOK_NE %left '<' '>' TOK_LTE TOK_GTE %left '+' '-' @@ -75,6 +79,8 @@ | expr '/' expr { $$ = $1; $$.m_iEnd = $3.m_iEnd; } | expr '<' expr { $$ = $1; $$.m_iEnd = $3.m_iEnd; } | expr '>' expr { $$ = $1; $$.m_iEnd = $3.m_iEnd; } + | expr '|' expr { $$ = $1; $$.m_iEnd = $3.m_iEnd; } + | expr '&' expr { $$ = $1; $$.m_iEnd = $3.m_iEnd; } | expr TOK_LTE expr { $$ = $1; $$.m_iEnd = $3.m_iEnd; } | expr TOK_GTE expr { $$ = $1; $$.m_iEnd = $3.m_iEnd; } | expr TOK_EQ expr { $$ = $1; $$.m_iEnd = $3.m_iEnd; } @@ -97,8 +103,13 @@ ; arglist: + arg + | arglist ',' arg + ; + +arg: expr - | arglist ',' expr + | TOK_CONST_STRING ; diff -Nru sphinxsearch-0.9.9+2.0.2beta/src/sphinxsort.cpp sphinxsearch-2.0.4/src/sphinxsort.cpp --- sphinxsearch-0.9.9+2.0.2beta/src/sphinxsort.cpp 2011-09-30 12:54:17.000000000 +0000 +++ sphinxsearch-2.0.4/src/sphinxsort.cpp 2012-01-30 23:07:35.000000000 +0000 @@ -1,10 +1,10 @@ // -// $Id: sphinxsort.cpp 2975 2011-09-30 12:54:17Z tomat $ +// $Id: sphinxsort.cpp 3087 2012-01-30 23:07:35Z shodan $ // // -// Copyright (c) 2001-2011, Andrew Aksyonoff -// Copyright (c) 2008-2011, Sphinx Technologies Inc +// Copyright (c) 2001-2012, Andrew Aksyonoff +// Copyright (c) 2008-2012, Sphinx Technologies Inc // All rights reserved // // This program is free software; you can redistribute it and/or modify @@ -2246,32 +2246,6 @@ return ( dAttrs.GetLength()>0 ); } - -void sphSortRemoveInternalAttrs ( CSphSchema & tSchema ) -{ - int iAttrCount = tSchema.GetAttrsCount(); - // internal attributes last - if ( !tSchema.GetAttrsCount() || !tSchema.GetAttr ( iAttrCount-1 ).m_sName.Begins( g_sIntAttrPrefix ) ) - return; - - // save needed attributes - CSphVector dAttrs ( iAttrCount ); - dAttrs.Resize ( 0 ); - for ( int i=0; i=0 ) + return iHeight; + else + return -iHeight; +} + + int sphMyStackSize () { #if USE_WINDOWS @@ -1304,5 +1319,5 @@ #endif // -// $Id: sphinxstd.cpp 3008 2011-11-13 12:36:32Z klirichek $ +// $Id: sphinxstd.cpp 3130 2012-03-01 07:43:56Z tomat $ // diff -Nru sphinxsearch-0.9.9+2.0.2beta/src/sphinxstd.h sphinxsearch-2.0.4/src/sphinxstd.h --- sphinxsearch-0.9.9+2.0.2beta/src/sphinxstd.h 2011-11-13 12:36:32.000000000 +0000 +++ sphinxsearch-2.0.4/src/sphinxstd.h 2012-03-01 07:18:52.000000000 +0000 @@ -1,10 +1,10 @@ // -// $Id: sphinxstd.h 3008 2011-11-13 12:36:32Z klirichek $ +// $Id: sphinxstd.h 3129 2012-03-01 07:18:52Z tomat $ // // -// Copyright (c) 2001-2011, Andrew Aksyonoff -// Copyright (c) 2008-2011, Sphinx Technologies Inc +// Copyright (c) 2001-2012, Andrew Aksyonoff +// Copyright (c) 2008-2012, Sphinx Technologies Inc // All rights reserved // // This program is free software; you can redistribute it and/or modify @@ -1207,6 +1207,53 @@ return true; } + /// add new entry + /// returns the pointer to just inserted or previously cached (if dupe) value + T* AddUnique ( const T & tValue, const KEY & tKey ) + { + unsigned int uHash = ( (unsigned int) HASHFUNC::Hash ( tKey ) ) % LENGTH; + + // check if this key is already hashed + HashEntry_t * pEntry = m_dHash [ uHash ]; + HashEntry_t ** ppEntry = &m_dHash [ uHash ]; + while ( pEntry ) + { + if ( pEntry->m_tKey==tKey ) + return &pEntry->m_tValue; + + ppEntry = &pEntry->m_pNextByHash; + pEntry = pEntry->m_pNextByHash; + } + + // it's not; let's add the entry + assert ( !pEntry ); + assert ( !*ppEntry ); + + pEntry = new HashEntry_t; + pEntry->m_tKey = tKey; + pEntry->m_tValue = tValue; + pEntry->m_pNextByHash = NULL; + pEntry->m_pPrevByOrder = NULL; + pEntry->m_pNextByOrder = NULL; + + *ppEntry = pEntry; + + if ( !m_pFirstByOrder ) + m_pFirstByOrder = pEntry; + + if ( m_pLastByOrder ) + { + assert ( !m_pLastByOrder->m_pNextByOrder ); + assert ( !pEntry->m_pNextByOrder ); + m_pLastByOrder->m_pNextByOrder = pEntry; + pEntry->m_pPrevByOrder = m_pLastByOrder; + } + m_pLastByOrder = pEntry; + + m_iLength++; + return &pEntry->m_tValue; + } + /// delete an entry bool Delete ( const KEY & tKey ) { @@ -1649,8 +1696,8 @@ /// ctor from C string CSphVariant ( const char * sString ) // NOLINT desired implicit conversion : CSphString ( sString ) - , m_iValue ( atoi ( m_sValue ) ) - , m_fValue ( (float)atof ( m_sValue ) ) + , m_iValue ( m_sValue ? atoi ( m_sValue ) : 0 ) + , m_fValue ( m_sValue ? (float)atof ( m_sValue ) : 0.0f ) , m_pNext ( NULL ) { } @@ -1733,6 +1780,7 @@ ////////////////////////////////////////////////////////////////////////// /// refcounted base +/// WARNING, FOR SINGLE-THREADED USE ONLY struct ISphRefcounted : public ISphNoncopyable { protected: @@ -1749,11 +1797,13 @@ /// automatic pointer wrapper for refcounted objects +/// construction from or assignment of a raw pointer takes over (!) the ownership template < typename T > class CSphRefcountedPtr { public: - explicit CSphRefcountedPtr ( T * pPtr ) { m_pPtr = pPtr; } + explicit CSphRefcountedPtr () { m_pPtr = NULL; } ///< default NULL wrapper construction (for vectors) + explicit CSphRefcountedPtr ( T * pPtr ) { m_pPtr = pPtr; } ///< construction from raw pointer, takes over ownership! ~CSphRefcountedPtr () { if ( m_pPtr ) m_pPtr->Release(); } T * Ptr () const { return m_pPtr; } @@ -1761,8 +1811,25 @@ bool operator ! () const { return m_pPtr==NULL; } public: - CSphRefcountedPtr & operator = ( T * pPtr ) { if ( m_pPtr ) m_pPtr->Release(); m_pPtr = pPtr; return *this; } - CSphRefcountedPtr & operator = ( const CSphRefcountedPtr & rhs ) { if ( rhs.m_pPtr ) rhs.m_pPtr->AddRef(); if ( m_pPtr ) m_pPtr->Release(); m_pPtr = rhs.m_pPtr; return *this; } + /// assignment of a raw pointer, takes over ownership! + CSphRefcountedPtr & operator = ( T * pPtr ) + { + if ( m_pPtr && m_pPtr!=pPtr ) + m_pPtr->Release(); + m_pPtr = pPtr; + return *this; + } + + /// wrapper assignment, does automated reference tracking + CSphRefcountedPtr & operator = ( const CSphRefcountedPtr & rhs ) + { + if ( rhs.m_pPtr ) + rhs.m_pPtr->AddRef(); + if ( m_pPtr ) + m_pPtr->Release(); + m_pPtr = rhs.m_pPtr; + return *this; + } protected: T * m_pPtr; @@ -2035,6 +2102,9 @@ /// get the pointer to my thread's stack void * sphMyStack (); +/// get size of used stack +int64_t sphGetStackUsed(); + /// get the size of my thread's stack int sphMyStackSize (); @@ -2092,6 +2162,69 @@ }; +/// scoped mutex lock +template < typename T > +class CSphScopedLock : ISphNoncopyable +{ +public: + /// lock on creation + explicit CSphScopedLock ( T & tMutex ) + : m_tMutexRef ( tMutex ) + { + m_tMutexRef.Lock(); + } + + /// unlock on going out of scope + ~CSphScopedLock () + { + m_tMutexRef.Unlock (); + } + +protected: + T & m_tMutexRef; +}; + + +/// MT-aware refcounted base +/// mutex protected, might be slow +struct ISphRefcountedMT : public ISphNoncopyable +{ +protected: + ISphRefcountedMT () + : m_iRefCount ( 1 ) + { + m_tLock.Init(); + } + + virtual ~ISphRefcountedMT () + { + m_tLock.Done(); + } + +public: + void AddRef () const + { + m_tLock.Lock(); + m_iRefCount++; + m_tLock.Unlock(); + } + + void Release () const + { + m_tLock.Lock(); + int iRefs = --m_iRefCount; + assert ( iRefs>=0 ); + m_tLock.Unlock(); + if ( iRefs==0 ) + delete this; + } + +protected: + mutable int m_iRefCount; + mutable CSphMutex m_tLock; +}; + + /// rwlock implementation class CSphRwlock { @@ -2332,5 +2465,5 @@ #endif // _sphinxstd_ // -// $Id: sphinxstd.h 3008 2011-11-13 12:36:32Z klirichek $ +// $Id: sphinxstd.h 3129 2012-03-01 07:18:52Z tomat $ // diff -Nru sphinxsearch-0.9.9+2.0.2beta/src/sphinxstemcz.cpp sphinxsearch-2.0.4/src/sphinxstemcz.cpp --- sphinxsearch-0.9.9+2.0.2beta/src/sphinxstemcz.cpp 2011-01-01 02:33:06.000000000 +0000 +++ sphinxsearch-2.0.4/src/sphinxstemcz.cpp 2012-01-30 23:07:35.000000000 +0000 @@ -1,10 +1,10 @@ // -// $Id: sphinxstemcz.cpp 2616 2011-01-01 02:33:06Z shodan $ +// $Id: sphinxstemcz.cpp 3087 2012-01-30 23:07:35Z shodan $ // // -// Copyright (c) 2001-2011, Andrew Aksyonoff -// Copyright (c) 2008-2011, Sphinx Technologies Inc +// Copyright (c) 2001-2012, Andrew Aksyonoff +// Copyright (c) 2008-2012, Sphinx Technologies Inc // All rights reserved // // This program is free software; you can redistribute it and/or modify @@ -205,5 +205,5 @@ // -// $Id: sphinxstemcz.cpp 2616 2011-01-01 02:33:06Z shodan $ +// $Id: sphinxstemcz.cpp 3087 2012-01-30 23:07:35Z shodan $ // diff -Nru sphinxsearch-0.9.9+2.0.2beta/src/sphinxstemen.cpp sphinxsearch-2.0.4/src/sphinxstemen.cpp --- sphinxsearch-0.9.9+2.0.2beta/src/sphinxstemen.cpp 2011-02-11 22:43:13.000000000 +0000 +++ sphinxsearch-2.0.4/src/sphinxstemen.cpp 2012-01-30 23:07:35.000000000 +0000 @@ -1,10 +1,10 @@ // -// $Id: sphinxstemen.cpp 2665 2011-02-11 22:43:13Z shodan $ +// $Id: sphinxstemen.cpp 3087 2012-01-30 23:07:35Z shodan $ // // -// Copyright (c) 2001-2011, Andrew Aksyonoff -// Copyright (c) 2008-2011, Sphinx Technologies Inc +// Copyright (c) 2001-2012, Andrew Aksyonoff +// Copyright (c) 2008-2012, Sphinx Technologies Inc // All rights reserved // // This program is free software; you can redistribute it and/or modify @@ -546,5 +546,5 @@ } // -// $Id: sphinxstemen.cpp 2665 2011-02-11 22:43:13Z shodan $ +// $Id: sphinxstemen.cpp 3087 2012-01-30 23:07:35Z shodan $ // diff -Nru sphinxsearch-0.9.9+2.0.2beta/src/sphinxstem.h sphinxsearch-2.0.4/src/sphinxstem.h --- sphinxsearch-0.9.9+2.0.2beta/src/sphinxstem.h 2011-02-11 22:43:13.000000000 +0000 +++ sphinxsearch-2.0.4/src/sphinxstem.h 2012-01-30 23:07:35.000000000 +0000 @@ -1,10 +1,10 @@ // -// $Id: sphinxstem.h 2665 2011-02-11 22:43:13Z shodan $ +// $Id: sphinxstem.h 3087 2012-01-30 23:07:35Z shodan $ // // -// Copyright (c) 2001-2011, Andrew Aksyonoff -// Copyright (c) 2008-2011, Sphinx Technologies Inc +// Copyright (c) 2001-2012, Andrew Aksyonoff +// Copyright (c) 2008-2012, Sphinx Technologies Inc // All rights reserved // // This program is free software; you can redistribute it and/or modify @@ -49,5 +49,5 @@ #endif // _sphinxstem_ // -// $Id: sphinxstem.h 2665 2011-02-11 22:43:13Z shodan $ +// $Id: sphinxstem.h 3087 2012-01-30 23:07:35Z shodan $ // diff -Nru sphinxsearch-0.9.9+2.0.2beta/src/sphinxstemru.cpp sphinxsearch-2.0.4/src/sphinxstemru.cpp --- sphinxsearch-0.9.9+2.0.2beta/src/sphinxstemru.cpp 2011-01-01 02:33:06.000000000 +0000 +++ sphinxsearch-2.0.4/src/sphinxstemru.cpp 2012-01-30 23:07:35.000000000 +0000 @@ -1,10 +1,10 @@ // -// $Id: sphinxstemru.cpp 2616 2011-01-01 02:33:06Z shodan $ +// $Id: sphinxstemru.cpp 3087 2012-01-30 23:07:35Z shodan $ // // -// Copyright (c) 2001-2011, Andrew Aksyonoff -// Copyright (c) 2008-2011, Sphinx Technologies Inc +// Copyright (c) 2001-2012, Andrew Aksyonoff +// Copyright (c) 2008-2012, Sphinx Technologies Inc // All rights reserved // // This program is free software; you can redistribute it and/or modify @@ -125,5 +125,5 @@ } // -// $Id: sphinxstemru.cpp 2616 2011-01-01 02:33:06Z shodan $ +// $Id: sphinxstemru.cpp 3087 2012-01-30 23:07:35Z shodan $ // diff -Nru sphinxsearch-0.9.9+2.0.2beta/src/sphinxtimers.h sphinxsearch-2.0.4/src/sphinxtimers.h --- sphinxsearch-0.9.9+2.0.2beta/src/sphinxtimers.h 2011-01-01 02:33:06.000000000 +0000 +++ sphinxsearch-2.0.4/src/sphinxtimers.h 2012-01-30 23:07:35.000000000 +0000 @@ -1,10 +1,10 @@ // -// $Id: sphinxtimers.h 2616 2011-01-01 02:33:06Z shodan $ +// $Id: sphinxtimers.h 3087 2012-01-30 23:07:35Z shodan $ // // -// Copyright (c) 2001-2011, Andrew Aksyonoff -// Copyright (c) 2008-2011, Sphinx Technologies Inc +// Copyright (c) 2001-2012, Andrew Aksyonoff +// Copyright (c) 2008-2012, Sphinx Technologies Inc // All rights reserved // // This program is free software; you can redistribute it and/or modify @@ -34,6 +34,6 @@ DECLARE_TIMER ( debug3 ) // -// $Id: sphinxtimers.h 2616 2011-01-01 02:33:06Z shodan $ +// $Id: sphinxtimers.h 3087 2012-01-30 23:07:35Z shodan $ // diff -Nru sphinxsearch-0.9.9+2.0.2beta/src/sphinxudf.h sphinxsearch-2.0.4/src/sphinxudf.h --- sphinxsearch-0.9.9+2.0.2beta/src/sphinxudf.h 2011-01-27 20:59:49.000000000 +0000 +++ sphinxsearch-2.0.4/src/sphinxudf.h 2012-02-07 02:51:05.000000000 +0000 @@ -30,10 +30,11 @@ enum sphinx_udf_argtype { SPH_UDF_TYPE_UINT32 = 1, ///< unsigned 32-bit integer - SPH_UDF_TYPE_UINT32SET = 2, ///< sorted set of unsigned 32-bit integers, begins with a length + SPH_UDF_TYPE_UINT32SET = 2, ///< sorted set of unsigned 32-bit integers SPH_UDF_TYPE_INT64 = 3, ///< signed 64-bit integer SPH_UDF_TYPE_FLOAT = 4, ///< single-precision IEEE 754 float - SPH_UDF_TYPE_STRING = 5 ///< non-ASCIIZ string, with a separately stored length + SPH_UDF_TYPE_STRING = 5, ///< non-ASCIIZ string, with a separately stored length + SPH_UDF_TYPE_UINT64SET = 6 ///< sorted set of unsigned 64-bit integers }; /// UDF call arguments diff -Nru sphinxsearch-0.9.9+2.0.2beta/src/sphinxutils.cpp sphinxsearch-2.0.4/src/sphinxutils.cpp --- sphinxsearch-0.9.9+2.0.2beta/src/sphinxutils.cpp 2011-11-14 14:16:37.000000000 +0000 +++ sphinxsearch-2.0.4/src/sphinxutils.cpp 2012-02-19 14:13:20.000000000 +0000 @@ -1,10 +1,10 @@ // -// $Id: sphinxutils.cpp 3011 2011-11-14 14:16:37Z tomat $ +// $Id: sphinxutils.cpp 3109 2012-02-19 14:13:20Z shodan $ // // -// Copyright (c) 2001-2011, Andrew Aksyonoff -// Copyright (c) 2008-2011, Sphinx Technologies Inc +// Copyright (c) 2001-2012, Andrew Aksyonoff +// Copyright (c) 2008-2012, Sphinx Technologies Inc // All rights reserved // // This program is free software; you can redistribute it and/or modify @@ -169,6 +169,7 @@ { "xmlpipe_attr_str2ordinal", KEY_LIST, NULL }, { "xmlpipe_attr_bool", KEY_LIST, NULL }, { "xmlpipe_attr_float", KEY_LIST, NULL }, + { "xmlpipe_attr_bigint", KEY_LIST, NULL }, { "xmlpipe_attr_multi", KEY_LIST, NULL }, { "xmlpipe_attr_multi_64", KEY_LIST, NULL }, { "xmlpipe_attr_string", KEY_LIST, NULL }, @@ -1544,5 +1545,5 @@ #endif // USE_WINDOWS // -// $Id: sphinxutils.cpp 3011 2011-11-14 14:16:37Z tomat $ +// $Id: sphinxutils.cpp 3109 2012-02-19 14:13:20Z shodan $ // diff -Nru sphinxsearch-0.9.9+2.0.2beta/src/sphinxutils.h sphinxsearch-2.0.4/src/sphinxutils.h --- sphinxsearch-0.9.9+2.0.2beta/src/sphinxutils.h 2011-06-02 09:54:52.000000000 +0000 +++ sphinxsearch-2.0.4/src/sphinxutils.h 2012-01-30 23:07:35.000000000 +0000 @@ -1,10 +1,10 @@ // -// $Id: sphinxutils.h 2833 2011-06-02 09:54:52Z klirichek $ +// $Id: sphinxutils.h 3087 2012-01-30 23:07:35Z shodan $ // // -// Copyright (c) 2001-2011, Andrew Aksyonoff -// Copyright (c) 2008-2011, Sphinx Technologies Inc +// Copyright (c) 2001-2012, Andrew Aksyonoff +// Copyright (c) 2008-2012, Sphinx Technologies Inc // All rights reserved // // This program is free software; you can redistribute it and/or modify @@ -219,5 +219,5 @@ #endif // _sphinxutils_ // -// $Id: sphinxutils.h 2833 2011-06-02 09:54:52Z klirichek $ +// $Id: sphinxutils.h 3087 2012-01-30 23:07:35Z shodan $ // diff -Nru sphinxsearch-0.9.9+2.0.2beta/src/sphinxversion.h sphinxsearch-2.0.4/src/sphinxversion.h --- sphinxsearch-0.9.9+2.0.2beta/src/sphinxversion.h 2011-11-16 10:13:38.000000000 +0000 +++ sphinxsearch-2.0.4/src/sphinxversion.h 2012-03-02 06:19:18.000000000 +0000 @@ -1,5 +1,5 @@ -#define SPH_SVN_TAG "" -#define SPH_SVN_REV 3019 -#define SPH_SVN_REVSTR "3019" -#define SPH_SVN_TAGREV "r3019" -#define SPHINX_TAG "-beta" +#define SPH_SVN_TAG "rel20" +#define SPH_SVN_REV 3135 +#define SPH_SVN_REVSTR "3135" +#define SPH_SVN_TAGREV "r3135" +#define SPHINX_TAG "-release" diff -Nru sphinxsearch-0.9.9+2.0.2beta/src/testrt.cpp sphinxsearch-2.0.4/src/testrt.cpp --- sphinxsearch-0.9.9+2.0.2beta/src/testrt.cpp 2011-09-11 23:24:14.000000000 +0000 +++ sphinxsearch-2.0.4/src/testrt.cpp 2012-03-01 07:43:56.000000000 +0000 @@ -1,10 +1,10 @@ // -// $Id: testrt.cpp 2948 2011-09-11 23:24:14Z tomat $ +// $Id: testrt.cpp 3130 2012-03-01 07:43:56Z tomat $ // // -// Copyright (c) 2001-2011, Andrew Aksyonoff -// Copyright (c) 2008-2011, Sphinx Technologies Inc +// Copyright (c) 2001-2012, Andrew Aksyonoff +// Copyright (c) 2008-2012, Sphinx Technologies Inc // All rights reserved // // This program is free software; you can redistribute it and/or modify @@ -172,6 +172,11 @@ int main () { + // threads should be initialized before memory allocations + char cTopOfMainStack; + sphThreadInit(); + MemorizeStack ( &cTopOfMainStack ); + CSphString sError; CSphDictSettings tDictSettings; @@ -257,5 +262,5 @@ } // -// $Id: testrt.cpp 2948 2011-09-11 23:24:14Z tomat $ +// $Id: testrt.cpp 3130 2012-03-01 07:43:56Z tomat $ // diff -Nru sphinxsearch-0.9.9+2.0.2beta/src/tests.cpp sphinxsearch-2.0.4/src/tests.cpp --- sphinxsearch-0.9.9+2.0.2beta/src/tests.cpp 2011-11-15 19:15:26.000000000 +0000 +++ sphinxsearch-2.0.4/src/tests.cpp 2012-03-01 07:43:56.000000000 +0000 @@ -1,10 +1,10 @@ // -// $Id: tests.cpp 3016 2011-11-15 19:15:26Z tomat $ +// $Id: tests.cpp 3130 2012-03-01 07:43:56Z tomat $ // // -// Copyright (c) 2001-2011, Andrew Aksyonoff -// Copyright (c) 2008-2011, Sphinx Technologies Inc +// Copyright (c) 2001-2012, Andrew Aksyonoff +// Copyright (c) 2008-2012, Sphinx Technologies Inc // All rights reserved // // This program is free software; you can redistribute it and/or modify @@ -787,11 +787,11 @@ default: assert ( 0 && "unexpected op in ReconstructNode()" ); break; } - if ( !pNode->m_dFieldMask.TestAll(true) ) + if ( !pNode->m_dSpec.m_dFieldMask.TestAll(true) ) { CSphString sFields ( "" ); for ( int i=0; im_dFieldMask.Test(i) ) + if ( pNode->m_dSpec.m_dFieldMask.Test(i) ) sFields.SetSprintf ( "%s,%s", sFields.cstr(), tSchema.m_dFields[i].m_sName.cstr() ); sRes.SetSprintf ( "( @%s: %s )", sFields.cstr()+1, sRes.cstr() ); @@ -906,8 +906,11 @@ sphParseExtendedQuery ( tQuery, dTest[i].m_sQuery, pTokenizer.Ptr(), &tSchema, pDict.Ptr(), 1 ); CSphString sReconst = ReconstructNode ( tQuery.m_pRoot, tSchema ); - assert ( sReconst==dTest[i].m_sReconst ); - + if ( sReconst!=dTest[i].m_sReconst ) + { + printf ( "failed!\n Expected '%s',\n got '%s'", dTest[i].m_sReconst, sReconst.cstr() ); + assert ( sReconst==dTest[i].m_sReconst ); + } printf ( "ok\n" ); } } @@ -2213,6 +2216,11 @@ int main () { + // threads should be initialized before memory allocations + char cTopOfMainStack; + sphThreadInit(); + MemorizeStack ( &cTopOfMainStack ); + printf ( "RUNNING INTERNAL LIBSPHINX TESTS\n\n" ); #if 0 @@ -2249,5 +2257,5 @@ } // -// $Id: tests.cpp 3016 2011-11-15 19:15:26Z tomat $ +// $Id: tests.cpp 3130 2012-03-01 07:43:56Z tomat $ // diff -Nru sphinxsearch-0.9.9+2.0.2beta/src/udfexample.c sphinxsearch-2.0.4/src/udfexample.c --- sphinxsearch-0.9.9+2.0.2beta/src/udfexample.c 2011-02-20 00:04:26.000000000 +0000 +++ sphinxsearch-2.0.4/src/udfexample.c 2012-02-07 02:51:05.000000000 +0000 @@ -116,11 +116,15 @@ DLLEXPORT int avgmva_init ( SPH_UDF_INIT * init, SPH_UDF_ARGS * args, char * error_message ) { - if ( args->arg_count!=1 || args->arg_types[0]!=SPH_UDF_TYPE_UINT32SET ) + if ( args->arg_count!=1 || + ( args->arg_types[0]!=SPH_UDF_TYPE_UINT32SET && args->arg_types[0]!=SPH_UDF_TYPE_UINT64SET ) ) { - snprintf ( error_message, SPH_UDF_ERROR_LEN, "STRTOINT() requires 1 MVA argument" ); + snprintf ( error_message, SPH_UDF_ERROR_LEN, "AVGMVA() requires 1 MVA argument" ); return 1; } + + // store our mva vs mva64 flag to func_data + init->func_data = (void*)(int)( args->arg_types[0]==SPH_UDF_TYPE_UINT64SET ? 1 : 0 ); return 0; } @@ -128,14 +132,50 @@ { unsigned int * mva = (unsigned int *) args->arg_values[0]; double res = 0; - int i, n; + int i, n, is64; if ( !mva ) return res; - n = *mva++; - for ( i=0; iarg_values[0]; + // int mva64_count = (*raw_ptr) / 2; + // sphinx_uint64_t * mva64_values = (sphinx_uint64_t*)(raw_ptr + 1); + + // pull "mva32 or mva64" flag (that we stored in _init) from func_data + is64 = (int)(init->func_data) != 0; + if ( is64 ) + { + // handle mva64 + n = *mva++ / 2; + for ( i=0; i'", "TOK_GTE", "TOK_LTE", "'+'", "'-'", "'*'", "'/'", "'%'", "TOK_MOD", "TOK_DIV", "TOK_NOT", "TOK_NEG", "'('", "')'", "','", "$accept", - "exprline", "attr", "expr", "arg", "arglist", "constlist", "function", 0 + "exprline", "attr", "attr_mva", "expr", "arg", "arglist", "constlist", + "constlist_or_uservar", "function", 0 }; #endif @@ -400,23 +400,23 @@ /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ static const unsigned char yyr1[] = { - 0, 48, 49, 50, 50, 50, 51, 51, 51, 51, - 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, - 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, - 51, 51, 51, 51, 51, 52, 52, 52, 52, 52, - 53, 53, 54, 54, 54, 54, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55 + 0, 48, 49, 50, 50, 50, 51, 51, 51, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 53, 53, + 53, 53, 53, 54, 54, 55, 55, 55, 55, 56, + 56, 57, 57, 57, 57, 57, 57, 57, 57 }; /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ static const unsigned char yyr2[] = { 0, 2, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 3, 1, 2, 2, 3, 3, 3, + 1, 1, 1, 1, 1, 1, 3, 1, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 1, 1, 1, 1, 1, - 1, 3, 1, 1, 3, 3, 4, 3, 4, 3, - 6, 6, 6, 6, 6, 6, 4 + 3, 3, 3, 3, 3, 3, 3, 3, 1, 1, + 1, 1, 1, 1, 3, 1, 1, 3, 3, 1, + 1, 4, 3, 4, 3, 6, 6, 6, 4 }; /* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state @@ -424,47 +424,47 @@ means the default is an error. */ static const unsigned char yydefact[] = { - 0, 8, 9, 3, 4, 5, 0, 0, 0, 14, - 0, 10, 11, 12, 0, 0, 0, 0, 0, 6, - 2, 7, 0, 0, 0, 0, 0, 15, 16, 0, + 0, 11, 12, 3, 4, 5, 0, 0, 0, 17, + 0, 13, 14, 15, 0, 0, 0, 0, 0, 9, + 2, 10, 0, 0, 0, 0, 0, 18, 19, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 39, 37, - 38, 36, 47, 35, 40, 0, 0, 0, 0, 0, - 0, 49, 0, 0, 13, 34, 33, 32, 24, 23, - 31, 30, 21, 22, 29, 28, 17, 18, 19, 20, - 25, 27, 26, 46, 0, 0, 0, 0, 0, 0, - 48, 56, 41, 42, 43, 0, 0, 0, 0, 0, - 0, 53, 0, 54, 52, 51, 55, 50, 44, 45 + 0, 0, 0, 0, 0, 0, 0, 0, 42, 40, + 41, 39, 52, 38, 43, 0, 7, 8, 0, 0, + 6, 0, 54, 0, 0, 16, 37, 36, 35, 27, + 26, 34, 33, 24, 25, 32, 31, 20, 21, 22, + 23, 28, 30, 29, 51, 0, 0, 0, 0, 53, + 58, 44, 45, 46, 0, 0, 50, 49, 0, 57, + 0, 56, 55, 47, 48 }; /* YYDEFGOTO[NTERM-NUM]. */ static const yysigned_char yydefgoto[] = { - -1, 18, 19, 53, 54, 55, 95, 21 + -1, 18, 19, 61, 53, 54, 55, 94, 98, 21 }; /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing STATE-NUM. */ -#define YYPACT_NINF -84 +#define YYPACT_NINF -44 static const short yypact[] = { - 176, -84, -84, -84, -84, -84, -27, -25, 14, -84, - 40, -84, -84, -84, 44, 176, 176, 176, 103, -84, - 217, -84, 45, 1, 89, 133, 79, -84, -84, 196, - -84, 176, 176, 176, 176, 176, 176, 176, 176, 176, - 176, 176, 176, 176, 176, 176, 176, 176, -84, -84, - -84, -84, -84, 217, -84, -33, 86, 100, 124, 130, - 134, -84, -17, 37, -84, -84, 233, 39, 82, 125, - 166, 166, -14, -14, -14, -14, 238, 238, -84, -84, - -84, -84, -84, -84, 133, 83, 83, 83, 83, -2, - -84, -84, -84, -84, -84, 81, 84, 122, 126, 141, - 128, -84, 182, -84, -84, -84, -84, -84, -84, -84 + 176, -44, -44, -44, -44, -44, -27, -25, 14, -44, + 44, -44, -44, -44, 58, 176, 176, 176, 85, -44, + 217, -44, 45, 1, 89, 133, 79, -44, -44, 196, + -44, 176, 176, 176, 176, 176, 176, 176, 176, 176, + 176, 176, 176, 176, 176, 176, 176, 176, -44, -44, + -44, -44, -44, 217, -44, -43, -44, -44, 84, 86, + -44, 100, -44, -41, -33, -44, -44, 233, 39, 82, + 125, 166, 166, -14, -14, -14, -14, 238, 238, -44, + -44, -44, -44, -44, -44, 133, 26, 26, -2, -44, + -44, -44, -44, -44, 37, 40, -44, 126, 128, -44, + 124, -44, -44, -44, -44 }; /* YYPGOTO[NTERM-NUM]. */ static const short yypgoto[] = { - -84, -84, 106, 0, 127, 185, -83, -84 + -44, -44, 148, -44, 0, 87, 105, 81, -44, -44 }; /* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If @@ -474,31 +474,31 @@ #define YYTABLE_NINF -1 static const unsigned char yytable[] = { - 20, 93, 94, 96, 97, 98, 100, 3, 4, 5, - 56, 57, 99, 83, 84, 27, 28, 29, 22, 58, - 23, 59, 41, 42, 43, 44, 45, 46, 47, 90, - 84, 66, 67, 68, 69, 70, 71, 72, 73, 74, - 75, 76, 77, 78, 79, 80, 81, 82, 1, 2, + 20, 92, 93, 84, 85, 89, 85, 3, 4, 5, + 56, 57, 96, 90, 85, 27, 28, 29, 22, 58, + 23, 59, 41, 42, 43, 44, 45, 46, 47, 92, + 93, 67, 68, 69, 70, 71, 72, 73, 74, 75, + 76, 77, 78, 79, 80, 81, 82, 83, 1, 2, 48, 3, 4, 5, 49, 50, 51, 6, 7, 24, 8, 9, 10, 11, 12, 13, 14, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, - 46, 47, 15, 91, 84, 25, 93, 94, 16, 26, + 46, 47, 15, 99, 100, 30, 101, 100, 16, 25, 17, 52, 1, 2, 48, 3, 4, 5, 49, 50, - 51, 6, 7, 30, 8, 9, 10, 11, 12, 13, + 51, 6, 7, 26, 8, 9, 10, 11, 12, 13, 14, 34, 35, 36, 37, 38, 39, 40, 41, 42, - 43, 44, 45, 46, 47, 64, 15, 101, 102, 60, - 103, 102, 16, 85, 17, 61, 1, 2, 48, 3, - 4, 5, 49, 50, 51, 6, 7, 86, 8, 9, + 43, 44, 45, 46, 47, 65, 15, 103, 104, 63, + 64, 86, 16, 87, 17, 62, 1, 2, 48, 3, + 4, 5, 49, 50, 51, 6, 7, 88, 8, 9, 10, 11, 12, 13, 14, 35, 36, 37, 38, 39, - 40, 41, 42, 43, 44, 45, 46, 47, 104, 102, - 15, 87, 105, 102, 107, 102, 16, 88, 17, 1, - 2, 89, 3, 4, 5, 108, 109, 106, 6, 7, + 40, 41, 42, 43, 44, 45, 46, 47, 95, 97, + 15, 60, 91, 100, 102, 0, 16, 0, 17, 1, + 2, 0, 3, 4, 5, 0, 0, 0, 6, 7, 0, 8, 9, 10, 11, 12, 13, 14, 37, 38, - 39, 40, 41, 42, 43, 44, 45, 46, 47, 62, - 63, 92, 0, 15, 0, 0, 0, 0, 0, 16, + 39, 40, 41, 42, 43, 44, 45, 46, 47, 0, + 0, 0, 0, 15, 0, 0, 0, 0, 0, 16, 0, 17, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 0, - 0, 0, 65, 31, 32, 33, 34, 35, 36, 37, + 0, 0, 66, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 43, 44, 45, 46, @@ -507,28 +507,28 @@ static const yysigned_char yycheck[] = { - 0, 3, 4, 86, 87, 88, 89, 6, 7, 8, + 0, 3, 4, 46, 47, 46, 47, 6, 7, 8, 9, 10, 14, 46, 47, 15, 16, 17, 45, 18, - 45, 20, 36, 37, 38, 39, 40, 41, 42, 46, - 47, 31, 32, 33, 34, 35, 36, 37, 38, 39, + 45, 20, 36, 37, 38, 39, 40, 41, 42, 3, + 4, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 45, 15, 16, 17, 18, 19, 20, 21, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 37, 46, 47, 45, 3, 4, 43, 45, + 41, 42, 37, 46, 47, 0, 46, 47, 43, 45, 45, 46, 3, 4, 5, 6, 7, 8, 9, 10, - 11, 12, 13, 0, 15, 16, 17, 18, 19, 20, + 11, 12, 13, 45, 15, 16, 17, 18, 19, 20, 21, 29, 30, 31, 32, 33, 34, 35, 36, 37, - 38, 39, 40, 41, 42, 46, 37, 46, 47, 23, - 46, 47, 43, 47, 45, 46, 3, 4, 5, 6, + 38, 39, 40, 41, 42, 46, 37, 3, 4, 24, + 25, 47, 43, 47, 45, 46, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 47, 15, 16, 17, 18, 19, 20, 21, 30, 31, 32, 33, 34, - 35, 36, 37, 38, 39, 40, 41, 42, 46, 47, - 37, 47, 46, 47, 46, 47, 43, 47, 45, 3, - 4, 47, 6, 7, 8, 3, 4, 46, 12, 13, + 35, 36, 37, 38, 39, 40, 41, 42, 87, 88, + 37, 23, 85, 47, 46, -1, 43, -1, 45, 3, + 4, -1, 6, 7, 8, -1, -1, -1, 12, 13, -1, 15, 16, 17, 18, 19, 20, 21, 32, 33, - 34, 35, 36, 37, 38, 39, 40, 41, 42, 24, - 25, 84, -1, 37, -1, -1, -1, -1, -1, 43, + 34, 35, 36, 37, 38, 39, 40, 41, 42, -1, + -1, -1, -1, 37, -1, -1, -1, -1, -1, 43, -1, 45, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, -1, -1, -1, 46, 26, 27, 28, 29, 30, 31, 32, @@ -544,15 +544,15 @@ { 0, 3, 4, 6, 7, 8, 12, 13, 15, 16, 17, 18, 19, 20, 21, 37, 43, 45, 49, 50, - 51, 55, 45, 45, 45, 45, 45, 51, 51, 51, + 52, 57, 45, 45, 45, 45, 45, 52, 52, 52, 0, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 5, 9, - 10, 11, 46, 51, 52, 53, 9, 10, 18, 20, - 50, 46, 53, 53, 46, 46, 51, 51, 51, 51, - 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, - 51, 51, 51, 46, 47, 47, 47, 47, 47, 47, - 46, 46, 52, 3, 4, 54, 54, 54, 54, 14, - 54, 46, 47, 46, 46, 46, 46, 46, 3, 4 + 10, 11, 46, 52, 53, 54, 9, 10, 18, 20, + 50, 51, 46, 54, 54, 46, 46, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 46, 47, 47, 47, 47, 46, + 46, 53, 3, 4, 55, 55, 14, 55, 56, 46, + 47, 46, 46, 3, 4 }; #if ! defined (YYSIZE_T) && defined (__SIZE_TYPE__) @@ -1181,263 +1181,256 @@ { yyval.iNode = pParser->AddNodeAttr ( TOK_ATTR_FLOAT, yyvsp[0].iAttrLocator ); ;} break; + case 7: + + { yyval.iNode = pParser->AddNodeAttr ( TOK_ATTR_MVA32, yyvsp[0].iAttrLocator ) ;} + break; + case 8: + { yyval.iNode = pParser->AddNodeAttr ( TOK_ATTR_MVA64, yyvsp[0].iAttrLocator ) ;} + break; + + case 11: + { yyval.iNode = pParser->AddNodeInt ( yyvsp[0].iConst ); ;} break; - case 9: + case 12: { yyval.iNode = pParser->AddNodeFloat ( yyvsp[0].fConst ); ;} break; - case 10: + case 13: { yyval.iNode = pParser->AddNodeID(); ;} break; - case 11: + case 14: { yyval.iNode = pParser->AddNodeWeight(); ;} break; - case 12: + case 15: { yyval.iNode = pParser->AddNodeID(); ;} break; - case 13: + case 16: { yyval.iNode = pParser->AddNodeWeight(); ;} break; - case 14: + case 17: { yyval.iNode = pParser->AddNodeHookIdent ( yyvsp[0].iNode ); ;} break; - case 15: + case 18: { yyval.iNode = pParser->AddNodeOp ( TOK_NEG, yyvsp[0].iNode, -1 ); ;} break; - case 16: + case 19: { yyval.iNode = pParser->AddNodeOp ( TOK_NOT, yyvsp[0].iNode, -1 ); if ( yyval.iNode<0 ) YYERROR; ;} break; - case 17: + case 20: { yyval.iNode = pParser->AddNodeOp ( '+', yyvsp[-2].iNode, yyvsp[0].iNode ); ;} break; - case 18: + case 21: { yyval.iNode = pParser->AddNodeOp ( '-', yyvsp[-2].iNode, yyvsp[0].iNode ); ;} break; - case 19: + case 22: { yyval.iNode = pParser->AddNodeOp ( '*', yyvsp[-2].iNode, yyvsp[0].iNode ); ;} break; - case 20: + case 23: { yyval.iNode = pParser->AddNodeOp ( '/', yyvsp[-2].iNode, yyvsp[0].iNode ); ;} break; - case 21: + case 24: { yyval.iNode = pParser->AddNodeOp ( '<', yyvsp[-2].iNode, yyvsp[0].iNode ); ;} break; - case 22: + case 25: { yyval.iNode = pParser->AddNodeOp ( '>', yyvsp[-2].iNode, yyvsp[0].iNode ); ;} break; - case 23: + case 26: { yyval.iNode = pParser->AddNodeOp ( '&', yyvsp[-2].iNode, yyvsp[0].iNode ); ;} break; - case 24: + case 27: { yyval.iNode = pParser->AddNodeOp ( '|', yyvsp[-2].iNode, yyvsp[0].iNode ); ;} break; - case 25: + case 28: { yyval.iNode = pParser->AddNodeOp ( '%', yyvsp[-2].iNode, yyvsp[0].iNode ); ;} break; - case 26: + case 29: { yyval.iNode = pParser->AddNodeFunc ( FUNC_IDIV, pParser->AddNodeOp ( ',', yyvsp[-2].iNode, yyvsp[0].iNode ) ); ;} break; - case 27: + case 30: { yyval.iNode = pParser->AddNodeOp ( '%', yyvsp[-2].iNode, yyvsp[0].iNode ); ;} break; - case 28: + case 31: { yyval.iNode = pParser->AddNodeOp ( TOK_LTE, yyvsp[-2].iNode, yyvsp[0].iNode ); ;} break; - case 29: + case 32: { yyval.iNode = pParser->AddNodeOp ( TOK_GTE, yyvsp[-2].iNode, yyvsp[0].iNode ); ;} break; - case 30: + case 33: { yyval.iNode = pParser->AddNodeOp ( TOK_EQ, yyvsp[-2].iNode, yyvsp[0].iNode ); ;} break; - case 31: + case 34: { yyval.iNode = pParser->AddNodeOp ( TOK_NE, yyvsp[-2].iNode, yyvsp[0].iNode ); ;} break; - case 32: + case 35: { yyval.iNode = pParser->AddNodeOp ( TOK_AND, yyvsp[-2].iNode, yyvsp[0].iNode ); if ( yyval.iNode<0 ) YYERROR; ;} break; - case 33: + case 36: { yyval.iNode = pParser->AddNodeOp ( TOK_OR, yyvsp[-2].iNode, yyvsp[0].iNode ); if ( yyval.iNode<0 ) YYERROR; ;} break; - case 34: + case 37: { yyval.iNode = yyvsp[-1].iNode; ;} break; - case 36: + case 39: { yyval.iNode = pParser->AddNodeAttr ( TOK_ATTR_STRING, yyvsp[0].iAttrLocator ); ;} break; - case 37: + case 40: { yyval.iNode = pParser->AddNodeAttr ( TOK_ATTR_MVA32, yyvsp[0].iAttrLocator ); ;} break; - case 38: + case 41: { yyval.iNode = pParser->AddNodeAttr ( TOK_ATTR_MVA64, yyvsp[0].iAttrLocator ); ;} break; - case 39: + case 42: { yyval.iNode = pParser->AddNodeString ( yyvsp[0].iConst ); ;} break; - case 40: + case 43: { yyval.iNode = yyvsp[0].iNode; ;} break; - case 41: + case 44: { yyval.iNode = pParser->AddNodeOp ( ',', yyvsp[-2].iNode, yyvsp[0].iNode ); ;} break; - case 42: + case 45: { yyval.iNode = pParser->AddNodeConstlist ( yyvsp[0].iConst ); ;} break; - case 43: + case 46: { yyval.iNode = pParser->AddNodeConstlist ( yyvsp[0].fConst ); ;} break; - case 44: + case 47: { pParser->AppendToConstlist ( yyval.iNode, yyvsp[0].iConst ); ;} break; - case 45: + case 48: { pParser->AppendToConstlist ( yyval.iNode, yyvsp[0].fConst ); ;} break; - case 46: + case 50: + + { yyval.iNode = pParser->AddNodeUservar ( yyvsp[0].iNode ); ;} + break; + + case 51: { yyval.iNode = pParser->AddNodeFunc ( yyvsp[-3].iFunc, yyvsp[-1].iNode ); if ( yyval.iNode<0 ) YYERROR; ;} break; - case 47: + case 52: { yyval.iNode = pParser->AddNodeFunc ( yyvsp[-2].iFunc, -1 ); if ( yyval.iNode<0 ) YYERROR; ;} break; - case 48: + case 53: { yyval.iNode = pParser->AddNodeUdf ( yyvsp[-3].iNode, yyvsp[-1].iNode ); if ( yyval.iNode<0 ) YYERROR; ;} break; - case 49: + case 54: { yyval.iNode = pParser->AddNodeUdf ( yyvsp[-2].iNode, -1 ); if ( yyval.iNode<0 ) YYERROR; ;} break; - case 50: + case 55: { yyval.iNode = pParser->AddNodeFunc ( yyvsp[-5].iFunc, yyvsp[-3].iNode, yyvsp[-1].iNode ); ;} break; - case 51: + case 56: { yyval.iNode = pParser->AddNodeFunc ( yyvsp[-5].iFunc, pParser->AddNodeID(), yyvsp[-1].iNode ); ;} break; - case 52: + case 57: { yyval.iNode = pParser->AddNodeFunc ( yyvsp[-5].iFunc, pParser->AddNodeID(), yyvsp[-1].iNode ); ;} break; - case 53: + case 58: { - yyval.iNode = pParser->AddNodeAttr ( TOK_ATTR_MVA32, yyvsp[-3].iAttrLocator ); - yyval.iNode = pParser->AddNodeFunc ( yyvsp[-5].iFunc, yyval.iNode, yyvsp[-1].iNode ); - ;} - break; - - case 54: - - { - yyval.iNode = pParser->AddNodeAttr ( TOK_ATTR_MVA64, yyvsp[-3].iAttrLocator ); - yyval.iNode = pParser->AddNodeFunc ( yyvsp[-5].iFunc, yyval.iNode, yyvsp[-1].iNode ); - ;} - break; - - case 55: - - { - int iConstlist = pParser->ConstlistFromUservar ( yyvsp[-1].iNode ); - if ( iConstlist<0 ) + yyval.iNode = pParser->AddNodeHookFunc ( yyvsp[-3].iNode, yyvsp[-1].iNode ); + if ( yyval.iNode<0 ) YYERROR; - yyval.iNode = pParser->AddNodeFunc ( yyvsp[-5].iFunc, yyvsp[-3].iNode, iConstlist ); ;} break; - case 56: - - { yyval.iNode = pParser->AddNodeHookFunc ( yyvsp[-3].iNode, yyvsp[-1].iNode ); if ( yyval.iNode<0 ) YYERROR; ;} - break; - } diff -Nru sphinxsearch-0.9.9+2.0.2beta/src/yysphinxql.c sphinxsearch-2.0.4/src/yysphinxql.c --- sphinxsearch-0.9.9+2.0.2beta/src/yysphinxql.c 2011-11-03 12:36:36.000000000 +0000 +++ sphinxsearch-2.0.4/src/yysphinxql.c 2011-12-20 13:17:09.000000000 +0000 @@ -374,16 +374,16 @@ /* YYFINAL -- State number of the termination state. */ #define YYFINAL 91 /* YYLAST -- Last index in YYTABLE. */ -#define YYLAST 777 +#define YYLAST 778 /* YYNTOKENS -- Number of terminals. */ #define YYNTOKENS 105 /* YYNNTS -- Number of nonterminals. */ #define YYNNTS 83 /* YYNRULES -- Number of rules. */ -#define YYNRULES 234 +#define YYNRULES 235 /* YYNRULES -- Number of states. */ -#define YYNSTATES 437 +#define YYNSTATES 438 /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ #define YYUNDEFTOK 2 @@ -456,11 +456,11 @@ 524, 529, 537, 543, 545, 547, 549, 551, 553, 555, 557, 559, 561, 564, 571, 573, 575, 576, 580, 582, 586, 588, 592, 596, 598, 602, 604, 606, 608, 612, - 620, 630, 637, 639, 643, 645, 649, 651, 655, 656, - 659, 661, 665, 669, 670, 672, 674, 676, 679, 681, - 683, 686, 692, 694, 698, 702, 706, 712, 717, 721, - 724, 731, 732, 734, 736, 739, 742, 745, 747, 755, - 757, 759, 763, 770, 774 + 615, 623, 633, 640, 642, 646, 648, 652, 654, 658, + 659, 662, 664, 668, 672, 673, 675, 677, 679, 682, + 684, 686, 689, 695, 697, 701, 705, 709, 715, 720, + 724, 727, 734, 735, 737, 739, 742, 745, 748, 750, + 758, 760, 762, 766, 773, 777 }; /* YYRHS -- A `-1'-separated list of the rules' RHS. */ @@ -527,23 +527,24 @@ 120, -1, 156, 102, 120, -1, 158, -1, 157, 102, 158, -1, 103, 159, 104, -1, 160, -1, 159, 102, 160, -1, 121, -1, 122, -1, 8, -1, 103, 123, - 104, -1, 25, 34, 3, 82, 38, 88, 121, -1, - 25, 34, 3, 82, 38, 39, 103, 123, 104, -1, - 19, 3, 103, 163, 166, 104, -1, 164, -1, 163, - 102, 164, -1, 160, -1, 103, 165, 104, -1, 8, - -1, 165, 102, 8, -1, -1, 102, 167, -1, 168, - -1, 167, 102, 168, -1, 160, 169, 170, -1, -1, - 12, -1, 3, -1, 46, -1, 172, 3, -1, 27, - -1, 26, -1, 67, 72, -1, 77, 115, 65, 175, - 117, -1, 176, -1, 175, 102, 176, -1, 3, 88, - 121, -1, 3, 88, 122, -1, 3, 88, 103, 123, - 104, -1, 3, 88, 103, 104, -1, 67, 180, 79, - -1, 67, 20, -1, 65, 180, 74, 44, 45, 181, - -1, -1, 36, -1, 66, -1, 57, 76, -1, 57, - 22, -1, 58, 57, -1, 64, -1, 24, 35, 3, - 60, 183, 68, 8, -1, 42, -1, 32, -1, 30, - 35, 3, -1, 14, 40, 3, 73, 62, 3, -1, - 33, 62, 3, -1, 63, 10, 132, -1 + 104, -1, 103, 104, -1, 25, 34, 3, 82, 38, + 88, 121, -1, 25, 34, 3, 82, 38, 39, 103, + 123, 104, -1, 19, 3, 103, 163, 166, 104, -1, + 164, -1, 163, 102, 164, -1, 160, -1, 103, 165, + 104, -1, 8, -1, 165, 102, 8, -1, -1, 102, + 167, -1, 168, -1, 167, 102, 168, -1, 160, 169, + 170, -1, -1, 12, -1, 3, -1, 46, -1, 172, + 3, -1, 27, -1, 26, -1, 67, 72, -1, 77, + 115, 65, 175, 117, -1, 176, -1, 175, 102, 176, + -1, 3, 88, 121, -1, 3, 88, 122, -1, 3, + 88, 103, 123, 104, -1, 3, 88, 103, 104, -1, + 67, 180, 79, -1, 67, 20, -1, 65, 180, 74, + 44, 45, 181, -1, -1, 36, -1, 66, -1, 57, + 76, -1, 57, 22, -1, 58, 57, -1, 64, -1, + 24, 35, 3, 60, 183, 68, 8, -1, 42, -1, + 32, -1, 30, 35, 3, -1, 14, 40, 3, 73, + 62, 3, -1, 33, 62, 3, -1, 63, 10, 132, + -1 }; /* YYRLINE[YYN] -- source line where rule number YYN was defined. */ @@ -567,12 +568,12 @@ 557, 563, 564, 565, 566, 567, 571, 576, 581, 586, 587, 591, 596, 604, 605, 609, 610, 611, 625, 626, 627, 631, 632, 638, 646, 647, 650, 652, 656, 657, - 661, 662, 666, 670, 671, 675, 676, 677, 678, 684, - 690, 702, 710, 714, 721, 722, 729, 739, 745, 747, - 751, 756, 760, 767, 769, 773, 774, 780, 788, 789, - 795, 801, 809, 810, 814, 818, 822, 826, 835, 842, - 849, 855, 856, 857, 861, 862, 863, 864, 870, 881, - 882, 886, 897, 909, 920 + 661, 662, 666, 670, 671, 675, 676, 677, 678, 679, + 685, 691, 703, 711, 715, 722, 723, 730, 740, 746, + 748, 752, 757, 761, 768, 770, 774, 775, 781, 789, + 790, 796, 802, 810, 811, 815, 819, 823, 827, 837, + 844, 851, 857, 858, 859, 863, 864, 865, 866, 872, + 883, 884, 888, 899, 911, 922 }; #endif @@ -664,12 +665,12 @@ 145, 146, 146, 146, 146, 146, 147, 147, 147, 147, 147, 148, 148, 149, 149, 150, 150, 150, 151, 151, 151, 152, 152, 153, 154, 154, 155, 155, 156, 156, - 157, 157, 158, 159, 159, 160, 160, 160, 160, 161, - 161, 162, 163, 163, 164, 164, 165, 165, 166, 166, - 167, 167, 168, 169, 169, 170, 170, 171, 172, 172, - 173, 174, 175, 175, 176, 176, 176, 176, 177, 178, - 179, 180, 180, 180, 181, 181, 181, 181, 182, 183, - 183, 184, 185, 186, 187 + 157, 157, 158, 159, 159, 160, 160, 160, 160, 160, + 161, 161, 162, 163, 163, 164, 164, 165, 165, 166, + 166, 167, 167, 168, 169, 169, 170, 170, 171, 172, + 172, 173, 174, 175, 175, 176, 176, 176, 176, 177, + 178, 179, 180, 180, 180, 181, 181, 181, 181, 182, + 183, 183, 184, 185, 186, 187 }; /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ @@ -693,12 +694,12 @@ 1, 1, 1, 1, 1, 1, 4, 4, 4, 3, 4, 7, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 6, 1, 1, 0, 3, 1, 3, - 1, 3, 3, 1, 3, 1, 1, 1, 3, 7, - 9, 6, 1, 3, 1, 3, 1, 3, 0, 2, - 1, 3, 3, 0, 1, 1, 1, 2, 1, 1, - 2, 5, 1, 3, 3, 3, 5, 4, 3, 2, - 6, 0, 1, 1, 2, 2, 2, 1, 7, 1, - 1, 3, 6, 3, 3 + 1, 3, 3, 1, 3, 1, 1, 1, 3, 2, + 7, 9, 6, 1, 3, 1, 3, 1, 3, 0, + 2, 1, 3, 3, 0, 1, 1, 1, 2, 1, + 1, 2, 5, 1, 3, 3, 3, 5, 4, 3, + 2, 6, 0, 1, 1, 2, 2, 2, 1, 7, + 1, 1, 3, 6, 3, 3 }; /* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state @@ -706,298 +707,298 @@ means the default is an error. */ static const unsigned char yydefact[] = { - 0, 0, 171, 0, 168, 0, 0, 209, 208, 0, - 0, 174, 175, 169, 0, 221, 221, 0, 0, 0, + 0, 0, 171, 0, 168, 0, 0, 210, 209, 0, + 0, 174, 175, 169, 0, 222, 222, 0, 0, 0, 2, 3, 22, 24, 25, 7, 8, 9, 170, 5, 0, 6, 10, 11, 0, 12, 13, 14, 15, 20, 16, 17, 18, 19, 21, 0, 0, 0, 0, 0, 0, 111, 112, 114, 115, 116, 94, 0, 0, 113, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, - 27, 31, 34, 137, 0, 0, 222, 0, 223, 0, - 219, 222, 150, 149, 210, 148, 147, 0, 172, 42, - 0, 1, 4, 0, 207, 0, 0, 0, 0, 231, - 233, 0, 0, 234, 95, 0, 0, 0, 0, 0, + 27, 31, 34, 137, 0, 0, 223, 0, 224, 0, + 220, 223, 150, 149, 211, 148, 147, 0, 172, 42, + 0, 1, 4, 0, 208, 0, 0, 0, 0, 232, + 234, 0, 0, 235, 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 117, 118, 0, 0, 0, 32, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 151, 154, 155, 153, 152, 159, 0, - 218, 0, 0, 0, 0, 23, 176, 0, 73, 75, - 187, 0, 0, 185, 186, 194, 198, 192, 0, 0, + 219, 0, 0, 0, 0, 23, 176, 0, 73, 75, + 187, 0, 0, 185, 186, 195, 199, 193, 0, 0, 146, 140, 145, 0, 143, 96, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 136, 44, 28, 33, 128, 129, 135, 134, 126, 125, 132, 133, 123, 124, 131, 130, 119, 120, 121, 122, 127, 163, 164, 166, 158, 165, 0, 167, 157, 156, 160, 0, 0, 0, - 0, 0, 212, 43, 0, 0, 0, 74, 76, 196, - 77, 0, 0, 0, 0, 230, 229, 0, 0, 0, - 138, 0, 35, 0, 39, 139, 0, 36, 0, 37, - 38, 0, 0, 0, 79, 45, 162, 0, 0, 0, - 0, 211, 68, 69, 0, 72, 0, 178, 0, 0, - 232, 0, 188, 0, 195, 194, 193, 199, 200, 191, - 0, 0, 0, 144, 97, 41, 0, 0, 0, 46, - 47, 0, 0, 82, 80, 0, 0, 0, 227, 220, - 0, 214, 215, 213, 0, 0, 0, 177, 0, 173, - 180, 78, 197, 204, 0, 0, 228, 0, 189, 142, - 141, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 85, 83, 161, 225, 224, 226, - 217, 0, 0, 71, 179, 0, 0, 183, 0, 205, - 206, 202, 203, 201, 0, 0, 48, 0, 0, 54, - 0, 50, 61, 51, 62, 58, 64, 57, 63, 59, - 66, 60, 67, 0, 81, 0, 0, 94, 86, 216, - 70, 0, 182, 181, 190, 49, 0, 0, 0, 55, - 0, 0, 0, 98, 184, 56, 0, 65, 52, 0, - 0, 0, 91, 87, 89, 0, 26, 99, 53, 84, - 0, 92, 93, 0, 0, 100, 101, 88, 90, 0, - 0, 103, 104, 107, 0, 102, 0, 0, 0, 108, - 0, 0, 0, 105, 106, 110, 109 + 0, 0, 213, 43, 0, 0, 0, 74, 76, 197, + 189, 77, 0, 0, 0, 0, 231, 230, 0, 0, + 0, 138, 0, 35, 0, 39, 139, 0, 36, 0, + 37, 38, 0, 0, 0, 79, 45, 162, 0, 0, + 0, 0, 212, 68, 69, 0, 72, 0, 178, 0, + 0, 233, 0, 188, 0, 196, 195, 194, 200, 201, + 192, 0, 0, 0, 144, 97, 41, 0, 0, 0, + 46, 47, 0, 0, 82, 80, 0, 0, 0, 228, + 221, 0, 215, 216, 214, 0, 0, 0, 177, 0, + 173, 180, 78, 198, 205, 0, 0, 229, 0, 190, + 142, 141, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 85, 83, 161, 226, 225, + 227, 218, 0, 0, 71, 179, 0, 0, 183, 0, + 206, 207, 203, 204, 202, 0, 0, 48, 0, 0, + 54, 0, 50, 61, 51, 62, 58, 64, 57, 63, + 59, 66, 60, 67, 0, 81, 0, 0, 94, 86, + 217, 70, 0, 182, 181, 191, 49, 0, 0, 0, + 55, 0, 0, 0, 98, 184, 56, 0, 65, 52, + 0, 0, 0, 91, 87, 89, 0, 26, 99, 53, + 84, 0, 92, 93, 0, 0, 100, 101, 88, 90, + 0, 0, 103, 104, 107, 0, 102, 0, 0, 0, + 108, 0, 0, 0, 105, 106, 110, 109 }; /* YYDEFGOTO[NTERM-NUM]. */ static const short yydefgoto[] = { -1, 19, 20, 21, 22, 23, 69, 70, 121, 71, - 90, 254, 255, 289, 290, 402, 230, 164, 231, 293, - 294, 334, 335, 377, 378, 403, 404, 103, 104, 406, - 407, 415, 416, 428, 429, 72, 73, 173, 174, 24, + 90, 255, 256, 290, 291, 403, 231, 164, 232, 294, + 295, 335, 336, 378, 379, 404, 405, 103, 104, 407, + 408, 416, 417, 429, 430, 72, 73, 173, 174, 24, 86, 148, 25, 26, 214, 215, 27, 28, 29, 30, - 225, 268, 309, 310, 346, 165, 31, 32, 166, 167, - 232, 234, 277, 278, 314, 351, 33, 34, 35, 36, - 221, 222, 37, 38, 39, 79, 299, 40, 237, 41, + 225, 269, 310, 311, 347, 165, 31, 32, 166, 167, + 233, 235, 278, 279, 315, 352, 33, 34, 35, 36, + 221, 222, 37, 38, 39, 79, 300, 40, 238, 41, 42, 43, 44 }; /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing STATE-NUM. */ -#define YYPACT_NINF -242 +#define YYPACT_NINF -243 static const short yypact[] = { - 700, 1, -242, 88, -242, 59, 86, -242, -242, 110, - 66, -242, -242, -242, 155, 171, 253, 68, 154, 172, - -242, 65, -242, -242, -242, -242, -242, -242, -242, -242, - 146, -242, -242, -242, 187, -242, -242, -242, -242, -242, - -242, -242, -242, -242, -242, 203, 121, 214, 232, 236, - 242, 156, -242, -242, -242, -242, 211, 168, 169, -242, - 180, 181, 184, 185, 194, 243, -242, 243, 243, 6, - -242, 21, 493, -242, 191, 210, 141, 345, -242, 229, - -242, -242, -242, -242, -242, -242, -242, 230, -242, -242, - -48, -242, 62, 307, -242, 238, 8, 252, 239, -242, - -242, 93, 315, -242, -242, 243, 99, 257, 243, 243, - 243, 222, 219, 226, -242, -242, 325, 154, 205, -242, - 327, -242, 243, 243, 243, 243, 243, 243, 243, 243, - 243, 243, 243, 243, 243, 243, 243, 243, 243, 109, - 345, 244, 246, -242, -242, -242, -242, -242, -242, 287, - -242, 333, 336, 205, 107, -242, 237, 279, -242, -242, - -242, 174, -2, -242, -242, -242, 241, -242, 94, 306, - -242, -242, 493, -49, -242, 245, 348, 342, 251, 49, - 277, 298, 374, -242, 243, 243, -242, -54, -242, -242, - -242, -242, 519, 542, 567, 590, 615, 615, 104, 104, - 104, 104, 308, 308, -242, -242, -242, -242, -242, -242, - -242, -242, 352, -242, -242, -242, -242, 19, 255, 335, - 290, -51, -242, -242, 54, 319, 398, -242, -242, -242, - -242, 50, 67, 8, 303, -242, -242, 340, -7, 257, - -242, 419, -242, 323, -242, -242, 243, -242, 243, -242, - -242, 445, 470, 144, 391, -242, -242, 29, -8, 20, - 333, -242, -242, -242, 328, -242, 344, -242, 111, 346, - -242, 29, -242, 442, -242, 127, -242, 351, -242, -242, - 446, 353, 29, -242, -242, -242, 397, 422, 354, 370, - -242, 225, 412, 392, -242, 114, 58, 420, -242, -242, - 5, -242, -242, -242, 380, 375, 54, -242, 15, 378, - -242, -242, -242, -242, 33, 15, -242, 29, -242, -242, - -242, 489, 144, 24, 2, 24, 24, 24, 24, 24, - 24, 459, 54, 463, 447, -242, -242, -242, -242, -242, - -242, 136, 399, -242, -242, 29, 165, -242, 346, -242, - -242, -242, 492, -242, 166, 401, -242, 438, 439, -242, - 29, -242, -242, -242, -242, -242, -242, -242, -242, -242, - -242, -242, -242, 10, -242, 472, 507, 211, -242, -242, - -242, 15, -242, -242, -242, -242, 29, 9, 173, -242, - 29, 510, 218, 491, -242, -242, 540, -242, -242, 176, - 54, 448, 26, 450, -242, 546, -242, -242, -242, 450, - 449, -242, -242, 54, 462, 467, -242, -242, -242, 4, - 546, 471, -242, -242, 570, -242, 568, 487, 190, -242, - 488, 29, 570, -242, -242, -242, -242 + 701, -11, -243, 52, -243, 19, 83, -243, -243, 116, + 107, -243, -243, -243, 156, 137, 683, 98, 182, 190, + -243, 74, -243, -243, -243, -243, -243, -243, -243, -243, + 155, -243, -243, -243, 205, -243, -243, -243, -243, -243, + -243, -243, -243, -243, -243, 215, 120, 216, 221, 222, + 236, 138, -243, -243, -243, -243, 194, 143, 154, -243, + 177, 178, 181, 186, 187, 244, -243, 244, 244, -7, + -243, 133, 494, -243, 170, 197, 49, 121, -243, 201, + -243, -243, -243, -243, -243, -243, -243, 220, -243, -243, + -49, -243, 91, 297, -243, 231, 16, 251, 238, -243, + -243, 93, 317, -243, -243, 244, 11, 258, 244, 244, + 244, 219, 223, 224, -243, -243, 326, 182, 206, -243, + 321, -243, 244, 244, 244, 244, 244, 244, 244, 244, + 244, 244, 244, 244, 244, 244, 244, 244, 244, 147, + 121, 242, 243, -243, -243, -243, -243, -243, -243, 288, + -243, 330, 331, 206, -29, -243, 232, 276, -243, -243, + -243, 175, 9, -243, -243, -243, 235, -243, 8, 302, + -243, -243, 494, 40, -243, 239, 349, 339, 240, 66, + 278, 299, 375, -243, 244, 244, -243, -70, -243, -243, + -243, -243, 520, 543, 568, 591, 616, 616, 574, 574, + 574, 574, -18, -18, -243, -243, -243, -243, -243, -243, + -243, -243, 340, -243, -243, -243, -243, 131, 245, 304, + 263, 51, -243, -243, 275, 274, 351, -243, -243, -243, + -243, -243, 89, 97, 16, 254, -243, -243, 291, 42, + 258, -243, 355, -243, 277, -243, -243, 244, -243, 244, + -243, -243, 446, 471, 179, 342, -243, -243, -2, 99, + 25, 330, -243, -243, -243, 295, -243, 296, -243, 103, + 303, -243, -2, -243, 394, -243, 45, -243, 305, -243, + -243, 397, 306, -2, -243, -243, -243, 398, 423, 322, + 323, -243, 226, 410, 346, -243, 112, 34, 374, -243, + -243, 10, -243, -243, -243, 336, 344, 275, -243, 20, + 348, -243, -243, -243, -243, 46, 20, -243, -2, -243, + -243, -243, 443, 179, 30, -3, 30, 30, 30, 30, + 30, 30, 415, 275, 418, 401, -243, -243, -243, -243, + -243, -243, 134, 353, -243, -243, 14, 168, -243, 303, + -243, -243, -243, 464, -243, 169, 354, -243, 392, 393, + -243, -2, -243, -243, -243, -243, -243, -243, -243, -243, + -243, -243, -243, -243, 0, -243, 425, 463, 194, -243, + -243, -243, 20, -243, -243, -243, -243, -2, 17, 172, + -243, -2, 480, 265, 445, -243, -243, 495, -243, -243, + 191, 275, 400, 122, 402, -243, 502, -243, -243, -243, + 402, 420, -243, -243, 275, 437, 404, -243, -243, -243, + 5, 502, 426, -243, -243, 523, -243, 538, 440, 208, + -243, 447, -2, 523, -243, -243, -243, -243 }; /* YYPGOTO[NTERM-NUM]. */ static const short yypgoto[] = { - -242, -242, -242, -242, 502, -242, -242, 477, -242, -242, - 480, -242, 377, -242, 278, -216, -96, -241, -222, -242, - -242, -242, -242, -242, -242, 199, 188, 247, -242, -242, - -242, -242, 182, -242, 189, -63, -242, 496, 381, -242, - -242, 482, -242, -242, 406, -242, -242, -242, -242, -242, - -242, -242, -242, 294, -242, -232, -242, -242, -242, 393, - -242, -242, -242, 310, -242, -242, -242, -242, -242, -242, - -242, 367, -242, -242, -242, 627, -242, -242, -242, -242, - -242, -242, -242 + -243, -243, -243, -243, 455, -243, -243, 432, -243, -243, + 435, -243, 332, -243, 247, -217, -96, -242, -224, -243, + -243, -243, -243, -243, -243, 153, 160, 198, -243, -243, + -243, -243, 174, -243, 142, -63, -243, 470, 356, -243, + -243, 453, -243, -243, 381, -243, -243, -243, -243, -243, + -243, -243, -243, 250, -243, -233, -243, -243, -243, 366, + -243, -243, -243, 285, -243, -243, -243, -243, -243, -243, + -243, 341, -243, -243, -243, 588, -243, -243, -243, -243, + -243, -243, -243 }; /* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If positive, shift that token. If negative, reduce the rule which number is the opposite. If zero, do what YYDEFACT says. If YYTABLE_NINF, syntax error. */ -#define YYTABLE_NINF -204 +#define YYTABLE_NINF -205 static const short yytable[] = { - 163, 275, 114, 158, 115, 116, 229, 421, 267, 422, - 158, 359, 423, 158, 159, 159, 160, 151, 302, 389, - 158, 159, 207, 160, 119, 158, 159, 208, 253, 158, - 159, 253, 281, 120, 158, 295, 349, 291, 172, 411, - 117, 45, 176, 213, 172, 180, 181, 182, 152, 296, - 297, 260, 412, 239, 152, 240, 298, 262, 263, 190, + 163, 276, 114, 158, 115, 116, 360, 268, 422, 390, + 423, 122, 254, 424, 158, 158, 151, 229, 303, 158, + 82, 158, 159, 159, 160, 158, 159, 117, 160, 45, + 158, 159, 152, 123, 296, 158, 159, 292, 172, 177, + 236, 83, 176, 213, 172, 180, 181, 182, -204, 350, + 237, 85, 141, 152, 47, 46, 338, 314, 142, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, - 201, 202, 203, 204, 205, 206, 347, 264, 341, 350, - 337, 282, 358, 352, 362, 364, 366, 368, 370, 372, - 344, 46, 265, 212, 47, 354, 51, 52, 53, 54, - 212, 170, 55, 161, 396, 360, 291, 424, 118, 340, - 161, 162, 207, 390, 158, 161, 374, 208, 345, 161, - 48, 251, 252, 300, 212, 153, 235, 177, 50, 154, - -203, 59, 60, 122, 338, 266, 236, 163, 388, 313, - 209, 112, 88, 113, 141, 49, 397, 262, 263, 394, - 142, 239, 271, 245, 272, 123, 82, 89, 51, 52, - 53, 54, 210, 301, 55, 56, 92, 264, 399, 273, - 57, 274, 91, -203, 74, 311, 172, 83, 58, 227, - 228, 75, 265, 286, 211, 287, 318, 85, 65, 93, - 94, 288, 67, 59, 60, 178, 68, 171, 134, 135, - 136, 137, 138, 61, 212, 62, 95, 76, 51, 52, - 53, 54, 163, 306, 55, 307, 271, 97, 336, 163, - 57, 262, 263, 77, 96, 266, 63, 357, 58, 361, - 363, 365, 367, 369, 371, 98, 64, 78, 271, 99, - 379, 264, 323, 59, 60, 100, 51, 52, 53, 54, - 65, 66, 55, 61, 67, 62, 265, 102, 68, 101, - 51, 52, 53, 54, 324, 170, 55, 381, 271, 382, - 384, 105, 106, 80, 401, 271, 63, 398, 271, 139, - 408, 59, 60, 107, 108, 163, 64, 109, 110, 81, - 395, 112, 432, 113, 433, 59, 60, 111, 140, 266, - 65, 66, 82, 149, 67, 112, 122, 113, 68, 150, - 156, 157, 168, 325, 326, 327, 328, 329, 330, 78, - 175, 169, 184, 83, 331, 84, 183, 122, 123, 185, - 189, 219, 217, 85, 218, 435, 220, 122, 65, 223, - 224, 226, 67, 233, 238, 243, 68, 241, 143, 123, - 144, 145, 65, 146, 122, 244, 67, 227, 257, 123, - 68, 124, 125, 126, 127, 128, 129, 130, 131, 132, - 133, 134, 135, 136, 137, 138, 123, 122, 259, 246, - 258, 247, 124, 125, 126, 127, 128, 129, 130, 131, - 132, 133, 134, 135, 136, 137, 138, 269, 147, 123, - 248, 270, 249, 122, 136, 137, 138, 279, 280, 124, + 201, 202, 203, 204, 205, 206, 348, 342, 136, 137, + 138, 282, 359, 353, 363, 365, 367, 369, 371, 373, + 345, -204, 351, 212, 355, 118, 51, 52, 53, 54, + 361, 170, 55, 391, 212, 212, 292, 178, 425, 212, + 339, 161, 397, 230, 341, 161, 375, 48, 230, 162, + 161, 252, 253, 346, 143, 161, 144, 145, 301, 146, + 283, 59, 60, 254, 207, 412, 119, 389, 163, 208, + 74, 112, 240, 113, 241, 120, 398, 75, 413, 395, + 207, 49, 158, 261, 153, 208, 297, 298, 154, 51, + 52, 53, 54, 299, 302, 55, 56, 400, 240, 50, + 246, 57, 88, 76, 147, 92, 312, 172, 209, 58, + 227, 228, 263, 264, 287, 89, 288, 319, 65, 77, + 91, 272, 67, 273, 59, 60, 68, 171, 93, 274, + 210, 275, 265, 78, 61, 307, 62, 308, 94, 51, + 52, 53, 54, 163, 272, 55, 337, 266, 95, 97, + 163, 57, 211, 96, 98, 99, 289, 63, 358, 58, + 362, 364, 366, 368, 370, 372, 272, 64, 380, 100, + 102, 101, 212, 324, 59, 60, 105, 51, 52, 53, + 54, 65, 66, 55, 61, 67, 62, 106, 139, 68, + 267, 51, 52, 53, 54, 325, 170, 55, 263, 264, + 382, 272, 383, 385, 272, 149, 399, 63, 263, 264, + 107, 108, 59, 60, 109, 140, 163, 64, 265, 110, + 111, 396, 112, 272, 113, 409, 59, 60, 265, 150, + 156, 65, 66, 266, 157, 67, 112, 122, 113, 68, + 433, 168, 434, 266, 326, 327, 328, 329, 330, 331, + 169, 402, 175, 183, 189, 332, 184, 185, 122, 123, + 217, 218, 219, 220, 223, 224, 436, 234, 226, 65, + 239, 242, 244, 67, 245, 227, 267, 68, 258, 259, + 123, 260, 270, 65, 271, 122, 267, 67, 280, 281, + 285, 68, 124, 125, 126, 127, 128, 129, 130, 131, + 132, 133, 134, 135, 136, 137, 138, 123, 122, 293, + 247, 286, 248, 124, 125, 126, 127, 128, 129, 130, + 131, 132, 133, 134, 135, 136, 137, 138, 305, 306, + 123, 249, 313, 250, 122, 317, 309, 316, 323, 318, + 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, + 134, 135, 136, 137, 138, 322, 123, 122, 333, 334, + 186, 340, 343, 124, 125, 126, 127, 128, 129, 130, + 131, 132, 133, 134, 135, 136, 137, 138, 344, 123, + 349, 356, 122, 243, 374, 376, 377, 381, 386, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, - 135, 136, 137, 138, 284, 123, 122, 285, 292, 186, - 332, 304, 124, 125, 126, 127, 128, 129, 130, 131, - 132, 133, 134, 135, 136, 137, 138, 305, 123, 308, - 312, 122, 242, 315, 316, 322, 317, 321, 124, 125, + 135, 136, 137, 138, 123, 122, 314, 387, 388, 251, + 392, 393, 124, 125, 126, 127, 128, 129, 130, 131, + 132, 133, 134, 135, 136, 137, 138, 123, 401, 406, + 122, 228, 320, 411, 414, 415, 421, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, + 137, 138, 123, 122, 418, 420, 428, 321, 432, 427, + 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, + 134, 135, 136, 137, 138, 123, 431, 155, 247, 122, + 188, 435, 187, 262, 410, 124, 125, 126, 127, 128, + 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, + 357, 123, 122, 249, 419, 437, 394, 179, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, - 136, 137, 138, 123, 122, 333, 342, 339, 250, 343, - 348, 124, 125, 126, 127, 128, 129, 130, 131, 132, - 133, 134, 135, 136, 137, 138, 123, 355, 373, 122, - 375, 319, 376, 380, 313, 385, 124, 125, 126, 127, - 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, - 138, 123, 122, 386, 387, 392, 320, 391, 400, 124, - 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, - 135, 136, 137, 138, 123, 405, 228, 246, 122, 414, - 419, 410, 413, 417, 124, 125, 126, 127, 128, 129, - 130, 131, 132, 133, 134, 135, 136, 137, 138, 420, - 123, 122, 248, 427, 426, 431, 430, 124, 125, 126, + 136, 137, 138, 216, 123, 426, 284, 122, 257, 384, + 277, 354, 304, 122, 87, 125, 126, 127, 128, 129, + 130, 131, 132, 133, 134, 135, 136, 137, 138, 123, + 122, 0, 0, 0, 0, 123, 0, 0, 0, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, - 137, 138, 434, 123, 155, 188, 122, 187, 261, 409, - 356, 418, 425, 179, 125, 126, 127, 128, 129, 130, - 131, 132, 133, 134, 135, 136, 137, 138, 123, 122, - 283, 436, 216, 256, 393, 353, 276, 303, 126, 127, - 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, - 138, 123, 383, 87, 122, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 127, 128, 129, 130, 131, 132, - 133, 134, 135, 136, 137, 138, 123, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 128, 129, - 130, 131, 132, 133, 134, 135, 136, 137, 138, 0, + 137, 138, 123, 0, 0, 122, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 127, 128, 129, 130, 131, + 132, 133, 134, 135, 136, 137, 138, 123, 134, 135, + 136, 137, 138, 0, 0, 0, 0, 0, 0, 128, + 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 130, 131, 132, 133, 134, - 135, 136, 137, 138, 1, 0, 2, 0, 0, 3, - 0, 4, 0, 0, 5, 6, 7, 8, 0, 0, - 9, 0, 0, 10, 0, 0, 0, 0, 0, 0, - 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, - 0, 13, 0, 14, 0, 15, 0, 16, 0, 17, - 0, 0, 0, 0, 0, 0, 0, 18 + 0, 0, 0, 80, 0, 0, 130, 131, 132, 133, + 134, 135, 136, 137, 138, 1, 0, 2, 0, 81, + 3, 0, 4, 0, 0, 5, 6, 7, 8, 0, + 0, 9, 82, 0, 10, 0, 0, 0, 0, 0, + 0, 0, 11, 0, 0, 0, 0, 0, 0, 78, + 0, 0, 0, 83, 0, 84, 0, 0, 0, 0, + 12, 0, 13, 85, 14, 0, 15, 0, 16, 0, + 17, 0, 0, 0, 0, 0, 0, 0, 18 }; static const short yycheck[] = { - 96, 233, 65, 5, 67, 68, 8, 3, 224, 5, - 5, 9, 8, 5, 6, 6, 8, 65, 259, 9, - 5, 6, 3, 8, 3, 5, 6, 8, 82, 5, - 6, 82, 39, 12, 5, 257, 3, 253, 101, 13, - 34, 40, 105, 139, 107, 108, 109, 110, 102, 57, - 58, 102, 26, 102, 102, 104, 64, 3, 4, 122, + 96, 234, 65, 5, 67, 68, 9, 224, 3, 9, + 5, 29, 82, 8, 5, 5, 65, 8, 260, 5, + 49, 5, 6, 6, 8, 5, 6, 34, 8, 40, + 5, 6, 102, 51, 258, 5, 6, 254, 101, 28, + 32, 70, 105, 139, 107, 108, 109, 110, 3, 3, + 42, 80, 3, 102, 35, 3, 22, 12, 9, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, - 133, 134, 135, 136, 137, 138, 308, 23, 300, 46, - 22, 88, 323, 315, 325, 326, 327, 328, 329, 330, - 306, 3, 38, 95, 35, 317, 3, 4, 5, 6, - 95, 8, 9, 95, 95, 103, 322, 103, 102, 104, - 95, 103, 3, 103, 5, 95, 332, 8, 103, 95, - 34, 184, 185, 103, 95, 63, 32, 28, 62, 67, - 3, 38, 39, 29, 76, 81, 42, 233, 360, 12, - 31, 48, 74, 50, 3, 35, 387, 3, 4, 381, - 9, 102, 102, 104, 104, 51, 49, 3, 3, 4, - 5, 6, 53, 259, 9, 10, 101, 23, 390, 102, - 15, 104, 0, 46, 3, 271, 239, 70, 23, 5, - 6, 10, 38, 246, 75, 248, 282, 80, 95, 43, - 3, 47, 99, 38, 39, 96, 103, 104, 94, 95, - 96, 97, 98, 48, 95, 50, 3, 36, 3, 4, - 5, 6, 308, 102, 9, 104, 102, 3, 104, 315, - 15, 3, 4, 52, 103, 81, 71, 323, 23, 325, - 326, 327, 328, 329, 330, 3, 81, 66, 102, 3, - 104, 23, 17, 38, 39, 3, 3, 4, 5, 6, - 95, 96, 9, 48, 99, 50, 38, 46, 103, 103, - 3, 4, 5, 6, 39, 8, 9, 102, 102, 104, - 104, 103, 103, 20, 56, 102, 71, 104, 102, 88, - 104, 38, 39, 103, 103, 381, 81, 103, 103, 36, - 386, 48, 102, 50, 104, 38, 39, 103, 88, 81, - 95, 96, 49, 74, 99, 48, 29, 50, 103, 79, - 3, 73, 60, 88, 89, 90, 91, 92, 93, 66, - 5, 82, 103, 70, 99, 72, 104, 29, 51, 103, - 3, 44, 88, 80, 88, 431, 3, 29, 95, 3, - 103, 62, 99, 102, 38, 3, 103, 102, 3, 51, - 5, 6, 95, 8, 29, 104, 99, 5, 103, 51, - 103, 84, 85, 86, 87, 88, 89, 90, 91, 92, - 93, 94, 95, 96, 97, 98, 51, 29, 88, 102, - 45, 104, 84, 85, 86, 87, 88, 89, 90, 91, - 92, 93, 94, 95, 96, 97, 98, 78, 53, 51, - 102, 3, 104, 29, 96, 97, 98, 104, 68, 84, + 133, 134, 135, 136, 137, 138, 309, 301, 96, 97, + 98, 39, 324, 316, 326, 327, 328, 329, 330, 331, + 307, 46, 46, 95, 318, 102, 3, 4, 5, 6, + 103, 8, 9, 103, 95, 95, 323, 96, 103, 95, + 76, 95, 95, 104, 104, 95, 333, 34, 104, 103, + 95, 184, 185, 103, 3, 95, 5, 6, 103, 8, + 88, 38, 39, 82, 3, 13, 3, 361, 234, 8, + 3, 48, 102, 50, 104, 12, 388, 10, 26, 382, + 3, 35, 5, 102, 63, 8, 57, 58, 67, 3, + 4, 5, 6, 64, 260, 9, 10, 391, 102, 62, + 104, 15, 74, 36, 53, 101, 272, 240, 31, 23, + 5, 6, 3, 4, 247, 3, 249, 283, 95, 52, + 0, 102, 99, 104, 38, 39, 103, 104, 43, 102, + 53, 104, 23, 66, 48, 102, 50, 104, 3, 3, + 4, 5, 6, 309, 102, 9, 104, 38, 3, 3, + 316, 15, 75, 103, 3, 3, 47, 71, 324, 23, + 326, 327, 328, 329, 330, 331, 102, 81, 104, 3, + 46, 103, 95, 17, 38, 39, 103, 3, 4, 5, + 6, 95, 96, 9, 48, 99, 50, 103, 88, 103, + 81, 3, 4, 5, 6, 39, 8, 9, 3, 4, + 102, 102, 104, 104, 102, 74, 104, 71, 3, 4, + 103, 103, 38, 39, 103, 88, 382, 81, 23, 103, + 103, 387, 48, 102, 50, 104, 38, 39, 23, 79, + 3, 95, 96, 38, 73, 99, 48, 29, 50, 103, + 102, 60, 104, 38, 88, 89, 90, 91, 92, 93, + 82, 56, 5, 104, 3, 99, 103, 103, 29, 51, + 88, 88, 44, 3, 3, 103, 432, 102, 62, 95, + 38, 102, 3, 99, 104, 5, 81, 103, 103, 45, + 51, 88, 78, 95, 3, 29, 81, 99, 104, 68, + 5, 103, 84, 85, 86, 87, 88, 89, 90, 91, + 92, 93, 94, 95, 96, 97, 98, 51, 29, 37, + 102, 104, 104, 84, 85, 86, 87, 88, 89, 90, + 91, 92, 93, 94, 95, 96, 97, 98, 103, 103, + 51, 102, 8, 104, 29, 8, 103, 102, 85, 103, + 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, + 94, 95, 96, 97, 98, 103, 51, 29, 18, 83, + 104, 57, 96, 84, 85, 86, 87, 88, 89, 90, + 91, 92, 93, 94, 95, 96, 97, 98, 104, 51, + 102, 8, 29, 104, 39, 37, 55, 104, 104, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, - 95, 96, 97, 98, 5, 51, 29, 104, 37, 104, - 18, 103, 84, 85, 86, 87, 88, 89, 90, 91, - 92, 93, 94, 95, 96, 97, 98, 103, 51, 103, - 8, 29, 104, 102, 8, 85, 103, 103, 84, 85, + 95, 96, 97, 98, 51, 29, 12, 85, 85, 104, + 55, 18, 84, 85, 86, 87, 88, 89, 90, 91, + 92, 93, 94, 95, 96, 97, 98, 51, 18, 54, + 29, 6, 104, 103, 102, 3, 102, 84, 85, 86, + 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, + 97, 98, 51, 29, 104, 88, 3, 104, 88, 103, + 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, + 94, 95, 96, 97, 98, 51, 8, 92, 102, 29, + 118, 104, 117, 221, 401, 84, 85, 86, 87, 88, + 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, + 323, 51, 29, 102, 414, 433, 378, 107, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, - 96, 97, 98, 51, 29, 83, 96, 57, 104, 104, - 102, 84, 85, 86, 87, 88, 89, 90, 91, 92, - 93, 94, 95, 96, 97, 98, 51, 8, 39, 29, - 37, 104, 55, 104, 12, 104, 84, 85, 86, 87, - 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, - 98, 51, 29, 85, 85, 18, 104, 55, 18, 84, - 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, - 95, 96, 97, 98, 51, 54, 6, 102, 29, 3, - 88, 103, 102, 104, 84, 85, 86, 87, 88, 89, - 90, 91, 92, 93, 94, 95, 96, 97, 98, 102, - 51, 29, 102, 3, 103, 88, 8, 84, 85, 86, + 96, 97, 98, 140, 51, 421, 240, 29, 217, 349, + 234, 316, 261, 29, 16, 85, 86, 87, 88, 89, + 90, 91, 92, 93, 94, 95, 96, 97, 98, 51, + 29, -1, -1, -1, -1, 51, -1, -1, -1, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, - 97, 98, 104, 51, 92, 118, 29, 117, 221, 400, - 322, 413, 420, 107, 85, 86, 87, 88, 89, 90, - 91, 92, 93, 94, 95, 96, 97, 98, 51, 29, - 239, 432, 140, 217, 377, 315, 233, 260, 86, 87, - 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, - 98, 51, 348, 16, 29, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 87, 88, 89, 90, 91, 92, - 93, 94, 95, 96, 97, 98, 51, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 88, 89, - 90, 91, 92, 93, 94, 95, 96, 97, 98, -1, + 97, 98, 51, -1, -1, 29, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 87, 88, 89, 90, 91, + 92, 93, 94, 95, 96, 97, 98, 51, 94, 95, + 96, 97, 98, -1, -1, -1, -1, -1, -1, 88, + 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 90, 91, 92, 93, 94, - 95, 96, 97, 98, 14, -1, 16, -1, -1, 19, - -1, 21, -1, -1, 24, 25, 26, 27, -1, -1, - 30, -1, -1, 33, -1, -1, -1, -1, -1, -1, - -1, 41, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 59, - -1, 61, -1, 63, -1, 65, -1, 67, -1, 69, - -1, -1, -1, -1, -1, -1, -1, 77 + -1, -1, -1, 20, -1, -1, 90, 91, 92, 93, + 94, 95, 96, 97, 98, 14, -1, 16, -1, 36, + 19, -1, 21, -1, -1, 24, 25, 26, 27, -1, + -1, 30, 49, -1, 33, -1, -1, -1, -1, -1, + -1, -1, 41, -1, -1, -1, -1, -1, -1, 66, + -1, -1, -1, 70, -1, 72, -1, -1, -1, -1, + 59, -1, 61, 80, 63, -1, 65, -1, 67, -1, + 69, -1, -1, -1, -1, -1, -1, -1, 77 }; /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing @@ -1027,27 +1028,27 @@ 140, 140, 140, 140, 140, 140, 140, 3, 8, 31, 53, 75, 95, 121, 149, 150, 146, 88, 88, 44, 3, 175, 176, 3, 103, 155, 62, 5, 6, 8, - 121, 123, 165, 102, 166, 32, 42, 183, 38, 102, - 104, 102, 104, 3, 104, 104, 102, 104, 102, 104, - 104, 140, 140, 82, 116, 117, 149, 103, 45, 88, - 102, 117, 3, 4, 23, 38, 81, 120, 156, 78, - 3, 102, 104, 102, 104, 160, 164, 167, 168, 104, - 68, 39, 88, 143, 5, 104, 140, 140, 47, 118, - 119, 120, 37, 124, 125, 123, 57, 58, 64, 181, - 103, 121, 122, 176, 103, 103, 102, 104, 103, 157, - 158, 121, 8, 12, 169, 102, 8, 103, 121, 104, - 104, 103, 85, 17, 39, 88, 89, 90, 91, 92, - 93, 99, 18, 83, 126, 127, 104, 22, 76, 57, - 104, 123, 96, 104, 120, 103, 159, 160, 102, 3, - 46, 170, 160, 168, 123, 8, 119, 121, 122, 9, - 103, 121, 122, 121, 122, 121, 122, 121, 122, 121, - 122, 121, 122, 39, 120, 37, 55, 128, 129, 104, - 104, 102, 104, 158, 104, 104, 85, 85, 123, 9, - 103, 55, 18, 132, 160, 121, 95, 122, 104, 123, - 18, 56, 120, 130, 131, 54, 134, 135, 104, 130, - 103, 13, 26, 102, 3, 136, 137, 104, 131, 88, - 102, 3, 5, 8, 103, 137, 103, 3, 138, 139, - 8, 88, 102, 104, 104, 121, 139 + 104, 121, 123, 165, 102, 166, 32, 42, 183, 38, + 102, 104, 102, 104, 3, 104, 104, 102, 104, 102, + 104, 104, 140, 140, 82, 116, 117, 149, 103, 45, + 88, 102, 117, 3, 4, 23, 38, 81, 120, 156, + 78, 3, 102, 104, 102, 104, 160, 164, 167, 168, + 104, 68, 39, 88, 143, 5, 104, 140, 140, 47, + 118, 119, 120, 37, 124, 125, 123, 57, 58, 64, + 181, 103, 121, 122, 176, 103, 103, 102, 104, 103, + 157, 158, 121, 8, 12, 169, 102, 8, 103, 121, + 104, 104, 103, 85, 17, 39, 88, 89, 90, 91, + 92, 93, 99, 18, 83, 126, 127, 104, 22, 76, + 57, 104, 123, 96, 104, 120, 103, 159, 160, 102, + 3, 46, 170, 160, 168, 123, 8, 119, 121, 122, + 9, 103, 121, 122, 121, 122, 121, 122, 121, 122, + 121, 122, 121, 122, 39, 120, 37, 55, 128, 129, + 104, 104, 102, 104, 158, 104, 104, 85, 85, 123, + 9, 103, 55, 18, 132, 160, 121, 95, 122, 104, + 123, 18, 56, 120, 130, 131, 54, 134, 135, 104, + 130, 103, 13, 26, 102, 3, 136, 137, 104, 131, + 88, 102, 3, 5, 8, 103, 137, 103, 3, 138, + 139, 8, 88, 102, 104, 104, 121, 139 }; #if ! defined (YYSIZE_T) && defined (__SIZE_TYPE__) @@ -2371,11 +2372,16 @@ case 188: - { yyval.m_iInstype = TOK_CONST_MVA; yyval.m_iValue = yyvsp[-1].m_pValues->GetLength(); yyval.m_pValues = yyvsp[-1].m_pValues; ;} + { yyval.m_iInstype = TOK_CONST_MVA; yyval.m_pValues = yyvsp[-1].m_pValues; ;} break; case 189: + { yyval.m_iInstype = TOK_CONST_MVA; ;} + break; + + case 190: + { pParser->m_pStmt->m_eStmt = STMT_DELETE; pParser->m_pStmt->m_sIndex = yyvsp[-4].m_sValue; @@ -2383,7 +2389,7 @@ ;} break; - case 190: + case 191: { pParser->m_pStmt->m_eStmt = STMT_DELETE; @@ -2393,7 +2399,7 @@ ;} break; - case 191: + case 192: { pParser->m_pStmt->m_eStmt = STMT_CALL; @@ -2401,28 +2407,28 @@ ;} break; - case 192: + case 193: { AddInsval ( pParser->m_pStmt->m_dInsertValues, yyvsp[0] ); ;} break; - case 193: + case 194: { AddInsval ( pParser->m_pStmt->m_dInsertValues, yyvsp[0] ); ;} break; - case 195: + case 196: { yyval.m_iInstype = TOK_CONST_STRINGS; ;} break; - case 196: + case 197: { // FIXME? for now, one such array per CALL statement, tops @@ -2435,14 +2441,14 @@ ;} break; - case 197: + case 198: { pParser->m_pStmt->m_dCallStrings.Add ( yyvsp[0].m_sValue ); ;} break; - case 200: + case 201: { assert ( pParser->m_pStmt->m_dCallOptNames.GetLength()==1 ); @@ -2450,7 +2456,7 @@ ;} break; - case 202: + case 203: { pParser->m_pStmt->m_dCallOptNames.Add ( yyvsp[0].m_sValue ); @@ -2458,12 +2464,12 @@ ;} break; - case 206: + case 207: { yyval.m_sValue = "limit"; ;} break; - case 207: + case 208: { pParser->m_pStmt->m_eStmt = STMT_DESC; @@ -2471,12 +2477,12 @@ ;} break; - case 210: + case 211: { pParser->m_pStmt->m_eStmt = STMT_SHOW_TABLES; ;} break; - case 211: + case 212: { if ( !pParser->UpdateStatement ( &yyvsp[-3] ) ) @@ -2484,56 +2490,57 @@ ;} break; - case 214: + case 215: { pParser->UpdateAttr ( yyvsp[-2].m_sValue, &yyvsp[0] ); ;} break; - case 215: + case 216: { pParser->UpdateAttr ( yyvsp[-2].m_sValue, &yyvsp[0], SPH_ATTR_FLOAT); ;} break; - case 216: + case 217: { pParser->UpdateMVAAttr ( yyvsp[-4].m_sValue, yyvsp[-1] ); ;} break; - case 217: + case 218: { - pParser->UpdateAttr ( yyvsp[-3].m_sValue, NULL, SPH_ATTR_UINT32SET ); + SqlNode_t tNoValues; + pParser->UpdateMVAAttr ( yyvsp[-3].m_sValue, tNoValues ); ;} break; - case 218: + case 219: { pParser->m_pStmt->m_eStmt = STMT_SHOW_VARIABLES; ;} break; - case 219: + case 220: { pParser->m_pStmt->m_eStmt = STMT_DUMMY; ;} break; - case 220: + case 221: { pParser->m_pStmt->m_eStmt = STMT_DUMMY; ;} break; - case 228: + case 229: { SqlStmt_t & tStmt = *pParser->m_pStmt; @@ -2544,17 +2551,17 @@ ;} break; - case 229: + case 230: { yyval.m_iValue = SPH_ATTR_INTEGER; ;} break; - case 230: + case 231: { yyval.m_iValue = SPH_ATTR_FLOAT; ;} break; - case 231: + case 232: { SqlStmt_t & tStmt = *pParser->m_pStmt; @@ -2563,7 +2570,7 @@ ;} break; - case 232: + case 233: { SqlStmt_t & tStmt = *pParser->m_pStmt; @@ -2573,7 +2580,7 @@ ;} break; - case 233: + case 234: { SqlStmt_t & tStmt = *pParser->m_pStmt; @@ -2582,7 +2589,7 @@ ;} break; - case 234: + case 235: { pParser->m_pStmt->m_eStmt = STMT_DUMMY; diff -Nru sphinxsearch-0.9.9+2.0.2beta/src/yysphinxquery.c sphinxsearch-2.0.4/src/yysphinxquery.c --- sphinxsearch-0.9.9+2.0.2beta/src/yysphinxquery.c 2011-07-19 15:55:08.000000000 +0000 +++ sphinxsearch-2.0.4/src/yysphinxquery.c 2012-02-21 14:52:21.000000000 +0000 @@ -222,18 +222,18 @@ #endif /* YYFINAL -- State number of the termination state. */ -#define YYFINAL 38 +#define YYFINAL 9 /* YYLAST -- Last index in YYTABLE. */ -#define YYLAST 136 +#define YYLAST 110 /* YYNTOKENS -- Number of terminals. */ #define YYNTOKENS 20 /* YYNNTS -- Number of nonterminals. */ #define YYNNTS 15 /* YYNRULES -- Number of rules. */ -#define YYNRULES 46 +#define YYNRULES 45 /* YYNRULES -- Number of states. */ -#define YYNSTATES 72 +#define YYNSTATES 69 /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ #define YYUNDEFTOK 2 @@ -248,16 +248,16 @@ 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 19, 2, 11, 2, 2, 2, - 13, 14, 2, 2, 2, 15, 2, 18, 2, 2, + 2, 2, 2, 2, 13, 2, 18, 2, 2, 2, + 16, 17, 2, 2, 2, 11, 2, 15, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 12, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 19, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 16, 2, 17, 2, 2, 2, + 2, 2, 2, 2, 12, 2, 14, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, @@ -279,40 +279,40 @@ YYRHS. */ static const unsigned char yyprhs[] = { - 0, 0, 3, 5, 7, 9, 11, 14, 17, 21, - 23, 25, 27, 29, 31, 33, 35, 37, 40, 42, - 46, 50, 54, 58, 62, 64, 66, 68, 71, 76, - 81, 85, 91, 97, 101, 103, 106, 109, 111, 115, - 117, 120, 124, 126, 130, 134, 136 + 0, 0, 3, 5, 7, 10, 11, 13, 15, 17, + 21, 25, 27, 31, 34, 39, 41, 43, 45, 48, + 53, 58, 62, 68, 74, 78, 80, 83, 86, 90, + 92, 94, 98, 102, 106, 110, 112, 116, 118, 121, + 123, 125, 127, 129, 131, 133 }; /* YYRHS -- A `-1'-separated list of the rules' RHS. */ static const yysigned_char yyrhs[] = { - 21, 0, -1, 34, -1, 3, -1, 5, -1, 22, - -1, 22, 11, -1, 12, 22, -1, 12, 22, 11, - -1, 23, -1, 13, -1, 14, -1, 15, -1, 16, - -1, 17, -1, 18, -1, 24, -1, 25, 24, -1, - 23, -1, 19, 25, 19, -1, 26, 9, 26, -1, - 27, 9, 26, -1, 26, 10, 26, -1, 28, 10, - 26, -1, 23, -1, 27, -1, 28, -1, 19, 19, - -1, 19, 19, 17, 5, -1, 19, 19, 18, 5, - -1, 19, 25, 19, -1, 19, 25, 19, 17, 5, - -1, 19, 25, 19, 18, 5, -1, 13, 34, 14, - -1, 29, -1, 6, 29, -1, 7, 29, -1, 30, - -1, 31, 16, 30, -1, 31, -1, 15, 31, -1, - 6, 15, 31, -1, 32, -1, 33, 8, 32, -1, - 33, 4, 32, -1, 33, -1, 34, 33, -1 + 21, 0, -1, 22, -1, 24, -1, 22, 24, -1, + -1, 6, -1, 7, -1, 25, -1, 24, 8, 25, + -1, 24, 4, 25, -1, 26, -1, 23, 11, 26, + -1, 23, 27, -1, 26, 12, 23, 27, -1, 28, + -1, 30, -1, 31, -1, 13, 13, -1, 13, 13, + 14, 5, -1, 13, 13, 15, 5, -1, 13, 33, + 13, -1, 13, 33, 13, 14, 5, -1, 13, 33, + 13, 15, 5, -1, 16, 22, 17, -1, 29, -1, + 29, 18, -1, 19, 29, -1, 19, 29, 18, -1, + 3, -1, 5, -1, 32, 9, 32, -1, 30, 9, + 32, -1, 32, 10, 32, -1, 31, 10, 32, -1, + 28, -1, 13, 33, 13, -1, 34, -1, 33, 34, + -1, 28, -1, 16, -1, 17, -1, 11, -1, 12, + -1, 14, -1, 15, -1 }; /* YYRLINE[YYN] -- source line where rule number YYN was defined. */ static const unsigned char yyrline[] = { - 0, 54, 54, 58, 59, 63, 64, 65, 66, 70, - 71, 72, 73, 74, 75, 76, 80, 81, 85, 86, - 90, 91, 95, 96, 100, 101, 102, 103, 104, 105, - 106, 107, 108, 109, 113, 114, 115, 119, 120, 124, - 125, 126, 130, 131, 132, 136, 137 + 0, 53, 53, 57, 58, 61, 63, 64, 68, 69, + 70, 74, 75, 79, 80, 84, 85, 86, 87, 88, + 89, 90, 91, 92, 93, 98, 99, 100, 101, 105, + 106, 110, 111, 115, 116, 120, 121, 125, 126, 130, + 131, 132, 133, 134, 135, 136 }; #endif @@ -323,10 +323,10 @@ { "$end", "error", "$undefined", "TOK_KEYWORD", "TOK_NEAR", "TOK_INT", "TOK_FIELDLIMIT", "TOK_ZONE", "TOK_BEFORE", "TOK_SENTENCE", - "TOK_PARAGRAPH", "'$'", "'^'", "'('", "')'", "'-'", "'|'", "'~'", "'/'", - "'\"'", "$accept", "query", "rawkeyword", "keyword", "phrasetoken", - "phrase", "sp_item", "sentence", "paragraph", "atom", "atomf", "orlist", - "orlistf", "beforelist", "expr", 0 + "TOK_PARAGRAPH", "'-'", "'|'", "'\"'", "'~'", "'/'", "'('", "')'", + "'$'", "'^'", "$accept", "query", "expr", "tok_limiter", "beforelist", + "orlistf", "orlist", "atom", "keyword", "rawkeyword", "sentence", + "paragraph", "sp_item", "phrase", "phrasetoken", 0 }; #endif @@ -336,28 +336,28 @@ static const unsigned short yytoknum[] = { 0, 256, 257, 258, 259, 260, 261, 262, 263, 264, - 265, 36, 94, 40, 41, 45, 124, 126, 47, 34 + 265, 45, 124, 34, 126, 47, 40, 41, 36, 94 }; # endif /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ static const unsigned char yyr1[] = { - 0, 20, 21, 22, 22, 23, 23, 23, 23, 24, - 24, 24, 24, 24, 24, 24, 25, 25, 26, 26, - 27, 27, 28, 28, 29, 29, 29, 29, 29, 29, - 29, 29, 29, 29, 30, 30, 30, 31, 31, 32, - 32, 32, 33, 33, 33, 34, 34 + 0, 20, 21, 22, 22, 23, 23, 23, 24, 24, + 24, 25, 25, 26, 26, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 28, 28, 28, 28, 29, + 29, 30, 30, 31, 31, 32, 32, 33, 33, 34, + 34, 34, 34, 34, 34, 34 }; /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ static const unsigned char yyr2[] = { - 0, 2, 1, 1, 1, 1, 2, 2, 3, 1, - 1, 1, 1, 1, 1, 1, 1, 2, 1, 3, - 3, 3, 3, 3, 1, 1, 1, 2, 4, 4, - 3, 5, 5, 3, 1, 2, 2, 1, 3, 1, - 2, 3, 1, 3, 3, 1, 2 + 0, 2, 1, 1, 2, 0, 1, 1, 1, 3, + 3, 1, 3, 2, 4, 1, 1, 1, 2, 4, + 4, 3, 5, 5, 3, 1, 2, 2, 3, 1, + 1, 3, 3, 3, 3, 1, 3, 1, 2, 1, + 1, 1, 1, 1, 1, 1 }; /* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state @@ -365,98 +365,91 @@ means the default is an error. */ static const unsigned char yydefact[] = { - 0, 3, 4, 0, 0, 0, 0, 0, 0, 0, - 5, 24, 0, 25, 26, 34, 37, 39, 42, 45, - 2, 0, 35, 36, 7, 0, 0, 40, 10, 11, - 12, 13, 14, 15, 27, 9, 16, 0, 1, 6, - 0, 0, 0, 0, 0, 0, 0, 46, 41, 8, - 33, 0, 0, 30, 17, 0, 18, 20, 22, 21, - 23, 38, 44, 43, 28, 29, 0, 0, 0, 31, - 32, 19 + 5, 6, 7, 0, 5, 0, 3, 8, 11, 1, + 4, 29, 30, 5, 0, 5, 0, 13, 15, 25, + 16, 17, 0, 5, 5, 5, 0, 12, 42, 43, + 18, 44, 45, 40, 41, 39, 0, 37, 5, 27, + 26, 0, 0, 0, 0, 10, 9, 0, 0, 0, + 21, 38, 24, 28, 0, 35, 32, 34, 31, 33, + 14, 19, 20, 0, 0, 0, 22, 23, 36 }; /* YYDEFGOTO[NTERM-NUM]. */ static const yysigned_char yydefgoto[] = { - -1, 9, 10, 11, 36, 37, 12, 13, 14, 15, - 16, 17, 18, 19, 20 + -1, 3, 4, 5, 6, 7, 8, 17, 35, 19, + 20, 21, 22, 36, 37 }; /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing STATE-NUM. */ -#define YYPACT_NINF -33 +#define YYPACT_NINF -35 static const yysigned_char yypact[] = { - 81, -33, -33, 103, 107, 20, 81, 92, 1, 27, - 42, 36, 41, 22, 45, -33, -33, 54, -33, 18, - 81, 92, -33, -33, 64, 66, 107, 54, -33, -33, - -33, -33, -33, -33, 74, -33, -33, 25, -33, -33, - 71, 71, 71, 71, 92, 81, 81, 18, 54, -33, - -33, 72, 77, 39, -33, 118, -33, -33, -33, -33, - -33, -33, -33, -33, -33, -33, 84, 96, 49, -33, - -33, -33 + 20, -35, -35, 9, 40, 83, 21, -35, 22, -35, + 21, -35, -35, 20, 0, 20, 1, -35, 35, -11, + 19, 71, 65, 20, 20, 20, 87, 22, -35, -35, + 62, -35, -35, -35, -35, -35, 38, -35, 16, 12, + -35, 5, 5, 5, 5, -35, -35, 87, 43, 58, + 95, -35, -35, -35, 68, -35, -35, -35, -35, -35, + -35, -35, -35, 73, 84, 53, -35, -35, -35 }; /* YYPGOTO[NTERM-NUM]. */ static const yysigned_char yypgoto[] = { - -33, -33, 97, -8, -32, 48, -31, -33, -33, -2, - 63, 0, 13, -17, 108 + -35, -35, 76, 7, -3, 74, 80, 48, -5, 85, + -35, -35, 18, 54, -34 }; /* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If positive, shift that token. If negative, reduce the rule which number is the opposite. If zero, do what YYDEFACT says. If YYTABLE_NINF, syntax error. */ -#define YYTABLE_NINF -20 +#define YYTABLE_NINF -37 static const yysigned_char yytable[] = { - 35, 22, 23, 47, 1, 54, 2, 27, 47, 57, - 58, 59, 60, 5, 28, 29, 30, 31, 32, 33, - 34, 48, 45, 1, 22, 2, 46, 38, 1, 35, - 2, 42, 56, 56, 56, 56, 54, 5, 28, 29, - 30, 31, 32, 33, 53, -18, -18, 35, -19, -19, - 40, 41, 1, 39, 2, 43, 66, 67, 62, 63, - 35, 5, 28, 29, 30, 31, 32, 33, 71, 1, - 44, 2, 3, 4, 1, 49, 2, 64, 5, 6, - 50, 7, 65, 5, 1, 8, 2, 3, 4, 69, - 55, 51, 52, 5, 6, 1, 7, 2, 26, 4, - 8, 70, 24, 68, 5, 6, 1, 61, 2, 0, - 1, 8, 2, 0, 25, 5, 6, 0, 21, 5, - 6, 1, 8, 2, 0, 0, 8, 0, 0, 0, - 5, 28, 29, 30, 31, 32, 33 + 18, 10, 51, 11, 11, 12, 12, 40, 11, 9, + 12, 28, 29, 30, 31, 32, 33, 34, 54, 16, + 26, 18, 1, 2, 16, 23, 1, 2, 41, 24, + 53, 51, 47, 52, 25, 10, 55, 55, 55, 55, + -2, 11, 18, 12, -35, -35, 1, 2, 61, 28, + 29, 50, 31, 32, 33, 34, 11, 16, 12, 56, + 57, 58, 59, 62, 28, 29, 68, 31, 32, 33, + 34, 11, 16, 12, 43, 44, 48, 49, 66, 28, + 29, 42, 31, 32, 33, 34, 11, 16, 12, 67, + 11, 38, 12, 27, 13, 60, 14, 45, 46, 15, + 14, 39, 16, 15, -36, -36, 16, 0, 65, 63, + 64 }; static const yysigned_char yycheck[] = { - 8, 3, 4, 20, 3, 37, 5, 7, 25, 40, - 41, 42, 43, 12, 13, 14, 15, 16, 17, 18, - 19, 21, 4, 3, 26, 5, 8, 0, 3, 37, - 5, 9, 40, 41, 42, 43, 68, 12, 13, 14, - 15, 16, 17, 18, 19, 9, 10, 55, 9, 10, - 9, 10, 3, 11, 5, 10, 17, 18, 45, 46, - 68, 12, 13, 14, 15, 16, 17, 18, 19, 3, - 16, 5, 6, 7, 3, 11, 5, 5, 12, 13, - 14, 15, 5, 12, 3, 19, 5, 6, 7, 5, - 19, 17, 18, 12, 13, 3, 15, 5, 6, 7, - 19, 5, 5, 55, 12, 13, 3, 44, 5, -1, - 3, 19, 5, -1, 6, 12, 13, -1, 15, 12, - 13, 3, 19, 5, -1, -1, 19, -1, -1, -1, - 12, 13, 14, 15, 16, 17, 18 + 5, 4, 36, 3, 3, 5, 5, 18, 3, 0, + 5, 11, 12, 13, 14, 15, 16, 17, 13, 19, + 13, 26, 6, 7, 19, 4, 6, 7, 9, 8, + 18, 65, 25, 17, 12, 38, 41, 42, 43, 44, + 0, 3, 47, 5, 9, 10, 6, 7, 5, 11, + 12, 13, 14, 15, 16, 17, 3, 19, 5, 41, + 42, 43, 44, 5, 11, 12, 13, 14, 15, 16, + 17, 3, 19, 5, 9, 10, 14, 15, 5, 11, + 12, 10, 14, 15, 16, 17, 3, 19, 5, 5, + 3, 15, 5, 13, 11, 47, 13, 23, 24, 16, + 13, 16, 19, 16, 9, 10, 19, -1, 54, 14, + 15 }; /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing symbol of state STATE-NUM. */ static const unsigned char yystos[] = { - 0, 3, 5, 6, 7, 12, 13, 15, 19, 21, - 22, 23, 26, 27, 28, 29, 30, 31, 32, 33, - 34, 15, 29, 29, 22, 34, 6, 31, 13, 14, - 15, 16, 17, 18, 19, 23, 24, 25, 0, 11, - 9, 10, 9, 10, 16, 4, 8, 33, 31, 11, - 14, 17, 18, 19, 24, 19, 23, 26, 26, 26, - 26, 30, 32, 32, 5, 5, 17, 18, 25, 5, - 5, 19 + 0, 6, 7, 21, 22, 23, 24, 25, 26, 0, + 24, 3, 5, 11, 13, 16, 19, 27, 28, 29, + 30, 31, 32, 4, 8, 12, 23, 26, 11, 12, + 13, 14, 15, 16, 17, 28, 33, 34, 22, 29, + 18, 9, 10, 9, 10, 25, 25, 23, 14, 15, + 13, 34, 17, 18, 13, 28, 32, 32, 32, 32, + 27, 5, 5, 14, 15, 33, 5, 5, 13 }; #if ! defined (YYSIZE_T) && defined (__SIZE_TYPE__) @@ -1077,57 +1070,57 @@ case 4: - { yyval.pNode = pParser->AddKeyword ( ( yyvsp[0].tInt.iStrIndex>=0 ) ? pParser->m_dIntTokens[yyvsp[0].tInt.iStrIndex].cstr() : NULL ); ;} + { yyval.pNode = pParser->AddOp ( SPH_QUERY_AND, yyvsp[-1].pNode, yyvsp[0].pNode ); ;} break; case 6: - { yyval.pNode = yyvsp[-1].pNode; assert ( yyval.pNode->m_dWords.GetLength()==1 ); yyval.pNode->m_dWords[0].m_bFieldEnd = true; ;} + { pParser->SetFieldSpec ( yyvsp[0].tFieldLimit.dMask, yyvsp[0].tFieldLimit.iMaxPos ); ;} break; case 7: - { yyval.pNode = yyvsp[0].pNode; assert ( yyval.pNode->m_dWords.GetLength()==1 ); yyval.pNode->m_dWords[0].m_bFieldStart = true; ;} + { pParser->SetZoneVec ( yyvsp[0].iZoneVec ); ;} break; case 8: - { yyval.pNode = yyvsp[-1].pNode; assert ( yyval.pNode->m_dWords.GetLength()==1 ); yyval.pNode->m_dWords[0].m_bFieldStart = true; yyval.pNode->m_dWords[0].m_bFieldEnd = true; ;} + { yyval.pNode = yyvsp[0].pNode; ;} break; case 9: - { yyval.pNode = yyvsp[0].pNode; ;} + { yyval.pNode = pParser->AddOp ( SPH_QUERY_BEFORE, yyvsp[-2].pNode, yyvsp[0].pNode ); ;} break; case 10: - { yyval.pNode = NULL; ;} + { yyval.pNode = pParser->AddOp ( SPH_QUERY_NEAR, yyvsp[-2].pNode, yyvsp[0].pNode, yyvsp[-1].tInt.iValue ); ;} break; case 11: - { yyval.pNode = NULL; ;} + { yyval.pNode = yyvsp[0].pNode; ;} break; case 12: - { yyval.pNode = NULL; ;} + { yyval.pNode = pParser->AddOp ( SPH_QUERY_NOT, yyvsp[0].pNode, NULL ); ;} break; case 13: - { yyval.pNode = NULL; ;} + { yyval.pNode = yyvsp[0].pNode; ;} break; case 14: - { yyval.pNode = NULL; ;} + { yyval.pNode = pParser->AddOp ( SPH_QUERY_OR, yyvsp[-3].pNode, yyvsp[0].pNode ); ;} break; case 15: - { yyval.pNode = NULL; ;} + { yyval.pNode = yyvsp[0].pNode; ;} break; case 16: @@ -1137,102 +1130,97 @@ case 17: - { yyval.pNode = pParser->AddKeyword ( yyvsp[-1].pNode, yyvsp[0].pNode ); ;} + { yyval.pNode = yyvsp[0].pNode; ;} break; case 18: - { yyval.pNode = yyvsp[0].pNode; ;} + { yyval.pNode = NULL; ;} break; case 19: - { yyval.pNode = yyvsp[-1].pNode; if ( yyval.pNode ) { assert ( yyval.pNode->m_dWords.GetLength() ); yyval.pNode->SetOp ( SPH_QUERY_PHRASE); } ;} + { yyval.pNode = NULL; ;} break; case 20: - { yyval.pNode = pParser->AddOp ( SPH_QUERY_SENTENCE, yyvsp[-2].pNode, yyvsp[0].pNode ); ;} + { yyval.pNode = NULL; ;} break; case 21: - { yyval.pNode = pParser->AddOp ( SPH_QUERY_SENTENCE, yyvsp[-2].pNode, yyvsp[0].pNode ); ;} + { yyval.pNode = yyvsp[-1].pNode; if ( yyval.pNode ) { assert ( yyval.pNode->m_dWords.GetLength() ); yyval.pNode->SetOp ( SPH_QUERY_PHRASE); } ;} break; case 22: - { yyval.pNode = pParser->AddOp ( SPH_QUERY_PARAGRAPH, yyvsp[-2].pNode, yyvsp[0].pNode ); ;} + { yyval.pNode = yyvsp[-3].pNode; if ( yyval.pNode ) { assert ( yyval.pNode->m_dWords.GetLength() ); yyval.pNode->SetOp ( SPH_QUERY_PROXIMITY ); yyval.pNode->m_iOpArg = yyvsp[0].tInt.iValue; } ;} break; case 23: - { yyval.pNode = pParser->AddOp ( SPH_QUERY_PARAGRAPH, yyvsp[-2].pNode, yyvsp[0].pNode ); ;} + { yyval.pNode = yyvsp[-3].pNode; if ( yyval.pNode ) { assert ( yyval.pNode->m_dWords.GetLength() ); yyval.pNode->SetOp ( SPH_QUERY_QUORUM ); yyval.pNode->m_iOpArg = yyvsp[0].tInt.iValue; } ;} break; case 24: - { yyval.pNode = yyvsp[0].pNode; ;} - break; - - case 25: - - { yyval.pNode = yyvsp[0].pNode; ;} + { yyval.pNode = yyvsp[-1].pNode; if ( yyval.pNode ) yyval.pNode->m_dSpec.Hide(); pParser->m_dStateSpec.Reset(); ;} break; case 26: - { yyval.pNode = yyvsp[0].pNode; ;} + { yyval.pNode = yyvsp[-1].pNode; assert ( yyval.pNode->m_dWords.GetLength()==1 ); yyval.pNode->m_dWords[0].m_bFieldEnd = true; ;} break; case 27: - { yyval.pNode = NULL; ;} + { yyval.pNode = yyvsp[0].pNode; assert ( yyval.pNode->m_dWords.GetLength()==1 ); yyval.pNode->m_dWords[0].m_bFieldStart = true; ;} break; case 28: - { yyval.pNode = NULL; ;} + { yyval.pNode = yyvsp[-1].pNode; assert ( yyval.pNode->m_dWords.GetLength()==1 ); yyval.pNode->m_dWords[0].m_bFieldStart = true; yyval.pNode->m_dWords[0].m_bFieldEnd = true; ;} break; case 29: - { yyval.pNode = NULL; ;} + { yyval.pNode = yyvsp[0].pNode; ;} break; case 30: - { yyval.pNode = yyvsp[-1].pNode; if ( yyval.pNode ) { assert ( yyval.pNode->m_dWords.GetLength() ); yyval.pNode->SetOp ( SPH_QUERY_PHRASE); } ;} + { yyval.pNode = pParser->AddKeyword ( ( yyvsp[0].tInt.iStrIndex>=0 ) ? pParser->m_dIntTokens[yyvsp[0].tInt.iStrIndex].cstr() : NULL ); ;} break; case 31: - { yyval.pNode = yyvsp[-3].pNode; if ( yyval.pNode ) { assert ( yyval.pNode->m_dWords.GetLength() ); yyval.pNode->SetOp ( SPH_QUERY_PROXIMITY ); yyval.pNode->m_iOpArg = yyvsp[0].tInt.iValue; } ;} + { yyval.pNode = pParser->AddOp ( SPH_QUERY_SENTENCE, yyvsp[-2].pNode, yyvsp[0].pNode ); ;} break; case 32: - { yyval.pNode = yyvsp[-3].pNode; if ( yyval.pNode ) { assert ( yyval.pNode->m_dWords.GetLength() ); yyval.pNode->SetOp ( SPH_QUERY_QUORUM ); yyval.pNode->m_iOpArg = yyvsp[0].tInt.iValue; } ;} + { yyval.pNode = pParser->AddOp ( SPH_QUERY_SENTENCE, yyvsp[-2].pNode, yyvsp[0].pNode ); ;} break; case 33: - { yyval.pNode = yyvsp[-1].pNode; if ( yyval.pNode ) yyval.pNode->m_bFieldSpec = false; ;} + { yyval.pNode = pParser->AddOp ( SPH_QUERY_PARAGRAPH, yyvsp[-2].pNode, yyvsp[0].pNode ); ;} break; case 34: - { yyval.pNode = yyvsp[0].pNode; ;} + { yyval.pNode = pParser->AddOp ( SPH_QUERY_PARAGRAPH, yyvsp[-2].pNode, yyvsp[0].pNode ); ;} break; case 35: - { yyval.pNode = yyvsp[0].pNode; if ( yyval.pNode ) yyval.pNode->SetFieldSpec ( yyvsp[-1].tFieldLimit.dMask, yyvsp[-1].tFieldLimit.iMaxPos ); ;} + { yyval.pNode = yyvsp[0].pNode; ;} break; case 36: - { yyval.pNode = yyvsp[0].pNode; if ( yyval.pNode ) yyval.pNode->SetZoneSpec ( pParser->GetZoneVec ( yyvsp[-1].iZoneVec ) ); ;} + { yyval.pNode = yyvsp[-1].pNode; if ( yyval.pNode ) { assert ( yyval.pNode->m_dWords.GetLength() ); yyval.pNode->SetOp ( SPH_QUERY_PHRASE); } ;} break; case 37: @@ -1242,7 +1230,7 @@ case 38: - { yyval.pNode = pParser->AddOp ( SPH_QUERY_OR, yyvsp[-2].pNode, yyvsp[0].pNode ); ;} + { yyval.pNode = pParser->AddKeyword ( yyvsp[-1].pNode, yyvsp[0].pNode ); ;} break; case 39: @@ -1252,32 +1240,32 @@ case 40: - { yyval.pNode = pParser->AddOp ( SPH_QUERY_NOT, yyvsp[0].pNode, NULL ); ;} + { yyval.pNode = NULL; ;} break; case 41: - { yyval.pNode = pParser->AddOp ( SPH_QUERY_NOT, yyvsp[0].pNode, NULL ); yyval.pNode->SetFieldSpec ( yyvsp[-2].tFieldLimit.dMask, yyvsp[-2].tFieldLimit.iMaxPos ); ;} + { yyval.pNode = NULL; ;} break; - case 43: + case 42: - { yyval.pNode = pParser->AddOp ( SPH_QUERY_BEFORE, yyvsp[-2].pNode, yyvsp[0].pNode ); ;} + { yyval.pNode = NULL; ;} break; - case 44: + case 43: - { yyval.pNode = pParser->AddOp ( SPH_QUERY_NEAR, yyvsp[-2].pNode, yyvsp[0].pNode, yyvsp[-1].tInt.iValue ); ;} + { yyval.pNode = NULL; ;} break; - case 45: + case 44: - { yyval.pNode = yyvsp[0].pNode; ;} + { yyval.pNode = NULL; ;} break; - case 46: + case 45: - { yyval.pNode = pParser->AddOp ( SPH_QUERY_AND, yyvsp[-1].pNode, yyvsp[0].pNode ); ;} + { yyval.pNode = NULL; ;} break; diff -Nru sphinxsearch-0.9.9+2.0.2beta/src/yysphinxselect.c sphinxsearch-2.0.4/src/yysphinxselect.c --- sphinxsearch-0.9.9+2.0.2beta/src/yysphinxselect.c 2011-06-02 04:33:13.000000000 +0000 +++ sphinxsearch-2.0.4/src/yysphinxselect.c 2012-02-07 01:46:52.000000000 +0000 @@ -68,9 +68,10 @@ TOK_GTE = 270, TOK_EQ = 271, TOK_NE = 272, - TOK_OR = 273, - TOK_AND = 274, - TOK_NOT = 275 + TOK_CONST_STRING = 273, + TOK_OR = 274, + TOK_AND = 275, + TOK_NOT = 276 }; #endif #define SEL_TOKEN 258 @@ -88,9 +89,10 @@ #define TOK_GTE 270 #define TOK_EQ 271 #define TOK_NE 272 -#define TOK_OR 273 -#define TOK_AND 274 -#define TOK_NOT 275 +#define TOK_CONST_STRING 273 +#define TOK_OR 274 +#define TOK_AND 275 +#define TOK_NOT 276 @@ -229,20 +231,20 @@ /* YYFINAL -- State number of the termination state. */ #define YYFINAL 31 /* YYLAST -- Last index in YYTABLE. */ -#define YYLAST 264 +#define YYLAST 360 /* YYNTOKENS -- Number of terminals. */ -#define YYNTOKENS 30 +#define YYNTOKENS 33 /* YYNNTS -- Number of nonterminals. */ -#define YYNNTS 9 +#define YYNNTS 10 /* YYNRULES -- Number of rules. */ -#define YYNRULES 41 +#define YYNRULES 45 /* YYNRULES -- Number of states. */ -#define YYNSTATES 93 +#define YYNSTATES 99 /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ #define YYUNDEFTOK 2 -#define YYMAXUTOK 275 +#define YYMAXUTOK 276 #define YYTRANSLATE(YYX) \ ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) @@ -253,16 +255,16 @@ 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 22, 2, + 31, 32, 27, 25, 30, 26, 2, 28, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 28, 29, 24, 22, 27, 23, 2, 25, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 20, 2, 21, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 23, 2, 24, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 21, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, @@ -277,7 +279,7 @@ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 26 + 15, 16, 17, 18, 19, 20, 29 }; #if YYDEBUG @@ -288,39 +290,40 @@ 0, 0, 3, 5, 9, 11, 14, 15, 17, 20, 22, 27, 32, 37, 42, 47, 51, 57, 59, 62, 65, 69, 73, 77, 81, 85, 89, 93, 97, 101, - 105, 109, 113, 117, 119, 121, 123, 128, 132, 139, - 146, 148 + 105, 109, 113, 117, 121, 125, 127, 129, 131, 136, + 140, 147, 154, 156, 160, 162 }; /* YYRHS -- A `-1'-separated list of the rules' RHS. */ static const yysigned_char yyrhs[] = { - 31, 0, -1, 32, -1, 31, 27, 32, -1, 24, - -1, 34, 33, -1, -1, 3, -1, 5, 3, -1, - 35, -1, 6, 28, 35, 29, -1, 7, 28, 35, - 29, -1, 8, 28, 35, 29, -1, 9, 28, 35, - 29, -1, 10, 28, 24, 29, -1, 11, 28, 29, - -1, 10, 28, 12, 3, 29, -1, 36, -1, 23, - 35, -1, 26, 35, -1, 35, 22, 35, -1, 35, - 23, 35, -1, 35, 24, 35, -1, 35, 25, 35, - -1, 35, 20, 35, -1, 35, 21, 35, -1, 35, - 14, 35, -1, 35, 15, 35, -1, 35, 16, 35, - -1, 35, 17, 35, -1, 35, 19, 35, -1, 35, - 18, 35, -1, 28, 35, 29, -1, 37, -1, 4, - -1, 3, -1, 3, 28, 38, 29, -1, 3, 28, - 29, -1, 8, 28, 35, 27, 35, 29, -1, 7, - 28, 35, 27, 35, 29, -1, 35, -1, 38, 27, - 35, -1 + 34, 0, -1, 35, -1, 34, 30, 35, -1, 27, + -1, 37, 36, -1, -1, 3, -1, 5, 3, -1, + 38, -1, 6, 31, 38, 32, -1, 7, 31, 38, + 32, -1, 8, 31, 38, 32, -1, 9, 31, 38, + 32, -1, 10, 31, 27, 32, -1, 11, 31, 32, + -1, 10, 31, 12, 3, 32, -1, 39, -1, 26, + 38, -1, 29, 38, -1, 38, 25, 38, -1, 38, + 26, 38, -1, 38, 27, 38, -1, 38, 28, 38, + -1, 38, 23, 38, -1, 38, 24, 38, -1, 38, + 21, 38, -1, 38, 22, 38, -1, 38, 14, 38, + -1, 38, 15, 38, -1, 38, 16, 38, -1, 38, + 17, 38, -1, 38, 20, 38, -1, 38, 19, 38, + -1, 31, 38, 32, -1, 40, -1, 4, -1, 3, + -1, 3, 31, 41, 32, -1, 3, 31, 32, -1, + 8, 31, 38, 30, 38, 32, -1, 7, 31, 38, + 30, 38, 32, -1, 42, -1, 41, 30, 42, -1, + 38, -1, 18, -1 }; /* YYRLINE[YYN] -- source line where rule number YYN was defined. */ static const unsigned char yyrline[] = { - 0, 41, 41, 42, 46, 47, 49, 51, 52, 56, - 57, 58, 59, 60, 61, 62, 63, 69, 70, 71, - 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, - 82, 83, 84, 85, 89, 90, 93, 94, 95, 96, - 100, 101 + 0, 45, 45, 46, 50, 51, 53, 55, 56, 60, + 61, 62, 63, 64, 65, 66, 67, 73, 74, 75, + 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, + 86, 87, 88, 89, 90, 91, 95, 96, 99, 100, + 101, 102, 106, 107, 111, 112 }; #endif @@ -332,10 +335,10 @@ "$end", "error", "$undefined", "SEL_TOKEN", "SEL_ID", "SEL_AS", "SEL_AVG", "SEL_MAX", "SEL_MIN", "SEL_SUM", "SEL_COUNT", "SEL_WEIGHT", "SEL_DISTINCT", "TOK_NEG", "TOK_LTE", "TOK_GTE", "TOK_EQ", "TOK_NE", - "TOK_OR", "TOK_AND", "'<'", "'>'", "'+'", "'-'", "'*'", "'/'", - "TOK_NOT", "','", "'('", "')'", "$accept", "select_list", "select_item", - "opt_alias", "select_expr", "expr", "select_atom", "function", - "arglist", 0 + "TOK_CONST_STRING", "TOK_OR", "TOK_AND", "'|'", "'&'", "'<'", "'>'", + "'+'", "'-'", "'*'", "'/'", "TOK_NOT", "','", "'('", "')'", "$accept", + "select_list", "select_item", "opt_alias", "select_expr", "expr", + "select_atom", "function", "arglist", "arg", 0 }; #endif @@ -346,18 +349,19 @@ { 0, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, - 60, 62, 43, 45, 42, 47, 275, 44, 40, 41 + 275, 124, 38, 60, 62, 43, 45, 42, 47, 276, + 44, 40, 41 }; # endif /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ static const unsigned char yyr1[] = { - 0, 30, 31, 31, 32, 32, 33, 33, 33, 34, - 34, 34, 34, 34, 34, 34, 34, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 36, 36, 37, 37, 37, 37, - 38, 38 + 0, 33, 34, 34, 35, 35, 36, 36, 36, 37, + 37, 37, 37, 37, 37, 37, 37, 38, 38, 38, + 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, + 38, 38, 38, 38, 38, 38, 39, 39, 40, 40, + 40, 40, 41, 41, 42, 42 }; /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ @@ -366,8 +370,8 @@ 0, 2, 1, 3, 1, 2, 0, 1, 2, 1, 4, 4, 4, 4, 4, 3, 5, 1, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 1, 1, 1, 4, 3, 6, 6, - 1, 3 + 3, 3, 3, 3, 3, 1, 1, 1, 4, 3, + 6, 6, 1, 3, 1, 1 }; /* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state @@ -375,45 +379,45 @@ means the default is an error. */ static const unsigned char yydefact[] = { - 0, 35, 34, 0, 0, 0, 0, 0, 0, 0, - 4, 0, 0, 0, 2, 6, 9, 17, 33, 0, + 0, 37, 36, 0, 0, 0, 0, 0, 0, 0, + 4, 0, 0, 0, 2, 6, 9, 17, 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 19, 0, 1, 0, 7, 0, 5, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 37, 40, - 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, - 32, 3, 8, 26, 27, 28, 29, 31, 30, 24, - 25, 20, 21, 22, 23, 0, 36, 10, 0, 11, - 0, 12, 13, 0, 14, 0, 0, 41, 0, 0, - 16, 39, 38 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 45, 39, 44, 0, 42, 0, 0, 0, 0, 0, + 0, 15, 0, 0, 34, 3, 8, 28, 29, 30, + 31, 33, 32, 26, 27, 24, 25, 20, 21, 22, + 23, 0, 38, 10, 0, 11, 0, 12, 13, 0, + 14, 0, 0, 43, 0, 0, 16, 41, 40 }; /* YYDEFGOTO[NTERM-NUM]. */ static const yysigned_char yydefgoto[] = { - -1, 13, 14, 35, 15, 16, 17, 18, 50 + -1, 13, 14, 35, 15, 16, 17, 18, 53, 54 }; /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing STATE-NUM. */ -#define YYPACT_NINF -28 +#define YYPACT_NINF -22 static const short yypact[] = { - 49, -27, -28, -19, -10, 16, 19, 20, 23, 60, - -28, 60, 60, 15, -28, 14, 215, -28, -28, 17, - 60, 60, 60, 60, -8, -3, 26, 33, -28, -28, - 107, -28, 49, -28, 59, -28, 60, 60, 60, 60, - 60, 60, 60, 60, 60, 60, 60, 60, -28, 215, - 12, 123, 75, 91, 139, 62, 41, -28, 60, 60, - -28, -28, -28, -17, -17, 239, 239, 227, 227, -17, - -17, -2, -2, -28, -28, 60, -28, -28, 60, -28, - 60, -28, -28, 45, -28, 187, 201, 215, 155, 171, - -28, -28, -28 + 52, -7, -22, -5, 10, 13, 33, 35, 36, 87, + -22, 87, 87, 15, -22, 20, 272, -22, -22, 39, + 87, 87, 87, 87, -11, 17, 38, 42, -22, -22, + 143, -22, 52, -22, 71, -22, 87, 87, 87, 87, + 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, + -22, -22, 272, 18, -22, 162, 105, 124, 181, 73, + 48, -22, 87, 87, -22, -22, -22, -21, -21, -6, + -6, 287, 302, 317, 332, -21, -21, 24, 24, -22, + -22, 81, -22, -22, 87, -22, 87, -22, -22, 50, + -22, 238, 255, -22, 200, 219, -22, -22, -22 }; /* YYPGOTO[NTERM-NUM]. */ static const yysigned_char yypgoto[] = { - -28, -28, 44, -28, -28, -9, -28, -28, -28 + -22, -22, 54, -22, -22, -9, -22, -22, -22, 6 }; /* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If @@ -423,80 +427,100 @@ #define YYTABLE_NINF -1 static const unsigned char yytable[] = { - 28, 19, 29, 30, 55, 44, 45, 46, 47, 20, - 49, 51, 52, 53, 54, 31, 56, 33, 21, 34, - 1, 2, 46, 47, 26, 27, 57, 63, 64, 65, - 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, - 9, 76, 32, 11, 22, 12, 48, 23, 24, 85, - 86, 25, 1, 2, 58, 3, 4, 5, 6, 7, - 8, 59, 62, 1, 2, 83, 87, 26, 27, 88, - 84, 89, 9, 10, 90, 11, 61, 12, 0, 0, - 0, 0, 0, 9, 0, 0, 11, 0, 12, 36, - 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, - 47, 0, 78, 0, 79, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 0, 80, 0, - 81, 36, 37, 38, 39, 40, 41, 42, 43, 44, - 45, 46, 47, 0, 0, 0, 60, 36, 37, 38, - 39, 40, 41, 42, 43, 44, 45, 46, 47, 0, - 0, 0, 77, 36, 37, 38, 39, 40, 41, 42, - 43, 44, 45, 46, 47, 0, 0, 0, 82, 36, - 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, - 47, 0, 0, 0, 91, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 0, 0, 0, - 92, 36, 37, 38, 39, 40, 41, 42, 43, 44, - 45, 46, 47, 0, 78, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 0, 80, 36, - 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, - 47, 36, 37, 38, 39, 0, 0, 42, 43, 44, - 45, 46, 47, 36, 37, 0, 0, 0, 0, 42, - 43, 44, 45, 46, 47 + 28, 59, 29, 30, 46, 47, 48, 49, 36, 37, + 52, 55, 56, 57, 58, 31, 60, 44, 45, 46, + 47, 48, 49, 33, 19, 34, 20, 67, 68, 69, + 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 21, 1, 2, 22, 32, 26, 27, 81, 61, + 82, 48, 49, 91, 92, 1, 2, 50, 3, 4, + 5, 6, 7, 8, 23, 9, 24, 25, 11, 62, + 12, 51, 52, 63, 66, 94, 89, 95, 9, 10, + 90, 11, 96, 12, 1, 2, 65, 93, 26, 27, + 1, 2, 0, 0, 26, 27, 0, 0, 0, 50, + 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, + 11, 0, 12, 9, 0, 0, 11, 0, 12, 36, + 37, 38, 39, 0, 40, 41, 42, 43, 44, 45, + 46, 47, 48, 49, 0, 84, 0, 85, 36, 37, + 38, 39, 0, 40, 41, 42, 43, 44, 45, 46, + 47, 48, 49, 0, 86, 0, 87, 36, 37, 38, + 39, 0, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 0, 0, 0, 64, 36, 37, 38, 39, + 0, 40, 41, 42, 43, 44, 45, 46, 47, 48, + 49, 0, 0, 0, 83, 36, 37, 38, 39, 0, + 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, + 0, 0, 0, 88, 36, 37, 38, 39, 0, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 0, + 0, 0, 97, 36, 37, 38, 39, 0, 40, 41, + 42, 43, 44, 45, 46, 47, 48, 49, 0, 0, + 0, 98, 36, 37, 38, 39, 0, 40, 41, 42, + 43, 44, 45, 46, 47, 48, 49, 0, 84, 36, + 37, 38, 39, 0, 40, 41, 42, 43, 44, 45, + 46, 47, 48, 49, 0, 86, 36, 37, 38, 39, + 0, 40, 41, 42, 43, 44, 45, 46, 47, 48, + 49, 36, 37, 38, 39, 0, 0, 41, 42, 43, + 44, 45, 46, 47, 48, 49, 36, 37, 38, 39, + 0, 0, 0, 42, 43, 44, 45, 46, 47, 48, + 49, 36, 37, 38, 39, 0, 0, 0, 0, 43, + 44, 45, 46, 47, 48, 49, 36, 37, 38, 39, + 0, 0, 0, 0, 0, 44, 45, 46, 47, 48, + 49 }; static const yysigned_char yycheck[] = { - 9, 28, 11, 12, 12, 22, 23, 24, 25, 28, - 19, 20, 21, 22, 23, 0, 24, 3, 28, 5, - 3, 4, 24, 25, 7, 8, 29, 36, 37, 38, - 39, 40, 41, 42, 43, 44, 45, 46, 47, 27, - 23, 29, 27, 26, 28, 28, 29, 28, 28, 58, - 59, 28, 3, 4, 28, 6, 7, 8, 9, 10, - 11, 28, 3, 3, 4, 3, 75, 7, 8, 78, - 29, 80, 23, 24, 29, 26, 32, 28, -1, -1, - -1, -1, -1, 23, -1, -1, 26, -1, 28, 14, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, - 25, -1, 27, -1, 29, 14, 15, 16, 17, 18, - 19, 20, 21, 22, 23, 24, 25, -1, 27, -1, - 29, 14, 15, 16, 17, 18, 19, 20, 21, 22, - 23, 24, 25, -1, -1, -1, 29, 14, 15, 16, - 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, - -1, -1, 29, 14, 15, 16, 17, 18, 19, 20, - 21, 22, 23, 24, 25, -1, -1, -1, 29, 14, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, - 25, -1, -1, -1, 29, 14, 15, 16, 17, 18, - 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, - 29, 14, 15, 16, 17, 18, 19, 20, 21, 22, - 23, 24, 25, -1, 27, 14, 15, 16, 17, 18, - 19, 20, 21, 22, 23, 24, 25, -1, 27, 14, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, - 25, 14, 15, 16, 17, -1, -1, 20, 21, 22, - 23, 24, 25, 14, 15, -1, -1, -1, -1, 20, - 21, 22, 23, 24, 25 + 9, 12, 11, 12, 25, 26, 27, 28, 14, 15, + 19, 20, 21, 22, 23, 0, 27, 23, 24, 25, + 26, 27, 28, 3, 31, 5, 31, 36, 37, 38, + 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, + 49, 31, 3, 4, 31, 30, 7, 8, 30, 32, + 32, 27, 28, 62, 63, 3, 4, 18, 6, 7, + 8, 9, 10, 11, 31, 26, 31, 31, 29, 31, + 31, 32, 81, 31, 3, 84, 3, 86, 26, 27, + 32, 29, 32, 31, 3, 4, 32, 81, 7, 8, + 3, 4, -1, -1, 7, 8, -1, -1, -1, 18, + -1, -1, -1, -1, -1, -1, -1, 26, -1, -1, + 29, -1, 31, 26, -1, -1, 29, -1, 31, 14, + 15, 16, 17, -1, 19, 20, 21, 22, 23, 24, + 25, 26, 27, 28, -1, 30, -1, 32, 14, 15, + 16, 17, -1, 19, 20, 21, 22, 23, 24, 25, + 26, 27, 28, -1, 30, -1, 32, 14, 15, 16, + 17, -1, 19, 20, 21, 22, 23, 24, 25, 26, + 27, 28, -1, -1, -1, 32, 14, 15, 16, 17, + -1, 19, 20, 21, 22, 23, 24, 25, 26, 27, + 28, -1, -1, -1, 32, 14, 15, 16, 17, -1, + 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, + -1, -1, -1, 32, 14, 15, 16, 17, -1, 19, + 20, 21, 22, 23, 24, 25, 26, 27, 28, -1, + -1, -1, 32, 14, 15, 16, 17, -1, 19, 20, + 21, 22, 23, 24, 25, 26, 27, 28, -1, -1, + -1, 32, 14, 15, 16, 17, -1, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, -1, 30, 14, + 15, 16, 17, -1, 19, 20, 21, 22, 23, 24, + 25, 26, 27, 28, -1, 30, 14, 15, 16, 17, + -1, 19, 20, 21, 22, 23, 24, 25, 26, 27, + 28, 14, 15, 16, 17, -1, -1, 20, 21, 22, + 23, 24, 25, 26, 27, 28, 14, 15, 16, 17, + -1, -1, -1, 21, 22, 23, 24, 25, 26, 27, + 28, 14, 15, 16, 17, -1, -1, -1, -1, 22, + 23, 24, 25, 26, 27, 28, 14, 15, 16, 17, + -1, -1, -1, -1, -1, 23, 24, 25, 26, 27, + 28 }; /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing symbol of state STATE-NUM. */ static const unsigned char yystos[] = { - 0, 3, 4, 6, 7, 8, 9, 10, 11, 23, - 24, 26, 28, 31, 32, 34, 35, 36, 37, 28, - 28, 28, 28, 28, 28, 28, 7, 8, 35, 35, - 35, 0, 27, 3, 5, 33, 14, 15, 16, 17, - 18, 19, 20, 21, 22, 23, 24, 25, 29, 35, - 38, 35, 35, 35, 35, 12, 24, 29, 28, 28, - 29, 32, 3, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 27, 29, 29, 27, 29, - 27, 29, 29, 3, 29, 35, 35, 35, 35, 35, - 29, 29, 29 + 0, 3, 4, 6, 7, 8, 9, 10, 11, 26, + 27, 29, 31, 34, 35, 37, 38, 39, 40, 31, + 31, 31, 31, 31, 31, 31, 7, 8, 38, 38, + 38, 0, 30, 3, 5, 36, 14, 15, 16, 17, + 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, + 18, 32, 38, 41, 42, 38, 38, 38, 38, 12, + 27, 32, 31, 31, 32, 35, 3, 38, 38, 38, + 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, + 38, 30, 32, 32, 30, 32, 30, 32, 32, 3, + 32, 38, 38, 42, 38, 38, 32, 32, 32 }; #if ! defined (YYSIZE_T) && defined (__SIZE_TYPE__) @@ -1235,23 +1259,33 @@ { yyval = yyvsp[-2]; yyval.m_iEnd = yyvsp[0].m_iEnd; ;} break; - case 36: + case 33: - { yyval = yyvsp[-3]; yyval.m_iEnd = yyvsp[0].m_iEnd; ;} + { yyval = yyvsp[-2]; yyval.m_iEnd = yyvsp[0].m_iEnd; ;} break; - case 37: + case 34: { yyval = yyvsp[-2]; yyval.m_iEnd = yyvsp[0].m_iEnd; ;} break; case 38: - { yyval = yyvsp[-5]; yyval.m_iEnd = yyvsp[0].m_iEnd; ;} + { yyval = yyvsp[-3]; yyval.m_iEnd = yyvsp[0].m_iEnd; ;} break; case 39: + { yyval = yyvsp[-2]; yyval.m_iEnd = yyvsp[0].m_iEnd; ;} + break; + + case 40: + + { yyval = yyvsp[-5]; yyval.m_iEnd = yyvsp[0].m_iEnd; ;} + break; + + case 41: + { yyval = yyvsp[-5]; yyval.m_iEnd = yyvsp[0].m_iEnd; ;} break; diff -Nru sphinxsearch-0.9.9+2.0.2beta/src/yysphinxselect.h sphinxsearch-2.0.4/src/yysphinxselect.h --- sphinxsearch-0.9.9+2.0.2beta/src/yysphinxselect.h 2011-06-02 04:33:13.000000000 +0000 +++ sphinxsearch-2.0.4/src/yysphinxselect.h 2011-12-30 07:51:59.000000000 +0000 @@ -44,9 +44,10 @@ TOK_GTE = 270, TOK_EQ = 271, TOK_NE = 272, - TOK_OR = 273, - TOK_AND = 274, - TOK_NOT = 275 + TOK_CONST_STRING = 273, + TOK_OR = 274, + TOK_AND = 275, + TOK_NOT = 276 }; #endif #define SEL_TOKEN 258 @@ -64,9 +65,10 @@ #define TOK_GTE 270 #define TOK_EQ 271 #define TOK_NE 272 -#define TOK_OR 273 -#define TOK_AND 274 -#define TOK_NOT 275 +#define TOK_CONST_STRING 273 +#define TOK_OR 274 +#define TOK_AND 275 +#define TOK_NOT 276 diff -Nru sphinxsearch-0.9.9+2.0.2beta/test/helpers.inc sphinxsearch-2.0.4/test/helpers.inc --- sphinxsearch-0.9.9+2.0.2beta/test/helpers.inc 2011-10-07 07:24:12.000000000 +0000 +++ sphinxsearch-2.0.4/test/helpers.inc 2012-02-28 08:57:13.000000000 +0000 @@ -1,7 +1,7 @@ SetServer ( $addr, $port ); - $cl->SetConnectTimeout ( 1 ); + $cl->SetConnectTimeout ( 10 ); $ok = false; $start = MyMicrotime(); - for ( $i=0; $i<3; $i++ ) + for ( $i=0; $i<300; $i++ ) { if ( $cl->Open() ) { @@ -2374,5 +2374,5 @@ } // -// $Id: helpers.inc 2980 2011-10-07 07:24:12Z tomat $ +// $Id: helpers.inc 3122 2012-02-28 08:57:13Z klirichek $ // diff -Nru sphinxsearch-0.9.9+2.0.2beta/test/test_018/model.bin sphinxsearch-2.0.4/test/test_018/model.bin --- sphinxsearch-0.9.9+2.0.2beta/test/test_018/model.bin 2011-07-12 15:43:45.000000000 +0000 +++ sphinxsearch-2.0.4/test/test_018/model.bin 2011-11-21 15:58:19.000000000 +0000 @@ -1 +1 @@ -a:16:{i:0;a:1:{i:0;a:6:{i:0;a:6:{s:12:"before_match";s:3:"[B]";s:11:"after_match";s:3:"[A]";s:15:"chunk_separator";s:5:" ... ";s:5:"limit";i:100;s:6:"around";i:2;s:11:"allow_empty";b:1;}i:1;a:5:{i:0;s:35:"ab ab ab ab ab ab ab ab ab ab ab MS";i:1;s:34:" this, is . MS windows....?";i:2;s:38:"this , is a MS but not [B]Windows[A]";i:3;s:40:"this is the [B]Microsoft Windows[A] , ,";i:4;s:22:"profits, lost savings";}i:2;a:6:{s:12:"before_match";s:3:"[B]";s:11:"after_match";s:3:"[A]";s:15:"chunk_separator";s:5:" ... ";s:5:"limit";i:50;s:6:"around";i:2;s:11:"allow_empty";b:1;}i:3;a:5:{i:0;s:35:"ab ab ab ab ab ab ab ab ab ab ab MS";i:1;s:34:" this, is . MS windows....?";i:2;s:38:"this , is a MS but not [B]Windows[A]";i:3;s:40:"this is the [B]Microsoft Windows[A] , ,";i:4;s:22:"profits, lost savings";}i:4;a:6:{s:12:"before_match";s:3:"[B]";s:11:"after_match";s:3:"[A]";s:15:"chunk_separator";s:5:" ... ";s:5:"limit";i:30;s:6:"around";i:2;s:11:"allow_empty";b:1;}i:5;a:5:{i:0;s:34:"ab ab ab ab ab ab ab ab ab ab ... ";i:1;s:34:" this, is . MS windows ... ";i:2;s:27:" ... but not [B]Windows[A]";i:3;s:41:" ... is the [B]Microsoft Windows[A] , ,";i:4;s:22:"profits, lost savings";}}}i:1;a:1:{i:0;a:6:{i:0;a:6:{s:12:"before_match";s:3:"[B]";s:11:"after_match";s:3:"[A]";s:15:"chunk_separator";s:5:" ... ";s:5:"limit";i:100;s:6:"around";i:2;s:11:"allow_empty";b:1;}i:1;a:5:{i:0;s:35:"ab ab ab ab ab ab ab ab ab ab ab MS";i:1;s:34:" this, is . MS windows....?";i:2;s:38:"this , is a MS but not [B]Windows[A]";i:3;s:40:"this is the [B]Microsoft Windows[A] , ,";i:4;s:22:"profits, lost savings";}i:2;a:6:{s:12:"before_match";s:3:"[B]";s:11:"after_match";s:3:"[A]";s:15:"chunk_separator";s:5:" ... ";s:5:"limit";i:50;s:6:"around";i:2;s:11:"allow_empty";b:1;}i:3;a:5:{i:0;s:35:"ab ab ab ab ab ab ab ab ab ab ab MS";i:1;s:34:" this, is . MS windows....?";i:2;s:38:"this , is a MS but not [B]Windows[A]";i:3;s:40:"this is the [B]Microsoft Windows[A] , ,";i:4;s:22:"profits, lost savings";}i:4;a:6:{s:12:"before_match";s:3:"[B]";s:11:"after_match";s:3:"[A]";s:15:"chunk_separator";s:5:" ... ";s:5:"limit";i:30;s:6:"around";i:2;s:11:"allow_empty";b:1;}i:5;a:5:{i:0;s:34:"ab ab ab ab ab ab ab ab ab ab ... ";i:1;s:34:" this, is . MS windows ... ";i:2;s:27:" ... but not [B]Windows[A]";i:3;s:41:" ... is the [B]Microsoft Windows[A] , ,";i:4;s:22:"profits, lost savings";}}}i:2;a:1:{i:0;a:6:{i:0;a:6:{s:12:"before_match";s:3:"[B]";s:11:"after_match";s:3:"[A]";s:15:"chunk_separator";s:5:" ... ";s:5:"limit";i:100;s:6:"around";i:2;s:11:"allow_empty";b:1;}i:1;a:5:{i:0;s:35:"ab ab ab ab ab ab ab ab ab ab ab MS";i:1;s:34:" this, is . MS windows....?";i:2;s:38:"this , is a MS but not [B]Windows[A]";i:3;s:40:"this is the [B]Microsoft Windows[A] , ,";i:4;s:22:"profits, lost savings";}i:2;a:6:{s:12:"before_match";s:3:"[B]";s:11:"after_match";s:3:"[A]";s:15:"chunk_separator";s:5:" ... ";s:5:"limit";i:50;s:6:"around";i:2;s:11:"allow_empty";b:1;}i:3;a:5:{i:0;s:35:"ab ab ab ab ab ab ab ab ab ab ab MS";i:1;s:34:" this, is . MS windows....?";i:2;s:38:"this , is a MS but not [B]Windows[A]";i:3;s:40:"this is the [B]Microsoft Windows[A] , ,";i:4;s:22:"profits, lost savings";}i:4;a:6:{s:12:"before_match";s:3:"[B]";s:11:"after_match";s:3:"[A]";s:15:"chunk_separator";s:5:" ... ";s:5:"limit";i:30;s:6:"around";i:2;s:11:"allow_empty";b:1;}i:5;a:5:{i:0;s:34:"ab ab ab ab ab ab ab ab ab ab ... ";i:1;s:34:" this, is . MS windows ... ";i:2;s:39:" ... , is a MS but not [B]Windows[A]";i:3;s:41:" ... is the [B]Microsoft Windows[A] , ,";i:4;s:22:"profits, lost savings";}}}i:3;a:1:{i:0;a:6:{i:0;a:6:{s:12:"before_match";s:3:"[B]";s:11:"after_match";s:3:"[A]";s:15:"chunk_separator";s:5:" ... ";s:5:"limit";i:100;s:6:"around";i:2;s:11:"allow_empty";b:1;}i:1;a:5:{i:0;s:35:"ab ab ab ab ab ab ab ab ab ab ab MS";i:1;s:34:" this, is . MS windows....?";i:2;s:38:"this , is a MS but not [B]Windows[A]";i:3;s:40:"this is the [B]Microsoft Windows[A] , ,";i:4;s:22:"profits, lost savings";}i:2;a:6:{s:12:"before_match";s:3:"[B]";s:11:"after_match";s:3:"[A]";s:15:"chunk_separator";s:5:" ... ";s:5:"limit";i:50;s:6:"around";i:2;s:11:"allow_empty";b:1;}i:3;a:5:{i:0;s:35:"ab ab ab ab ab ab ab ab ab ab ab MS";i:1;s:34:" this, is . MS windows....?";i:2;s:38:"this , is a MS but not [B]Windows[A]";i:3;s:40:"this is the [B]Microsoft Windows[A] , ,";i:4;s:22:"profits, lost savings";}i:4;a:6:{s:12:"before_match";s:3:"[B]";s:11:"after_match";s:3:"[A]";s:15:"chunk_separator";s:5:" ... ";s:5:"limit";i:30;s:6:"around";i:2;s:11:"allow_empty";b:1;}i:5;a:5:{i:0;s:34:"ab ab ab ab ab ab ab ab ab ab ... ";i:1;s:34:" this, is . MS windows ... ";i:2;s:39:" ... , is a MS but not [B]Windows[A]";i:3;s:41:" ... is the [B]Microsoft Windows[A] , ,";i:4;s:22:"profits, lost savings";}}}i:4;a:1:{i:0;a:6:{i:0;a:6:{s:12:"before_match";s:3:"[B]";s:11:"after_match";s:3:"[A]";s:15:"chunk_separator";s:5:" ... ";s:5:"limit";i:100;s:6:"around";i:2;s:11:"allow_empty";b:1;}i:1;a:5:{i:0;s:35:"ab ab ab ab ab ab ab ab ab ab ab MS";i:1;s:34:" this, is . MS windows....?";i:2;s:38:"this , is a MS but not [B]Windows[A]";i:3;s:40:"this is the [B]Microsoft Windows[A] , ,";i:4;s:22:"profits, lost savings";}i:2;a:6:{s:12:"before_match";s:3:"[B]";s:11:"after_match";s:3:"[A]";s:15:"chunk_separator";s:5:" ... ";s:5:"limit";i:50;s:6:"around";i:2;s:11:"allow_empty";b:1;}i:3;a:5:{i:0;s:35:"ab ab ab ab ab ab ab ab ab ab ab MS";i:1;s:34:" this, is . MS windows....?";i:2;s:38:"this , is a MS but not [B]Windows[A]";i:3;s:40:"this is the [B]Microsoft Windows[A] , ,";i:4;s:22:"profits, lost savings";}i:4;a:6:{s:12:"before_match";s:3:"[B]";s:11:"after_match";s:3:"[A]";s:15:"chunk_separator";s:5:" ... ";s:5:"limit";i:30;s:6:"around";i:2;s:11:"allow_empty";b:1;}i:5;a:5:{i:0;s:34:"ab ab ab ab ab ab ab ab ab ab ... ";i:1;s:34:" this, is . MS windows ... ";i:2;s:27:" ... but not [B]Windows[A]";i:3;s:41:" ... is the [B]Microsoft Windows[A] , ,";i:4;s:22:"profits, lost savings";}}}i:5;a:1:{i:0;a:6:{i:0;a:6:{s:12:"before_match";s:3:"[B]";s:11:"after_match";s:3:"[A]";s:15:"chunk_separator";s:5:" ... ";s:5:"limit";i:100;s:6:"around";i:2;s:11:"allow_empty";b:1;}i:1;a:5:{i:0;s:35:"ab ab ab ab ab ab ab ab ab ab ab MS";i:1;s:34:" this, is . MS windows....?";i:2;s:38:"this , is a MS but not [B]Windows[A]";i:3;s:40:"this is the [B]Microsoft Windows[A] , ,";i:4;s:22:"profits, lost savings";}i:2;a:6:{s:12:"before_match";s:3:"[B]";s:11:"after_match";s:3:"[A]";s:15:"chunk_separator";s:5:" ... ";s:5:"limit";i:50;s:6:"around";i:2;s:11:"allow_empty";b:1;}i:3;a:5:{i:0;s:35:"ab ab ab ab ab ab ab ab ab ab ab MS";i:1;s:34:" this, is . MS windows....?";i:2;s:38:"this , is a MS but not [B]Windows[A]";i:3;s:40:"this is the [B]Microsoft Windows[A] , ,";i:4;s:22:"profits, lost savings";}i:4;a:6:{s:12:"before_match";s:3:"[B]";s:11:"after_match";s:3:"[A]";s:15:"chunk_separator";s:5:" ... ";s:5:"limit";i:30;s:6:"around";i:2;s:11:"allow_empty";b:1;}i:5;a:5:{i:0;s:34:"ab ab ab ab ab ab ab ab ab ab ... ";i:1;s:34:" this, is . MS windows ... ";i:2;s:27:" ... but not [B]Windows[A]";i:3;s:41:" ... is the [B]Microsoft Windows[A] , ,";i:4;s:22:"profits, lost savings";}}}i:6;a:1:{i:0;a:6:{i:0;a:6:{s:12:"before_match";s:3:"[B]";s:11:"after_match";s:3:"[A]";s:15:"chunk_separator";s:5:" ... ";s:5:"limit";i:100;s:6:"around";i:2;s:11:"allow_empty";b:1;}i:1;a:5:{i:0;s:35:"ab ab ab ab ab ab ab ab ab ab ab MS";i:1;s:34:" this, is . MS windows....?";i:2;s:38:"this , is a MS but not [B]Windows[A]";i:3;s:40:"this is the [B]Microsoft Windows[A] , ,";i:4;s:22:"profits, lost savings";}i:2;a:6:{s:12:"before_match";s:3:"[B]";s:11:"after_match";s:3:"[A]";s:15:"chunk_separator";s:5:" ... ";s:5:"limit";i:50;s:6:"around";i:2;s:11:"allow_empty";b:1;}i:3;a:5:{i:0;s:35:"ab ab ab ab ab ab ab ab ab ab ab MS";i:1;s:34:" this, is . MS windows....?";i:2;s:38:"this , is a MS but not [B]Windows[A]";i:3;s:40:"this is the [B]Microsoft Windows[A] , ,";i:4;s:22:"profits, lost savings";}i:4;a:6:{s:12:"before_match";s:3:"[B]";s:11:"after_match";s:3:"[A]";s:15:"chunk_separator";s:5:" ... ";s:5:"limit";i:30;s:6:"around";i:2;s:11:"allow_empty";b:1;}i:5;a:5:{i:0;s:34:"ab ab ab ab ab ab ab ab ab ab ... ";i:1;s:34:" this, is . MS windows ... ";i:2;s:39:" ... , is a MS but not [B]Windows[A]";i:3;s:41:" ... is the [B]Microsoft Windows[A] , ,";i:4;s:22:"profits, lost savings";}}}i:7;a:1:{i:0;a:6:{i:0;a:6:{s:12:"before_match";s:3:"[B]";s:11:"after_match";s:3:"[A]";s:15:"chunk_separator";s:5:" ... ";s:5:"limit";i:100;s:6:"around";i:2;s:11:"allow_empty";b:1;}i:1;a:5:{i:0;s:35:"ab ab ab ab ab ab ab ab ab ab ab MS";i:1;s:34:" this, is . MS windows....?";i:2;s:38:"this , is a MS but not [B]Windows[A]";i:3;s:40:"this is the [B]Microsoft Windows[A] , ,";i:4;s:22:"profits, lost savings";}i:2;a:6:{s:12:"before_match";s:3:"[B]";s:11:"after_match";s:3:"[A]";s:15:"chunk_separator";s:5:" ... ";s:5:"limit";i:50;s:6:"around";i:2;s:11:"allow_empty";b:1;}i:3;a:5:{i:0;s:35:"ab ab ab ab ab ab ab ab ab ab ab MS";i:1;s:34:" this, is . MS windows....?";i:2;s:38:"this , is a MS but not [B]Windows[A]";i:3;s:40:"this is the [B]Microsoft Windows[A] , ,";i:4;s:22:"profits, lost savings";}i:4;a:6:{s:12:"before_match";s:3:"[B]";s:11:"after_match";s:3:"[A]";s:15:"chunk_separator";s:5:" ... ";s:5:"limit";i:30;s:6:"around";i:2;s:11:"allow_empty";b:1;}i:5;a:5:{i:0;s:34:"ab ab ab ab ab ab ab ab ab ab ... ";i:1;s:34:" this, is . MS windows ... ";i:2;s:39:" ... , is a MS but not [B]Windows[A]";i:3;s:41:" ... is the [B]Microsoft Windows[A] , ,";i:4;s:22:"profits, lost savings";}}}i:8;a:1:{i:0;a:6:{i:0;a:6:{s:12:"before_match";s:3:"[B]";s:11:"after_match";s:3:"[A]";s:15:"chunk_separator";s:5:" ... ";s:5:"limit";i:100;s:6:"around";i:2;s:11:"allow_empty";b:1;}i:1;a:5:{i:0;s:41:"ab ab ab ab ab ab ab ab ab ab ab [B]MS[A]";i:1;s:46:" this, is . [B]MS[A] [B]windows[A]....?";i:2;s:44:"this , is a [B]MS[A] but not [B]Windows[A]";i:3;s:40:"this is the Microsoft [B]Windows[A] , ,";i:4;s:22:"profits, lost savings";}i:2;a:6:{s:12:"before_match";s:3:"[B]";s:11:"after_match";s:3:"[A]";s:15:"chunk_separator";s:5:" ... ";s:5:"limit";i:50;s:6:"around";i:2;s:11:"allow_empty";b:1;}i:3;a:5:{i:0;s:41:"ab ab ab ab ab ab ab ab ab ab ab [B]MS[A]";i:1;s:46:" this, is . [B]MS[A] [B]windows[A]....?";i:2;s:44:"this , is a [B]MS[A] but not [B]Windows[A]";i:3;s:40:"this is the Microsoft [B]Windows[A] , ,";i:4;s:22:"profits, lost savings";}i:4;a:6:{s:12:"before_match";s:3:"[B]";s:11:"after_match";s:3:"[A]";s:15:"chunk_separator";s:5:" ... ";s:5:"limit";i:30;s:6:"around";i:2;s:11:"allow_empty";b:1;}i:5;a:5:{i:0;s:20:" ... ab ab [B]MS[A]";i:1;s:44:" ... , is . [B]MS[A] [B]windows[A]....?";i:2;s:45:" ... , is a [B]MS[A] but not [B]Windows[A]";i:3;s:38:" ... the Microsoft [B]Windows[A] , ,";i:4;s:22:"profits, lost savings";}}}i:9;a:1:{i:0;a:6:{i:0;a:6:{s:12:"before_match";s:3:"[B]";s:11:"after_match";s:3:"[A]";s:15:"chunk_separator";s:5:" ... ";s:5:"limit";i:100;s:6:"around";i:2;s:11:"allow_empty";b:1;}i:1;a:5:{i:0;s:41:"ab ab ab ab ab ab ab ab ab ab ab [B]MS[A]";i:1;s:46:" this, is . [B]MS[A] [B]windows[A]....?";i:2;s:44:"this , is a [B]MS[A] but not [B]Windows[A]";i:3;s:40:"this is the Microsoft [B]Windows[A] , ,";i:4;s:22:"profits, lost savings";}i:2;a:6:{s:12:"before_match";s:3:"[B]";s:11:"after_match";s:3:"[A]";s:15:"chunk_separator";s:5:" ... ";s:5:"limit";i:50;s:6:"around";i:2;s:11:"allow_empty";b:1;}i:3;a:5:{i:0;s:41:"ab ab ab ab ab ab ab ab ab ab ab [B]MS[A]";i:1;s:46:" this, is . [B]MS[A] [B]windows[A]....?";i:2;s:44:"this , is a [B]MS[A] but not [B]Windows[A]";i:3;s:40:"this is the Microsoft [B]Windows[A] , ,";i:4;s:22:"profits, lost savings";}i:4;a:6:{s:12:"before_match";s:3:"[B]";s:11:"after_match";s:3:"[A]";s:15:"chunk_separator";s:5:" ... ";s:5:"limit";i:30;s:6:"around";i:2;s:11:"allow_empty";b:1;}i:5;a:5:{i:0;s:20:" ... ab ab [B]MS[A]";i:1;s:44:" ... , is . [B]MS[A] [B]windows[A]....?";i:2;s:45:" ... , is a [B]MS[A] but not [B]Windows[A]";i:3;s:38:" ... the Microsoft [B]Windows[A] , ,";i:4;s:22:"profits, lost savings";}}}i:10;a:1:{i:0;a:6:{i:0;a:6:{s:12:"before_match";s:3:"[B]";s:11:"after_match";s:3:"[A]";s:15:"chunk_separator";s:5:" ... ";s:5:"limit";i:100;s:6:"around";i:2;s:11:"allow_empty";b:1;}i:1;a:5:{i:0;s:35:"ab ab ab ab ab ab ab ab ab ab ab MS";i:1;s:40:" this, is . MS [B]windows[A]....?";i:2;s:38:"this , is a MS but not [B]Windows[A]";i:3;s:40:"this is the Microsoft [B]Windows[A] , ,";i:4;s:22:"profits, lost savings";}i:2;a:6:{s:12:"before_match";s:3:"[B]";s:11:"after_match";s:3:"[A]";s:15:"chunk_separator";s:5:" ... ";s:5:"limit";i:50;s:6:"around";i:2;s:11:"allow_empty";b:1;}i:3;a:5:{i:0;s:35:"ab ab ab ab ab ab ab ab ab ab ab MS";i:1;s:40:" this, is . MS [B]windows[A]....?";i:2;s:38:"this , is a MS but not [B]Windows[A]";i:3;s:40:"this is the Microsoft [B]Windows[A] , ,";i:4;s:22:"profits, lost savings";}i:4;a:6:{s:12:"before_match";s:3:"[B]";s:11:"after_match";s:3:"[A]";s:15:"chunk_separator";s:5:" ... ";s:5:"limit";i:30;s:6:"around";i:2;s:11:"allow_empty";b:1;}i:5;a:5:{i:0;s:34:"ab ab ab ab ab ab ab ab ab ab ... ";i:1;s:38:" ... , is . MS [B]windows[A]....?";i:2;s:39:" ... , is a MS but not [B]Windows[A]";i:3;s:41:" ... is the Microsoft [B]Windows[A] , ,";i:4;s:22:"profits, lost savings";}}}i:11;a:1:{i:0;a:6:{i:0;a:6:{s:12:"before_match";s:3:"[B]";s:11:"after_match";s:3:"[A]";s:15:"chunk_separator";s:5:" ... ";s:5:"limit";i:100;s:6:"around";i:2;s:11:"allow_empty";b:1;}i:1;a:5:{i:0;s:35:"ab ab ab ab ab ab ab ab ab ab ab MS";i:1;s:40:" this, is . MS [B]windows[A]....?";i:2;s:38:"this , is a MS but not [B]Windows[A]";i:3;s:40:"this is the Microsoft [B]Windows[A] , ,";i:4;s:22:"profits, lost savings";}i:2;a:6:{s:12:"before_match";s:3:"[B]";s:11:"after_match";s:3:"[A]";s:15:"chunk_separator";s:5:" ... ";s:5:"limit";i:50;s:6:"around";i:2;s:11:"allow_empty";b:1;}i:3;a:5:{i:0;s:35:"ab ab ab ab ab ab ab ab ab ab ab MS";i:1;s:40:" this, is . MS [B]windows[A]....?";i:2;s:38:"this , is a MS but not [B]Windows[A]";i:3;s:40:"this is the Microsoft [B]Windows[A] , ,";i:4;s:22:"profits, lost savings";}i:4;a:6:{s:12:"before_match";s:3:"[B]";s:11:"after_match";s:3:"[A]";s:15:"chunk_separator";s:5:" ... ";s:5:"limit";i:30;s:6:"around";i:2;s:11:"allow_empty";b:1;}i:5;a:5:{i:0;s:34:"ab ab ab ab ab ab ab ab ab ab ... ";i:1;s:38:" ... , is . MS [B]windows[A]....?";i:2;s:39:" ... , is a MS but not [B]Windows[A]";i:3;s:41:" ... is the Microsoft [B]Windows[A] , ,";i:4;s:22:"profits, lost savings";}}}i:12;a:1:{i:0;a:6:{i:0;a:6:{s:12:"before_match";s:3:"[B]";s:11:"after_match";s:3:"[A]";s:15:"chunk_separator";s:5:" ... ";s:5:"limit";i:100;s:6:"around";i:2;s:11:"allow_empty";b:1;}i:1;a:5:{i:0;s:41:"ab ab ab ab ab ab ab ab ab ab ab [B]MS[A]";i:1;s:46:" this, is . [B]MS[A] [B]windows[A]....?";i:2;s:44:"this , is a [B]MS[A] but not [B]Windows[A]";i:3;s:40:"this is the Microsoft [B]Windows[A] , ,";i:4;s:22:"profits, lost savings";}i:2;a:6:{s:12:"before_match";s:3:"[B]";s:11:"after_match";s:3:"[A]";s:15:"chunk_separator";s:5:" ... ";s:5:"limit";i:50;s:6:"around";i:2;s:11:"allow_empty";b:1;}i:3;a:5:{i:0;s:41:"ab ab ab ab ab ab ab ab ab ab ab [B]MS[A]";i:1;s:46:" this, is . [B]MS[A] [B]windows[A]....?";i:2;s:44:"this , is a [B]MS[A] but not [B]Windows[A]";i:3;s:40:"this is the Microsoft [B]Windows[A] , ,";i:4;s:22:"profits, lost savings";}i:4;a:6:{s:12:"before_match";s:3:"[B]";s:11:"after_match";s:3:"[A]";s:15:"chunk_separator";s:5:" ... ";s:5:"limit";i:30;s:6:"around";i:2;s:11:"allow_empty";b:1;}i:5;a:5:{i:0;s:20:" ... ab ab [B]MS[A]";i:1;s:44:" ... , is . [B]MS[A] [B]windows[A]....?";i:2;s:45:" ... , is a [B]MS[A] but not [B]Windows[A]";i:3;s:38:" ... the Microsoft [B]Windows[A] , ,";i:4;s:22:"profits, lost savings";}}}i:13;a:1:{i:0;a:6:{i:0;a:6:{s:12:"before_match";s:3:"[B]";s:11:"after_match";s:3:"[A]";s:15:"chunk_separator";s:5:" ... ";s:5:"limit";i:100;s:6:"around";i:2;s:11:"allow_empty";b:1;}i:1;a:5:{i:0;s:41:"ab ab ab ab ab ab ab ab ab ab ab [B]MS[A]";i:1;s:46:" this, is . [B]MS[A] [B]windows[A]....?";i:2;s:44:"this , is a [B]MS[A] but not [B]Windows[A]";i:3;s:40:"this is the Microsoft [B]Windows[A] , ,";i:4;s:22:"profits, lost savings";}i:2;a:6:{s:12:"before_match";s:3:"[B]";s:11:"after_match";s:3:"[A]";s:15:"chunk_separator";s:5:" ... ";s:5:"limit";i:50;s:6:"around";i:2;s:11:"allow_empty";b:1;}i:3;a:5:{i:0;s:41:"ab ab ab ab ab ab ab ab ab ab ab [B]MS[A]";i:1;s:46:" this, is . [B]MS[A] [B]windows[A]....?";i:2;s:44:"this , is a [B]MS[A] but not [B]Windows[A]";i:3;s:40:"this is the Microsoft [B]Windows[A] , ,";i:4;s:22:"profits, lost savings";}i:4;a:6:{s:12:"before_match";s:3:"[B]";s:11:"after_match";s:3:"[A]";s:15:"chunk_separator";s:5:" ... ";s:5:"limit";i:30;s:6:"around";i:2;s:11:"allow_empty";b:1;}i:5;a:5:{i:0;s:20:" ... ab ab [B]MS[A]";i:1;s:44:" ... , is . [B]MS[A] [B]windows[A]....?";i:2;s:45:" ... , is a [B]MS[A] but not [B]Windows[A]";i:3;s:38:" ... the Microsoft [B]Windows[A] , ,";i:4;s:22:"profits, lost savings";}}}i:14;a:1:{i:0;a:6:{i:0;a:6:{s:12:"before_match";s:3:"[B]";s:11:"after_match";s:3:"[A]";s:15:"chunk_separator";s:5:" ... ";s:5:"limit";i:100;s:6:"around";i:2;s:11:"allow_empty";b:1;}i:1;a:5:{i:0;s:35:"ab ab ab ab ab ab ab ab ab ab ab MS";i:1;s:40:" this, is . MS [B]windows[A]....?";i:2;s:38:"this , is a MS but not [B]Windows[A]";i:3;s:40:"this is the Microsoft [B]Windows[A] , ,";i:4;s:22:"profits, lost savings";}i:2;a:6:{s:12:"before_match";s:3:"[B]";s:11:"after_match";s:3:"[A]";s:15:"chunk_separator";s:5:" ... ";s:5:"limit";i:50;s:6:"around";i:2;s:11:"allow_empty";b:1;}i:3;a:5:{i:0;s:35:"ab ab ab ab ab ab ab ab ab ab ab MS";i:1;s:40:" this, is . MS [B]windows[A]....?";i:2;s:38:"this , is a MS but not [B]Windows[A]";i:3;s:40:"this is the Microsoft [B]Windows[A] , ,";i:4;s:22:"profits, lost savings";}i:4;a:6:{s:12:"before_match";s:3:"[B]";s:11:"after_match";s:3:"[A]";s:15:"chunk_separator";s:5:" ... ";s:5:"limit";i:30;s:6:"around";i:2;s:11:"allow_empty";b:1;}i:5;a:5:{i:0;s:34:"ab ab ab ab ab ab ab ab ab ab ... ";i:1;s:38:" ... , is . MS [B]windows[A]....?";i:2;s:39:" ... , is a MS but not [B]Windows[A]";i:3;s:41:" ... is the Microsoft [B]Windows[A] , ,";i:4;s:22:"profits, lost savings";}}}i:15;a:1:{i:0;a:6:{i:0;a:6:{s:12:"before_match";s:3:"[B]";s:11:"after_match";s:3:"[A]";s:15:"chunk_separator";s:5:" ... ";s:5:"limit";i:100;s:6:"around";i:2;s:11:"allow_empty";b:1;}i:1;a:5:{i:0;s:35:"ab ab ab ab ab ab ab ab ab ab ab MS";i:1;s:40:" this, is . MS [B]windows[A]....?";i:2;s:38:"this , is a MS but not [B]Windows[A]";i:3;s:40:"this is the Microsoft [B]Windows[A] , ,";i:4;s:22:"profits, lost savings";}i:2;a:6:{s:12:"before_match";s:3:"[B]";s:11:"after_match";s:3:"[A]";s:15:"chunk_separator";s:5:" ... ";s:5:"limit";i:50;s:6:"around";i:2;s:11:"allow_empty";b:1;}i:3;a:5:{i:0;s:35:"ab ab ab ab ab ab ab ab ab ab ab MS";i:1;s:40:" this, is . MS [B]windows[A]....?";i:2;s:38:"this , is a MS but not [B]Windows[A]";i:3;s:40:"this is the Microsoft [B]Windows[A] , ,";i:4;s:22:"profits, lost savings";}i:4;a:6:{s:12:"before_match";s:3:"[B]";s:11:"after_match";s:3:"[A]";s:15:"chunk_separator";s:5:" ... ";s:5:"limit";i:30;s:6:"around";i:2;s:11:"allow_empty";b:1;}i:5;a:5:{i:0;s:34:"ab ab ab ab ab ab ab ab ab ab ... ";i:1;s:38:" ... , is . MS [B]windows[A]....?";i:2;s:39:" ... , is a MS but not [B]Windows[A]";i:3;s:41:" ... is the Microsoft [B]Windows[A] , ,";i:4;s:22:"profits, lost savings";}}}} \ No newline at end of file +a:16:{i:0;a:1:{i:0;a:6:{i:0;a:5:{s:12:"before_match";s:3:"[B]";s:11:"after_match";s:3:"[A]";s:15:"chunk_separator";s:5:" ... ";s:5:"limit";i:100;s:6:"around";i:2;}i:1;a:5:{i:0;s:35:"ab ab ab ab ab ab ab ab ab ab ab MS";i:1;s:34:" this, is . MS windows....?";i:2;s:38:"this , is a MS but not [B]Windows[A]";i:3;s:40:"this is the [B]Microsoft Windows[A] , ,";i:4;s:22:"profits, lost savings";}i:2;a:5:{s:12:"before_match";s:3:"[B]";s:11:"after_match";s:3:"[A]";s:15:"chunk_separator";s:5:" ... ";s:5:"limit";i:50;s:6:"around";i:2;}i:3;a:5:{i:0;s:35:"ab ab ab ab ab ab ab ab ab ab ab MS";i:1;s:34:" this, is . MS windows....?";i:2;s:38:"this , is a MS but not [B]Windows[A]";i:3;s:40:"this is the [B]Microsoft Windows[A] , ,";i:4;s:22:"profits, lost savings";}i:4;a:5:{s:12:"before_match";s:3:"[B]";s:11:"after_match";s:3:"[A]";s:15:"chunk_separator";s:5:" ... ";s:5:"limit";i:30;s:6:"around";i:2;}i:5;a:5:{i:0;s:34:"ab ab ab ab ab ab ab ab ab ab ... ";i:1;s:34:" this, is . MS windows ... ";i:2;s:27:" ... but not [B]Windows[A]";i:3;s:41:" ... is the [B]Microsoft Windows[A] , ,";i:4;s:22:"profits, lost savings";}}}i:1;a:1:{i:0;a:6:{i:0;a:5:{s:12:"before_match";s:3:"[B]";s:11:"after_match";s:3:"[A]";s:15:"chunk_separator";s:5:" ... ";s:5:"limit";i:100;s:6:"around";i:2;}i:1;a:5:{i:0;s:35:"ab ab ab ab ab ab ab ab ab ab ab MS";i:1;s:34:" this, is . MS windows....?";i:2;s:38:"this , is a MS but not [B]Windows[A]";i:3;s:40:"this is the [B]Microsoft Windows[A] , ,";i:4;s:22:"profits, lost savings";}i:2;a:5:{s:12:"before_match";s:3:"[B]";s:11:"after_match";s:3:"[A]";s:15:"chunk_separator";s:5:" ... ";s:5:"limit";i:50;s:6:"around";i:2;}i:3;a:5:{i:0;s:35:"ab ab ab ab ab ab ab ab ab ab ab MS";i:1;s:34:" this, is . MS windows....?";i:2;s:38:"this , is a MS but not [B]Windows[A]";i:3;s:40:"this is the [B]Microsoft Windows[A] , ,";i:4;s:22:"profits, lost savings";}i:4;a:5:{s:12:"before_match";s:3:"[B]";s:11:"after_match";s:3:"[A]";s:15:"chunk_separator";s:5:" ... ";s:5:"limit";i:30;s:6:"around";i:2;}i:5;a:5:{i:0;s:34:"ab ab ab ab ab ab ab ab ab ab ... ";i:1;s:34:" this, is . MS windows ... ";i:2;s:27:" ... but not [B]Windows[A]";i:3;s:41:" ... is the [B]Microsoft Windows[A] , ,";i:4;s:22:"profits, lost savings";}}}i:2;a:1:{i:0;a:6:{i:0;a:5:{s:12:"before_match";s:3:"[B]";s:11:"after_match";s:3:"[A]";s:15:"chunk_separator";s:5:" ... ";s:5:"limit";i:100;s:6:"around";i:2;}i:1;a:5:{i:0;s:35:"ab ab ab ab ab ab ab ab ab ab ab MS";i:1;s:34:" this, is . MS windows....?";i:2;s:38:"this , is a MS but not [B]Windows[A]";i:3;s:40:"this is the [B]Microsoft Windows[A] , ,";i:4;s:22:"profits, lost savings";}i:2;a:5:{s:12:"before_match";s:3:"[B]";s:11:"after_match";s:3:"[A]";s:15:"chunk_separator";s:5:" ... ";s:5:"limit";i:50;s:6:"around";i:2;}i:3;a:5:{i:0;s:35:"ab ab ab ab ab ab ab ab ab ab ab MS";i:1;s:34:" this, is . MS windows....?";i:2;s:38:"this , is a MS but not [B]Windows[A]";i:3;s:40:"this is the [B]Microsoft Windows[A] , ,";i:4;s:22:"profits, lost savings";}i:4;a:5:{s:12:"before_match";s:3:"[B]";s:11:"after_match";s:3:"[A]";s:15:"chunk_separator";s:5:" ... ";s:5:"limit";i:30;s:6:"around";i:2;}i:5;a:5:{i:0;s:34:"ab ab ab ab ab ab ab ab ab ab ... ";i:1;s:34:" this, is . MS windows ... ";i:2;s:39:" ... , is a MS but not [B]Windows[A]";i:3;s:41:" ... is the [B]Microsoft Windows[A] , ,";i:4;s:22:"profits, lost savings";}}}i:3;a:1:{i:0;a:6:{i:0;a:5:{s:12:"before_match";s:3:"[B]";s:11:"after_match";s:3:"[A]";s:15:"chunk_separator";s:5:" ... ";s:5:"limit";i:100;s:6:"around";i:2;}i:1;a:5:{i:0;s:35:"ab ab ab ab ab ab ab ab ab ab ab MS";i:1;s:34:" this, is . MS windows....?";i:2;s:38:"this , is a MS but not [B]Windows[A]";i:3;s:40:"this is the [B]Microsoft Windows[A] , ,";i:4;s:22:"profits, lost savings";}i:2;a:5:{s:12:"before_match";s:3:"[B]";s:11:"after_match";s:3:"[A]";s:15:"chunk_separator";s:5:" ... ";s:5:"limit";i:50;s:6:"around";i:2;}i:3;a:5:{i:0;s:35:"ab ab ab ab ab ab ab ab ab ab ab MS";i:1;s:34:" this, is . MS windows....?";i:2;s:38:"this , is a MS but not [B]Windows[A]";i:3;s:40:"this is the [B]Microsoft Windows[A] , ,";i:4;s:22:"profits, lost savings";}i:4;a:5:{s:12:"before_match";s:3:"[B]";s:11:"after_match";s:3:"[A]";s:15:"chunk_separator";s:5:" ... ";s:5:"limit";i:30;s:6:"around";i:2;}i:5;a:5:{i:0;s:34:"ab ab ab ab ab ab ab ab ab ab ... ";i:1;s:34:" this, is . MS windows ... ";i:2;s:39:" ... , is a MS but not [B]Windows[A]";i:3;s:41:" ... is the [B]Microsoft Windows[A] , ,";i:4;s:22:"profits, lost savings";}}}i:4;a:1:{i:0;a:6:{i:0;a:5:{s:12:"before_match";s:3:"[B]";s:11:"after_match";s:3:"[A]";s:15:"chunk_separator";s:5:" ... ";s:5:"limit";i:100;s:6:"around";i:2;}i:1;a:5:{i:0;s:35:"ab ab ab ab ab ab ab ab ab ab ab MS";i:1;s:34:" this, is . MS windows....?";i:2;s:38:"this , is a MS but not [B]Windows[A]";i:3;s:40:"this is the [B]Microsoft Windows[A] , ,";i:4;s:22:"profits, lost savings";}i:2;a:5:{s:12:"before_match";s:3:"[B]";s:11:"after_match";s:3:"[A]";s:15:"chunk_separator";s:5:" ... ";s:5:"limit";i:50;s:6:"around";i:2;}i:3;a:5:{i:0;s:35:"ab ab ab ab ab ab ab ab ab ab ab MS";i:1;s:34:" this, is . MS windows....?";i:2;s:38:"this , is a MS but not [B]Windows[A]";i:3;s:40:"this is the [B]Microsoft Windows[A] , ,";i:4;s:22:"profits, lost savings";}i:4;a:5:{s:12:"before_match";s:3:"[B]";s:11:"after_match";s:3:"[A]";s:15:"chunk_separator";s:5:" ... ";s:5:"limit";i:30;s:6:"around";i:2;}i:5;a:5:{i:0;s:34:"ab ab ab ab ab ab ab ab ab ab ... ";i:1;s:34:" this, is . MS windows ... ";i:2;s:27:" ... but not [B]Windows[A]";i:3;s:41:" ... is the [B]Microsoft Windows[A] , ,";i:4;s:22:"profits, lost savings";}}}i:5;a:1:{i:0;a:6:{i:0;a:5:{s:12:"before_match";s:3:"[B]";s:11:"after_match";s:3:"[A]";s:15:"chunk_separator";s:5:" ... ";s:5:"limit";i:100;s:6:"around";i:2;}i:1;a:5:{i:0;s:35:"ab ab ab ab ab ab ab ab ab ab ab MS";i:1;s:34:" this, is . MS windows....?";i:2;s:38:"this , is a MS but not [B]Windows[A]";i:3;s:40:"this is the [B]Microsoft Windows[A] , ,";i:4;s:22:"profits, lost savings";}i:2;a:5:{s:12:"before_match";s:3:"[B]";s:11:"after_match";s:3:"[A]";s:15:"chunk_separator";s:5:" ... ";s:5:"limit";i:50;s:6:"around";i:2;}i:3;a:5:{i:0;s:35:"ab ab ab ab ab ab ab ab ab ab ab MS";i:1;s:34:" this, is . MS windows....?";i:2;s:38:"this , is a MS but not [B]Windows[A]";i:3;s:40:"this is the [B]Microsoft Windows[A] , ,";i:4;s:22:"profits, lost savings";}i:4;a:5:{s:12:"before_match";s:3:"[B]";s:11:"after_match";s:3:"[A]";s:15:"chunk_separator";s:5:" ... ";s:5:"limit";i:30;s:6:"around";i:2;}i:5;a:5:{i:0;s:34:"ab ab ab ab ab ab ab ab ab ab ... ";i:1;s:34:" this, is . MS windows ... ";i:2;s:27:" ... but not [B]Windows[A]";i:3;s:41:" ... is the [B]Microsoft Windows[A] , ,";i:4;s:22:"profits, lost savings";}}}i:6;a:1:{i:0;a:6:{i:0;a:5:{s:12:"before_match";s:3:"[B]";s:11:"after_match";s:3:"[A]";s:15:"chunk_separator";s:5:" ... ";s:5:"limit";i:100;s:6:"around";i:2;}i:1;a:5:{i:0;s:35:"ab ab ab ab ab ab ab ab ab ab ab MS";i:1;s:34:" this, is . MS windows....?";i:2;s:38:"this , is a MS but not [B]Windows[A]";i:3;s:40:"this is the [B]Microsoft Windows[A] , ,";i:4;s:22:"profits, lost savings";}i:2;a:5:{s:12:"before_match";s:3:"[B]";s:11:"after_match";s:3:"[A]";s:15:"chunk_separator";s:5:" ... ";s:5:"limit";i:50;s:6:"around";i:2;}i:3;a:5:{i:0;s:35:"ab ab ab ab ab ab ab ab ab ab ab MS";i:1;s:34:" this, is . MS windows....?";i:2;s:38:"this , is a MS but not [B]Windows[A]";i:3;s:40:"this is the [B]Microsoft Windows[A] , ,";i:4;s:22:"profits, lost savings";}i:4;a:5:{s:12:"before_match";s:3:"[B]";s:11:"after_match";s:3:"[A]";s:15:"chunk_separator";s:5:" ... ";s:5:"limit";i:30;s:6:"around";i:2;}i:5;a:5:{i:0;s:34:"ab ab ab ab ab ab ab ab ab ab ... ";i:1;s:34:" this, is . MS windows ... ";i:2;s:39:" ... , is a MS but not [B]Windows[A]";i:3;s:41:" ... is the [B]Microsoft Windows[A] , ,";i:4;s:22:"profits, lost savings";}}}i:7;a:1:{i:0;a:6:{i:0;a:5:{s:12:"before_match";s:3:"[B]";s:11:"after_match";s:3:"[A]";s:15:"chunk_separator";s:5:" ... ";s:5:"limit";i:100;s:6:"around";i:2;}i:1;a:5:{i:0;s:35:"ab ab ab ab ab ab ab ab ab ab ab MS";i:1;s:34:" this, is . MS windows....?";i:2;s:38:"this , is a MS but not [B]Windows[A]";i:3;s:40:"this is the [B]Microsoft Windows[A] , ,";i:4;s:22:"profits, lost savings";}i:2;a:5:{s:12:"before_match";s:3:"[B]";s:11:"after_match";s:3:"[A]";s:15:"chunk_separator";s:5:" ... ";s:5:"limit";i:50;s:6:"around";i:2;}i:3;a:5:{i:0;s:35:"ab ab ab ab ab ab ab ab ab ab ab MS";i:1;s:34:" this, is . MS windows....?";i:2;s:38:"this , is a MS but not [B]Windows[A]";i:3;s:40:"this is the [B]Microsoft Windows[A] , ,";i:4;s:22:"profits, lost savings";}i:4;a:5:{s:12:"before_match";s:3:"[B]";s:11:"after_match";s:3:"[A]";s:15:"chunk_separator";s:5:" ... ";s:5:"limit";i:30;s:6:"around";i:2;}i:5;a:5:{i:0;s:34:"ab ab ab ab ab ab ab ab ab ab ... ";i:1;s:34:" this, is . MS windows ... ";i:2;s:39:" ... , is a MS but not [B]Windows[A]";i:3;s:41:" ... is the [B]Microsoft Windows[A] , ,";i:4;s:22:"profits, lost savings";}}}i:8;a:1:{i:0;a:6:{i:0;a:5:{s:12:"before_match";s:3:"[B]";s:11:"after_match";s:3:"[A]";s:15:"chunk_separator";s:5:" ... ";s:5:"limit";i:100;s:6:"around";i:2;}i:1;a:5:{i:0;s:41:"ab ab ab ab ab ab ab ab ab ab ab [B]MS[A]";i:1;s:46:" this, is . [B]MS[A] [B]windows[A]....?";i:2;s:44:"this , is a [B]MS[A] but not [B]Windows[A]";i:3;s:40:"this is the Microsoft [B]Windows[A] , ,";i:4;s:22:"profits, lost savings";}i:2;a:5:{s:12:"before_match";s:3:"[B]";s:11:"after_match";s:3:"[A]";s:15:"chunk_separator";s:5:" ... ";s:5:"limit";i:50;s:6:"around";i:2;}i:3;a:5:{i:0;s:41:"ab ab ab ab ab ab ab ab ab ab ab [B]MS[A]";i:1;s:46:" this, is . [B]MS[A] [B]windows[A]....?";i:2;s:44:"this , is a [B]MS[A] but not [B]Windows[A]";i:3;s:40:"this is the Microsoft [B]Windows[A] , ,";i:4;s:22:"profits, lost savings";}i:4;a:5:{s:12:"before_match";s:3:"[B]";s:11:"after_match";s:3:"[A]";s:15:"chunk_separator";s:5:" ... ";s:5:"limit";i:30;s:6:"around";i:2;}i:5;a:5:{i:0;s:20:" ... ab ab [B]MS[A]";i:1;s:44:" ... , is . [B]MS[A] [B]windows[A]....?";i:2;s:45:" ... , is a [B]MS[A] but not [B]Windows[A]";i:3;s:38:" ... the Microsoft [B]Windows[A] , ,";i:4;s:22:"profits, lost savings";}}}i:9;a:1:{i:0;a:6:{i:0;a:5:{s:12:"before_match";s:3:"[B]";s:11:"after_match";s:3:"[A]";s:15:"chunk_separator";s:5:" ... ";s:5:"limit";i:100;s:6:"around";i:2;}i:1;a:5:{i:0;s:41:"ab ab ab ab ab ab ab ab ab ab ab [B]MS[A]";i:1;s:46:" this, is . [B]MS[A] [B]windows[A]....?";i:2;s:44:"this , is a [B]MS[A] but not [B]Windows[A]";i:3;s:40:"this is the Microsoft [B]Windows[A] , ,";i:4;s:22:"profits, lost savings";}i:2;a:5:{s:12:"before_match";s:3:"[B]";s:11:"after_match";s:3:"[A]";s:15:"chunk_separator";s:5:" ... ";s:5:"limit";i:50;s:6:"around";i:2;}i:3;a:5:{i:0;s:41:"ab ab ab ab ab ab ab ab ab ab ab [B]MS[A]";i:1;s:46:" this, is . [B]MS[A] [B]windows[A]....?";i:2;s:44:"this , is a [B]MS[A] but not [B]Windows[A]";i:3;s:40:"this is the Microsoft [B]Windows[A] , ,";i:4;s:22:"profits, lost savings";}i:4;a:5:{s:12:"before_match";s:3:"[B]";s:11:"after_match";s:3:"[A]";s:15:"chunk_separator";s:5:" ... ";s:5:"limit";i:30;s:6:"around";i:2;}i:5;a:5:{i:0;s:20:" ... ab ab [B]MS[A]";i:1;s:44:" ... , is . [B]MS[A] [B]windows[A]....?";i:2;s:45:" ... , is a [B]MS[A] but not [B]Windows[A]";i:3;s:38:" ... the Microsoft [B]Windows[A] , ,";i:4;s:22:"profits, lost savings";}}}i:10;a:1:{i:0;a:6:{i:0;a:5:{s:12:"before_match";s:3:"[B]";s:11:"after_match";s:3:"[A]";s:15:"chunk_separator";s:5:" ... ";s:5:"limit";i:100;s:6:"around";i:2;}i:1;a:5:{i:0;s:35:"ab ab ab ab ab ab ab ab ab ab ab MS";i:1;s:40:" this, is . MS [B]windows[A]....?";i:2;s:38:"this , is a MS but not [B]Windows[A]";i:3;s:40:"this is the Microsoft [B]Windows[A] , ,";i:4;s:22:"profits, lost savings";}i:2;a:5:{s:12:"before_match";s:3:"[B]";s:11:"after_match";s:3:"[A]";s:15:"chunk_separator";s:5:" ... ";s:5:"limit";i:50;s:6:"around";i:2;}i:3;a:5:{i:0;s:35:"ab ab ab ab ab ab ab ab ab ab ab MS";i:1;s:40:" this, is . MS [B]windows[A]....?";i:2;s:38:"this , is a MS but not [B]Windows[A]";i:3;s:40:"this is the Microsoft [B]Windows[A] , ,";i:4;s:22:"profits, lost savings";}i:4;a:5:{s:12:"before_match";s:3:"[B]";s:11:"after_match";s:3:"[A]";s:15:"chunk_separator";s:5:" ... ";s:5:"limit";i:30;s:6:"around";i:2;}i:5;a:5:{i:0;s:34:"ab ab ab ab ab ab ab ab ab ab ... ";i:1;s:38:" ... , is . MS [B]windows[A]....?";i:2;s:39:" ... , is a MS but not [B]Windows[A]";i:3;s:41:" ... is the Microsoft [B]Windows[A] , ,";i:4;s:22:"profits, lost savings";}}}i:11;a:1:{i:0;a:6:{i:0;a:5:{s:12:"before_match";s:3:"[B]";s:11:"after_match";s:3:"[A]";s:15:"chunk_separator";s:5:" ... ";s:5:"limit";i:100;s:6:"around";i:2;}i:1;a:5:{i:0;s:35:"ab ab ab ab ab ab ab ab ab ab ab MS";i:1;s:40:" this, is . MS [B]windows[A]....?";i:2;s:38:"this , is a MS but not [B]Windows[A]";i:3;s:40:"this is the Microsoft [B]Windows[A] , ,";i:4;s:22:"profits, lost savings";}i:2;a:5:{s:12:"before_match";s:3:"[B]";s:11:"after_match";s:3:"[A]";s:15:"chunk_separator";s:5:" ... ";s:5:"limit";i:50;s:6:"around";i:2;}i:3;a:5:{i:0;s:35:"ab ab ab ab ab ab ab ab ab ab ab MS";i:1;s:40:" this, is . MS [B]windows[A]....?";i:2;s:38:"this , is a MS but not [B]Windows[A]";i:3;s:40:"this is the Microsoft [B]Windows[A] , ,";i:4;s:22:"profits, lost savings";}i:4;a:5:{s:12:"before_match";s:3:"[B]";s:11:"after_match";s:3:"[A]";s:15:"chunk_separator";s:5:" ... ";s:5:"limit";i:30;s:6:"around";i:2;}i:5;a:5:{i:0;s:34:"ab ab ab ab ab ab ab ab ab ab ... ";i:1;s:38:" ... , is . MS [B]windows[A]....?";i:2;s:39:" ... , is a MS but not [B]Windows[A]";i:3;s:41:" ... is the Microsoft [B]Windows[A] , ,";i:4;s:22:"profits, lost savings";}}}i:12;a:1:{i:0;a:6:{i:0;a:5:{s:12:"before_match";s:3:"[B]";s:11:"after_match";s:3:"[A]";s:15:"chunk_separator";s:5:" ... ";s:5:"limit";i:100;s:6:"around";i:2;}i:1;a:5:{i:0;s:41:"ab ab ab ab ab ab ab ab ab ab ab [B]MS[A]";i:1;s:46:" this, is . [B]MS[A] [B]windows[A]....?";i:2;s:44:"this , is a [B]MS[A] but not [B]Windows[A]";i:3;s:40:"this is the Microsoft [B]Windows[A] , ,";i:4;s:22:"profits, lost savings";}i:2;a:5:{s:12:"before_match";s:3:"[B]";s:11:"after_match";s:3:"[A]";s:15:"chunk_separator";s:5:" ... ";s:5:"limit";i:50;s:6:"around";i:2;}i:3;a:5:{i:0;s:41:"ab ab ab ab ab ab ab ab ab ab ab [B]MS[A]";i:1;s:46:" this, is . [B]MS[A] [B]windows[A]....?";i:2;s:44:"this , is a [B]MS[A] but not [B]Windows[A]";i:3;s:40:"this is the Microsoft [B]Windows[A] , ,";i:4;s:22:"profits, lost savings";}i:4;a:5:{s:12:"before_match";s:3:"[B]";s:11:"after_match";s:3:"[A]";s:15:"chunk_separator";s:5:" ... ";s:5:"limit";i:30;s:6:"around";i:2;}i:5;a:5:{i:0;s:20:" ... ab ab [B]MS[A]";i:1;s:44:" ... , is . [B]MS[A] [B]windows[A]....?";i:2;s:45:" ... , is a [B]MS[A] but not [B]Windows[A]";i:3;s:38:" ... the Microsoft [B]Windows[A] , ,";i:4;s:22:"profits, lost savings";}}}i:13;a:1:{i:0;a:6:{i:0;a:5:{s:12:"before_match";s:3:"[B]";s:11:"after_match";s:3:"[A]";s:15:"chunk_separator";s:5:" ... ";s:5:"limit";i:100;s:6:"around";i:2;}i:1;a:5:{i:0;s:41:"ab ab ab ab ab ab ab ab ab ab ab [B]MS[A]";i:1;s:46:" this, is . [B]MS[A] [B]windows[A]....?";i:2;s:44:"this , is a [B]MS[A] but not [B]Windows[A]";i:3;s:40:"this is the Microsoft [B]Windows[A] , ,";i:4;s:22:"profits, lost savings";}i:2;a:5:{s:12:"before_match";s:3:"[B]";s:11:"after_match";s:3:"[A]";s:15:"chunk_separator";s:5:" ... ";s:5:"limit";i:50;s:6:"around";i:2;}i:3;a:5:{i:0;s:41:"ab ab ab ab ab ab ab ab ab ab ab [B]MS[A]";i:1;s:46:" this, is . [B]MS[A] [B]windows[A]....?";i:2;s:44:"this , is a [B]MS[A] but not [B]Windows[A]";i:3;s:40:"this is the Microsoft [B]Windows[A] , ,";i:4;s:22:"profits, lost savings";}i:4;a:5:{s:12:"before_match";s:3:"[B]";s:11:"after_match";s:3:"[A]";s:15:"chunk_separator";s:5:" ... ";s:5:"limit";i:30;s:6:"around";i:2;}i:5;a:5:{i:0;s:20:" ... ab ab [B]MS[A]";i:1;s:44:" ... , is . [B]MS[A] [B]windows[A]....?";i:2;s:45:" ... , is a [B]MS[A] but not [B]Windows[A]";i:3;s:38:" ... the Microsoft [B]Windows[A] , ,";i:4;s:22:"profits, lost savings";}}}i:14;a:1:{i:0;a:6:{i:0;a:5:{s:12:"before_match";s:3:"[B]";s:11:"after_match";s:3:"[A]";s:15:"chunk_separator";s:5:" ... ";s:5:"limit";i:100;s:6:"around";i:2;}i:1;a:5:{i:0;s:35:"ab ab ab ab ab ab ab ab ab ab ab MS";i:1;s:40:" this, is . MS [B]windows[A]....?";i:2;s:38:"this , is a MS but not [B]Windows[A]";i:3;s:40:"this is the Microsoft [B]Windows[A] , ,";i:4;s:22:"profits, lost savings";}i:2;a:5:{s:12:"before_match";s:3:"[B]";s:11:"after_match";s:3:"[A]";s:15:"chunk_separator";s:5:" ... ";s:5:"limit";i:50;s:6:"around";i:2;}i:3;a:5:{i:0;s:35:"ab ab ab ab ab ab ab ab ab ab ab MS";i:1;s:40:" this, is . MS [B]windows[A]....?";i:2;s:38:"this , is a MS but not [B]Windows[A]";i:3;s:40:"this is the Microsoft [B]Windows[A] , ,";i:4;s:22:"profits, lost savings";}i:4;a:5:{s:12:"before_match";s:3:"[B]";s:11:"after_match";s:3:"[A]";s:15:"chunk_separator";s:5:" ... ";s:5:"limit";i:30;s:6:"around";i:2;}i:5;a:5:{i:0;s:34:"ab ab ab ab ab ab ab ab ab ab ... ";i:1;s:38:" ... , is . MS [B]windows[A]....?";i:2;s:39:" ... , is a MS but not [B]Windows[A]";i:3;s:41:" ... is the Microsoft [B]Windows[A] , ,";i:4;s:22:"profits, lost savings";}}}i:15;a:1:{i:0;a:6:{i:0;a:5:{s:12:"before_match";s:3:"[B]";s:11:"after_match";s:3:"[A]";s:15:"chunk_separator";s:5:" ... ";s:5:"limit";i:100;s:6:"around";i:2;}i:1;a:5:{i:0;s:35:"ab ab ab ab ab ab ab ab ab ab ab MS";i:1;s:40:" this, is . MS [B]windows[A]....?";i:2;s:38:"this , is a MS but not [B]Windows[A]";i:3;s:40:"this is the Microsoft [B]Windows[A] , ,";i:4;s:22:"profits, lost savings";}i:2;a:5:{s:12:"before_match";s:3:"[B]";s:11:"after_match";s:3:"[A]";s:15:"chunk_separator";s:5:" ... ";s:5:"limit";i:50;s:6:"around";i:2;}i:3;a:5:{i:0;s:35:"ab ab ab ab ab ab ab ab ab ab ab MS";i:1;s:40:" this, is . MS [B]windows[A]....?";i:2;s:38:"this , is a MS but not [B]Windows[A]";i:3;s:40:"this is the Microsoft [B]Windows[A] , ,";i:4;s:22:"profits, lost savings";}i:4;a:5:{s:12:"before_match";s:3:"[B]";s:11:"after_match";s:3:"[A]";s:15:"chunk_separator";s:5:" ... ";s:5:"limit";i:30;s:6:"around";i:2;}i:5;a:5:{i:0;s:34:"ab ab ab ab ab ab ab ab ab ab ... ";i:1;s:38:" ... , is . MS [B]windows[A]....?";i:2;s:39:" ... , is a MS but not [B]Windows[A]";i:3;s:41:" ... is the Microsoft [B]Windows[A] , ,";i:4;s:22:"profits, lost savings";}}}} \ No newline at end of file diff -Nru sphinxsearch-0.9.9+2.0.2beta/test/test_018/test.xml sphinxsearch-2.0.4/test/test_018/test.xml --- sphinxsearch-0.9.9+2.0.2beta/test/test_018/test.xml 2011-07-12 15:43:45.000000000 +0000 +++ sphinxsearch-2.0.4/test/test_018/test.xml 2011-11-21 15:58:19.000000000 +0000 @@ -78,8 +78,7 @@ "after_match" => "[A]", "chunk_separator" => " ... ", "limit" => 100, - "around" => 2, - "allow_empty"=>true + "around" => 2 ); $results = array (); @@ -98,8 +97,7 @@ "after_match" => "[A]", "chunk_separator" => " ... ", "limit" => 50, - "around" => 2, - "allow_empty"=>true + "around" => 2 ); $results [] = $opts; @@ -117,8 +115,7 @@ "after_match" => "[A]", "chunk_separator" => " ... ", "limit" => 30, - "around" => 2, - "allow_empty"=>true + "around" => 2 ); $results [] = $opts; diff -Nru sphinxsearch-0.9.9+2.0.2beta/test/test_043/model.bin sphinxsearch-2.0.4/test/test_043/model.bin --- sphinxsearch-0.9.9+2.0.2beta/test/test_043/model.bin 2008-09-22 13:01:52.000000000 +0000 +++ sphinxsearch-2.0.4/test/test_043/model.bin 2012-02-01 20:57:11.000000000 +0000 @@ -1 +1 @@ -a:1:{i:0;a:6:{i:0;a:11:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:4:{i:0;s:6:"t_zlib";i:1;s:7:"t_mysql";i:2;s:5:"plain";i:3;s:9:"t_mysql_2";}s:5:"attrs";a:3:{s:4:"at_1";i:1;s:4:"at_2";i:1;s:4:"at_3";i:1;}s:7:"matches";a:1:{i:1;a:2:{s:6:"weight";s:1:"1";s:5:"attrs";a:3:{s:4:"at_1";s:1:"1";s:4:"at_2";s:1:"2";s:4:"at_3";s:1:"3";}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.001";s:5:"words";a:1:{s:4:"zlib";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:5:"query";s:4:"zlib";}i:1;a:11:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:4:{i:0;s:6:"t_zlib";i:1;s:7:"t_mysql";i:2;s:5:"plain";i:3;s:9:"t_mysql_2";}s:5:"attrs";a:3:{s:4:"at_1";i:1;s:4:"at_2";i:1;s:4:"at_3";i:1;}s:7:"matches";a:1:{i:2;a:2:{s:6:"weight";s:1:"1";s:5:"attrs";a:3:{s:4:"at_1";s:1:"1";s:4:"at_2";s:1:"2";s:4:"at_3";s:1:"3";}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.001";s:5:"words";a:1:{s:5:"mysql";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:5:"query";s:5:"mysql";}i:2;a:11:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:4:{i:0;s:6:"t_zlib";i:1;s:7:"t_mysql";i:2;s:5:"plain";i:3;s:9:"t_mysql_2";}s:5:"attrs";a:3:{s:4:"at_1";i:1;s:4:"at_2";i:1;s:4:"at_3";i:1;}s:7:"matches";a:1:{i:3;a:2:{s:6:"weight";s:1:"2";s:5:"attrs";a:3:{s:4:"at_1";s:1:"1";s:4:"at_2";s:1:"2";s:4:"at_3";s:1:"3";}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.002";s:5:"words";a:2:{s:5:"hello";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}s:5:"world";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:5:"query";s:11:"hello world";}i:3;a:11:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:4:{i:0;s:6:"t_zlib";i:1;s:7:"t_mysql";i:2;s:5:"plain";i:3;s:9:"t_mysql_2";}s:5:"attrs";a:3:{s:4:"at_1";i:1;s:4:"at_2";i:1;s:4:"at_3";i:1;}s:7:"matches";a:1:{i:1;a:2:{s:6:"weight";s:1:"1";s:5:"attrs";a:3:{s:4:"at_1";s:1:"1";s:4:"at_2";s:1:"2";s:4:"at_3";s:1:"3";}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.001";s:5:"words";a:1:{s:5:"plain";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:5:"query";s:5:"plain";}i:4;a:10:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:4:{i:0;s:6:"t_zlib";i:1;s:7:"t_mysql";i:2;s:5:"plain";i:3;s:9:"t_mysql_2";}s:5:"attrs";a:3:{s:4:"at_1";i:1;s:4:"at_2";i:1;s:4:"at_3";i:1;}s:5:"total";s:1:"0";s:11:"total_found";s:1:"0";s:4:"time";s:5:"0.001";s:5:"words";a:1:{s:9:"malformed";a:2:{s:4:"docs";s:1:"0";s:4:"hits";s:1:"0";}}s:5:"query";s:9:"malformed";}i:5;a:10:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:4:{i:0;s:6:"t_zlib";i:1;s:7:"t_mysql";i:2;s:5:"plain";i:3;s:9:"t_mysql_2";}s:5:"attrs";a:3:{s:4:"at_1";i:1;s:4:"at_2";i:1;s:4:"at_3";i:1;}s:5:"total";s:1:"0";s:11:"total_found";s:1:"0";s:4:"time";s:5:"0.001";s:5:"words";a:1:{s:6:"broken";a:2:{s:4:"docs";s:1:"0";s:4:"hits";s:1:"0";}}s:5:"query";s:6:"broken";}}} \ No newline at end of file +a:1:{i:0;a:8:{i:0;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:4:{i:0;s:6:"t_zlib";i:1;s:7:"t_mysql";i:2;s:5:"plain";i:3;s:9:"t_mysql_2";}s:5:"attrs";a:3:{s:4:"at_1";i:1;s:4:"at_2";i:1;s:4:"at_3";i:1;}s:7:"matches";a:1:{i:1;a:2:{s:6:"weight";s:1:"1";s:5:"attrs";a:3:{s:4:"at_1";s:1:"1";s:4:"at_2";s:1:"2";s:4:"at_3";s:1:"3";}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:4:"zlib";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:4:"zlib";}i:1;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:4:{i:0;s:6:"t_zlib";i:1;s:7:"t_mysql";i:2;s:5:"plain";i:3;s:9:"t_mysql_2";}s:5:"attrs";a:3:{s:4:"at_1";i:1;s:4:"at_2";i:1;s:4:"at_3";i:1;}s:7:"matches";a:1:{i:2;a:2:{s:6:"weight";s:1:"1";s:5:"attrs";a:3:{s:4:"at_1";s:1:"1";s:4:"at_2";s:1:"2";s:4:"at_3";s:1:"3";}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:5:"mysql";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:5:"mysql";}i:2;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:4:{i:0;s:6:"t_zlib";i:1;s:7:"t_mysql";i:2;s:5:"plain";i:3;s:9:"t_mysql_2";}s:5:"attrs";a:3:{s:4:"at_1";i:1;s:4:"at_2";i:1;s:4:"at_3";i:1;}s:7:"matches";a:1:{i:3;a:2:{s:6:"weight";s:1:"2";s:5:"attrs";a:3:{s:4:"at_1";s:1:"1";s:4:"at_2";s:1:"2";s:4:"at_3";s:1:"3";}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.001";s:5:"words";a:2:{s:5:"hello";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}s:5:"world";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:11:"hello world";}i:3;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:4:{i:0;s:6:"t_zlib";i:1;s:7:"t_mysql";i:2;s:5:"plain";i:3;s:9:"t_mysql_2";}s:5:"attrs";a:3:{s:4:"at_1";i:1;s:4:"at_2";i:1;s:4:"at_3";i:1;}s:7:"matches";a:1:{i:1;a:2:{s:6:"weight";s:1:"1";s:5:"attrs";a:3:{s:4:"at_1";s:1:"1";s:4:"at_2";s:1:"2";s:4:"at_3";s:1:"3";}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:5:"plain";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:5:"plain";}i:4;a:12:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:4:{i:0;s:6:"t_zlib";i:1;s:7:"t_mysql";i:2;s:5:"plain";i:3;s:9:"t_mysql_2";}s:5:"attrs";a:3:{s:4:"at_1";i:1;s:4:"at_2";i:1;s:4:"at_3";i:1;}s:5:"total";s:1:"0";s:11:"total_found";s:1:"0";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:9:"malformed";a:2:{s:4:"docs";s:1:"0";s:4:"hits";s:1:"0";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:9:"malformed";}i:5;a:12:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:4:{i:0;s:6:"t_zlib";i:1;s:7:"t_mysql";i:2;s:5:"plain";i:3;s:9:"t_mysql_2";}s:5:"attrs";a:3:{s:4:"at_1";i:1;s:4:"at_2";i:1;s:4:"at_3";i:1;}s:5:"total";s:1:"0";s:11:"total_found";s:1:"0";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:6:"broken";a:2:{s:4:"docs";s:1:"0";s:4:"hits";s:1:"0";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:6:"broken";}i:6;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:4:{i:0;s:6:"t_zlib";i:1;s:7:"t_mysql";i:2;s:5:"plain";i:3;s:9:"t_mysql_2";}s:5:"attrs";a:3:{s:4:"at_1";i:1;s:4:"at_2";i:1;s:4:"at_3";i:1;}s:7:"matches";a:1:{i:5;a:2:{s:6:"weight";s:1:"1";s:5:"attrs";a:3:{s:4:"at_1";s:1:"1";s:4:"at_2";s:1:"2";s:4:"at_3";s:1:"3";}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:3:"the";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:5:"24000";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:3:"the";}i:7;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:4:{i:0;s:6:"t_zlib";i:1;s:7:"t_mysql";i:2;s:5:"plain";i:3;s:9:"t_mysql_2";}s:5:"attrs";a:3:{s:4:"at_1";i:1;s:4:"at_2";i:1;s:4:"at_3";i:1;}s:7:"matches";a:2:{i:5;a:2:{s:6:"weight";s:1:"1";s:5:"attrs";a:3:{s:4:"at_1";s:1:"1";s:4:"at_2";s:1:"2";s:4:"at_3";s:1:"3";}}i:6;a:2:{s:6:"weight";s:1:"1";s:5:"attrs";a:3:{s:4:"at_1";s:1:"1";s:4:"at_2";s:1:"2";s:4:"at_3";s:1:"3";}}}s:5:"total";s:1:"2";s:11:"total_found";s:1:"2";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:1:"a";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:5:"40385";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:1:"a";}}} \ No newline at end of file diff -Nru sphinxsearch-0.9.9+2.0.2beta/test/test_043/test.xml sphinxsearch-2.0.4/test/test_043/test.xml --- sphinxsearch-0.9.9+2.0.2beta/test/test_043/test.xml 2010-12-19 23:33:46.000000000 +0000 +++ sphinxsearch-2.0.4/test/test_043/test.xml 2012-02-01 20:57:11.000000000 +0000 @@ -66,6 +66,9 @@ ( NULL, compress('mysql'), NULL, NULL ), ( substr(compress('test'), 5), compress('hello'), compress('world'), '' ), ( 'malformed', 'broken', NULL, NULL ), +( substr(COMPRESS ( REPEAT ( 'the dog with snoopy this book like ', 24000 ) ), 5), COMPRESS ( REPEAT ( 'spaceman is a hero not good mooman ', 24001 ) ), NULL, NULL ), +( COMPRESS ( REPEAT ( 'the dog with snoopy ', 16384 ) ), COMPRESS ( REPEAT ( 'spaceman is a hero not as we ', 16384 ) ), NULL, NULL ), +( NULL, 'a', NULL, NULL ), ( '', '', '', '' ); @@ -76,6 +79,8 @@ plain malformed broken +the +a diff -Nru sphinxsearch-0.9.9+2.0.2beta/test/test_058/model.bin sphinxsearch-2.0.4/test/test_058/model.bin --- sphinxsearch-0.9.9+2.0.2beta/test/test_058/model.bin 2010-01-26 13:11:34.000000000 +0000 +++ sphinxsearch-2.0.4/test/test_058/model.bin 2012-01-24 11:06:07.000000000 +0000 @@ -1 +1 @@ -a:2:{i:0;a:1:{i:0;a:6:{i:0;a:9:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:1;a:2:{s:6:"weight";s:1:"1";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:5:"words";a:1:{s:5:"first";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}}i:1;a:8:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:5:"total";s:1:"0";s:11:"total_found";s:1:"0";s:5:"words";a:1:{s:3:"one";a:2:{s:4:"docs";s:1:"0";s:4:"hits";s:1:"0";}}}i:2;a:8:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:5:"total";s:1:"0";s:11:"total_found";s:1:"0";s:5:"words";a:1:{s:5:"first";a:2:{s:4:"docs";s:1:"0";s:4:"hits";s:1:"0";}}}i:3;a:8:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:5:"total";s:1:"0";s:11:"total_found";s:1:"0";s:5:"words";a:1:{s:3:"one";a:2:{s:4:"docs";s:1:"0";s:4:"hits";s:1:"0";}}}i:4;a:8:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:5:"total";s:1:"0";s:11:"total_found";s:1:"0";s:5:"words";a:1:{s:5:"first";a:2:{s:4:"docs";s:1:"0";s:4:"hits";s:1:"0";}}}i:5;a:9:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:1;a:2:{s:6:"weight";s:1:"1";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:5:"words";a:1:{s:3:"one";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}}}}i:1;a:1:{i:0;a:6:{i:0;a:8:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:5:"total";s:1:"0";s:11:"total_found";s:1:"0";s:5:"words";a:1:{s:5:"first";a:2:{s:4:"docs";s:1:"0";s:4:"hits";s:1:"0";}}}i:1;a:9:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:1;a:2:{s:6:"weight";s:1:"1";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:5:"words";a:1:{s:3:"one";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}}i:2;a:8:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:5:"total";s:1:"0";s:11:"total_found";s:1:"0";s:5:"words";a:1:{s:5:"first";a:2:{s:4:"docs";s:1:"0";s:4:"hits";s:1:"0";}}}i:3;a:8:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:5:"total";s:1:"0";s:11:"total_found";s:1:"0";s:5:"words";a:1:{s:3:"one";a:2:{s:4:"docs";s:1:"0";s:4:"hits";s:1:"0";}}}i:4;a:8:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:5:"total";s:1:"0";s:11:"total_found";s:1:"0";s:5:"words";a:1:{s:5:"first";a:2:{s:4:"docs";s:1:"0";s:4:"hits";s:1:"0";}}}i:5;a:9:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:1;a:2:{s:6:"weight";s:1:"1";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:5:"words";a:1:{s:3:"one";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}}}}} \ No newline at end of file +a:2:{i:0;a:1:{i:0;a:9:{i:0;a:9:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:1;a:2:{s:6:"weight";s:1:"1";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:5:"words";a:1:{s:5:"first";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}}i:1;a:8:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:5:"total";s:1:"0";s:11:"total_found";s:1:"0";s:5:"words";a:1:{s:3:"one";a:2:{s:4:"docs";s:1:"0";s:4:"hits";s:1:"0";}}}i:2;a:3:{i:0;a:9:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:2;a:2:{s:6:"weight";s:1:"1";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:5:"words";a:1:{s:6:"second";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}}i:1;a:9:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:5;a:2:{s:6:"weight";s:1:"1";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:5:"words";a:1:{s:5:"fifth";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}}i:2;a:9:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:3;a:2:{s:6:"weight";s:1:"1";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:5:"words";a:1:{s:5:"third";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}}}i:3;a:8:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:5:"total";s:1:"0";s:11:"total_found";s:1:"0";s:5:"words";a:1:{s:5:"first";a:2:{s:4:"docs";s:1:"0";s:4:"hits";s:1:"0";}}}i:4;a:8:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:5:"total";s:1:"0";s:11:"total_found";s:1:"0";s:5:"words";a:1:{s:3:"one";a:2:{s:4:"docs";s:1:"0";s:4:"hits";s:1:"0";}}}i:5;a:3:{i:0;a:9:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:2;a:2:{s:6:"weight";s:1:"1";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:5:"words";a:1:{s:6:"second";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}}i:1;a:9:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:5;a:2:{s:6:"weight";s:1:"1";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:5:"words";a:1:{s:5:"fifth";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}}i:2;a:9:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:3;a:2:{s:6:"weight";s:1:"1";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:5:"words";a:1:{s:5:"third";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}}}i:6;a:8:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:5:"total";s:1:"0";s:11:"total_found";s:1:"0";s:5:"words";a:1:{s:5:"first";a:2:{s:4:"docs";s:1:"0";s:4:"hits";s:1:"0";}}}i:7;a:9:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:1;a:2:{s:6:"weight";s:1:"1";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:5:"words";a:1:{s:3:"one";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}}i:8;a:3:{i:0;a:9:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:2;a:2:{s:6:"weight";s:1:"1";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:5:"words";a:1:{s:6:"second";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}}i:1;a:9:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:5;a:2:{s:6:"weight";s:1:"1";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:5:"words";a:1:{s:5:"fifth";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}}i:2;a:9:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:3;a:2:{s:6:"weight";s:1:"1";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:5:"words";a:1:{s:5:"third";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}}}}}i:1;a:1:{i:0;a:9:{i:0;a:8:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:5:"total";s:1:"0";s:11:"total_found";s:1:"0";s:5:"words";a:1:{s:5:"first";a:2:{s:4:"docs";s:1:"0";s:4:"hits";s:1:"0";}}}i:1;a:9:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:1;a:2:{s:6:"weight";s:1:"1";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:5:"words";a:1:{s:3:"one";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}}i:2;a:3:{i:0;a:9:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:2;a:2:{s:6:"weight";s:1:"1";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:5:"words";a:1:{s:6:"second";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}}i:1;a:9:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:5;a:2:{s:6:"weight";s:1:"1";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:5:"words";a:1:{s:5:"fifth";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}}i:2;a:9:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:3;a:2:{s:6:"weight";s:1:"1";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:5:"words";a:1:{s:5:"third";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}}}i:3;a:8:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:5:"total";s:1:"0";s:11:"total_found";s:1:"0";s:5:"words";a:1:{s:5:"first";a:2:{s:4:"docs";s:1:"0";s:4:"hits";s:1:"0";}}}i:4;a:8:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:5:"total";s:1:"0";s:11:"total_found";s:1:"0";s:5:"words";a:1:{s:3:"one";a:2:{s:4:"docs";s:1:"0";s:4:"hits";s:1:"0";}}}i:5;a:3:{i:0;a:9:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:2;a:2:{s:6:"weight";s:1:"1";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:5:"words";a:1:{s:6:"second";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}}i:1;a:9:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:5;a:2:{s:6:"weight";s:1:"1";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:5:"words";a:1:{s:5:"fifth";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}}i:2;a:9:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:3;a:2:{s:6:"weight";s:1:"1";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:5:"words";a:1:{s:5:"third";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}}}i:6;a:8:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:5:"total";s:1:"0";s:11:"total_found";s:1:"0";s:5:"words";a:1:{s:5:"first";a:2:{s:4:"docs";s:1:"0";s:4:"hits";s:1:"0";}}}i:7;a:9:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:1;a:2:{s:6:"weight";s:1:"1";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:5:"words";a:1:{s:3:"one";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}}i:8;a:3:{i:0;a:9:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:2;a:2:{s:6:"weight";s:1:"1";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:5:"words";a:1:{s:6:"second";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}}i:1;a:9:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:5;a:2:{s:6:"weight";s:1:"1";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:5:"words";a:1:{s:5:"fifth";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}}i:2;a:9:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:3;a:2:{s:6:"weight";s:1:"1";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:5:"words";a:1:{s:5:"third";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}}}}}} \ No newline at end of file diff -Nru sphinxsearch-0.9.9+2.0.2beta/test/test_058/test.xml sphinxsearch-2.0.4/test/test_058/test.xml --- sphinxsearch-0.9.9+2.0.2beta/test/test_058/test.xml 2010-07-19 16:18:39.000000000 +0000 +++ sphinxsearch-2.0.4/test/test_058/test.xml 2012-01-24 11:06:07.000000000 +0000 @@ -11,6 +11,7 @@ searchd { + seamless_rotate = 0 workers = none @@ -33,6 +34,32 @@ source = sql path = /index } + +source locs +{ + type = mysql + + + sql_query = select id, text from test_table; +} + +index loc1 +{ + source = locs + path = /loc1 +} + +index loc2 +{ + source = locs + path = /loc2 +} + +index loc3 +{ + source = locs + path = /loc3 +} drop table if exists test_table @@ -63,13 +90,34 @@ Query ( $words ); if ( $result ) { unset ( $result["time"] ); return $result; } else return $client->GetLastError(); '); +$query = create_function('$client,$words',' +$result = $client->Query ( $words, "index" ); if ( $result ) { unset ( $result["time"] ); return $result; } else return $client->GetLastError(); +'); + +$mquery = create_function('$client',' +$client->AddQuery ( "second", "loc1" ); +$client->AddQuery ( "fifth", "loc2" ); +$client->AddQuery ( "third", "loc3" ); + +$res = $client->RunQueries (); +if ( !$res ) + return $client->GetLastError(); + +$result = array (); +for ( $i=0; $i diff -Nru sphinxsearch-0.9.9+2.0.2beta/test/test_060/model.bin sphinxsearch-2.0.4/test/test_060/model.bin --- sphinxsearch-0.9.9+2.0.2beta/test/test_060/model.bin 2009-03-19 04:50:12.000000000 +0000 +++ sphinxsearch-2.0.4/test/test_060/model.bin 2011-12-30 07:51:59.000000000 +0000 @@ -1 +1 @@ -a:1:{i:0;a:1:{i:0;a:1:{i:0;a:8:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"body";}s:5:"attrs";a:2:{s:3:"tag";i:1;s:1:"q";i:1;}s:7:"matches";a:2:{i:1;a:2:{s:6:"weight";s:1:"1";s:5:"attrs";a:2:{s:3:"tag";s:1:"1";s:1:"q";s:1:"1";}}i:3;a:2:{s:6:"weight";s:1:"1";s:5:"attrs";a:2:{s:3:"tag";s:1:"3";s:1:"q";s:1:"1";}}}s:5:"total";s:1:"2";s:11:"total_found";s:1:"2";}}}} \ No newline at end of file +a:1:{i:0;a:1:{i:0;a:1:{i:0;a:8:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"body";}s:5:"attrs";a:3:{s:3:"tag";i:1;s:1:"q";i:1;s:3:"crc";i:1;}s:7:"matches";a:2:{i:1;a:2:{s:6:"weight";s:1:"1";s:5:"attrs";a:3:{s:3:"tag";s:1:"1";s:1:"q";s:1:"1";s:3:"crc";s:10:"1011183078";}}i:3;a:2:{s:6:"weight";s:1:"1";s:5:"attrs";a:3:{s:3:"tag";s:1:"3";s:1:"q";s:1:"1";s:3:"crc";s:10:"1011183078";}}}s:5:"total";s:1:"2";s:11:"total_found";s:1:"2";}}}} \ No newline at end of file diff -Nru sphinxsearch-0.9.9+2.0.2beta/test/test_060/test.xml sphinxsearch-2.0.4/test/test_060/test.xml --- sphinxsearch-0.9.9+2.0.2beta/test/test_060/test.xml 2011-11-07 01:27:59.000000000 +0000 +++ sphinxsearch-2.0.4/test/test_060/test.xml 2011-12-30 07:51:59.000000000 +0000 @@ -39,7 +39,7 @@ for ( $i=10000; $i<20000; $i++ ) $idlist .= "$i,"; -$client->SetSelect ( "*, IN(@id,1," . $idlist . "3) AS q" ); +$client->SetSelect ( "*, IN(@id,1," . $idlist . "3) AS q, crc32('the') as crc" ); $client->SetFilter ( "q", array(1) ); $r = $client->Query ( "" ); diff -Nru sphinxsearch-0.9.9+2.0.2beta/test/test_062/test.xml sphinxsearch-2.0.4/test/test_062/test.xml --- sphinxsearch-0.9.9+2.0.2beta/test/test_062/test.xml 2011-11-15 14:01:21.000000000 +0000 +++ sphinxsearch-2.0.4/test/test_062/test.xml 2011-11-21 15:58:19.000000000 +0000 @@ -44,8 +44,7 @@ 'chunk_separator' => ' ... ', 'limit' => 255, 'around' => 2, - 'query_mode' => 1, - 'allow_empty'=>1 + 'query_mode' => 1 ); $text = 'Sphinx clusters scale to billions of documents, terabytes of data, and billions of queries per month.'; diff -Nru sphinxsearch-0.9.9+2.0.2beta/test/test_063/model.bin sphinxsearch-2.0.4/test/test_063/model.bin --- sphinxsearch-0.9.9+2.0.2beta/test/test_063/model.bin 2011-06-07 13:21:26.000000000 +0000 +++ sphinxsearch-2.0.4/test/test_063/model.bin 2012-01-31 17:15:46.000000000 +0000 @@ -1 +1 @@ -a:2:{i:0;a:51:{i:0;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:5:{i:1;a:2:{s:6:"weight";s:4:"2586";s:5:"attrs";a:0:{}}i:4;a:2:{s:6:"weight";s:4:"2586";s:5:"attrs";a:0:{}}i:7;a:2:{s:6:"weight";s:4:"2586";s:5:"attrs";a:0:{}}i:10;a:2:{s:6:"weight";s:4:"2586";s:5:"attrs";a:0:{}}i:5;a:2:{s:6:"weight";s:4:"1537";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"5";s:11:"total_found";s:1:"5";s:4:"time";s:5:"0.001";s:5:"words";a:2:{s:3:"bbb";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:1:"4";}s:3:"ccc";a:2:{s:4:"docs";s:1:"5";s:4:"hits";s:1:"5";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:7:"bbb|ccc";}i:1;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:1;a:2:{s:6:"weight";s:4:"1722";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:7:"bbb@ccc";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:7:"bbb@ccc";}i:2;a:12:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:5:"total";s:1:"0";s:11:"total_found";s:1:"0";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:7:"bbb|ccc";a:2:{s:4:"docs";s:1:"0";s:4:"hits";s:1:"0";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:8:"bbb\|ccc";}i:3;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:1;a:2:{s:6:"weight";s:4:"1722";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:7:"bbb@ccc";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:8:"bbb\@ccc";}i:4;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:4:{i:1;a:2:{s:6:"weight";s:4:"2586";s:5:"attrs";a:0:{}}i:4;a:2:{s:6:"weight";s:4:"2586";s:5:"attrs";a:0:{}}i:7;a:2:{s:6:"weight";s:4:"2586";s:5:"attrs";a:0:{}}i:10;a:2:{s:6:"weight";s:4:"2586";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"4";s:11:"total_found";s:1:"4";s:4:"time";s:5:"0.001";s:5:"words";a:2:{s:3:"bbb";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:1:"4";}s:3:"ccc";a:2:{s:4:"docs";s:1:"5";s:4:"hits";s:1:"5";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:7:"bbb ccc";}i:5;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:4:{i:1;a:2:{s:6:"weight";s:4:"2586";s:5:"attrs";a:0:{}}i:4;a:2:{s:6:"weight";s:4:"2586";s:5:"attrs";a:0:{}}i:7;a:2:{s:6:"weight";s:4:"2586";s:5:"attrs";a:0:{}}i:10;a:2:{s:6:"weight";s:4:"2586";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"4";s:11:"total_found";s:1:"4";s:4:"time";s:5:"0.001";s:5:"words";a:2:{s:3:"bbb";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:1:"4";}s:3:"ccc";a:2:{s:4:"docs";s:1:"5";s:4:"hits";s:1:"5";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:9:""bbb ccc"";}i:6;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:6:{i:5;a:2:{s:6:"weight";s:4:"3585";s:5:"attrs";a:0:{}}i:1;a:2:{s:6:"weight";s:4:"2585";s:5:"attrs";a:0:{}}i:7;a:2:{s:6:"weight";s:4:"2585";s:5:"attrs";a:0:{}}i:4;a:2:{s:6:"weight";s:4:"2543";s:5:"attrs";a:0:{}}i:10;a:2:{s:6:"weight";s:4:"2543";s:5:"attrs";a:0:{}}i:9;a:2:{s:6:"weight";s:4:"1518";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"6";s:11:"total_found";s:1:"6";s:4:"time";s:5:"0.001";s:5:"words";a:3:{s:3:"aaa";a:2:{s:4:"docs";s:1:"6";s:4:"hits";s:1:"6";}s:3:"eee";a:2:{s:4:"docs";s:1:"3";s:4:"hits";s:1:"3";}s:3:"ccc";a:2:{s:4:"docs";s:1:"5";s:4:"hits";s:1:"5";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:11:"aaa|eee|ccc";}i:7;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:5;a:2:{s:6:"weight";s:4:"1722";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:11:"aaa|eee|ccc";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:13:"aaa\|eee\|ccc";}i:8;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:5;a:2:{s:6:"weight";s:4:"1722";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:11:"aaa|eee|ccc";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:13:""aaa|eee|ccc"";}i:9;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:5;a:2:{s:6:"weight";s:4:"1722";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:11:"aaa|eee|ccc";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:15:""aaa\|eee\|ccc"";}i:10;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:6;a:2:{s:6:"weight";s:4:"1722";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:7:"a+b+c+d";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:7:"a+b+c+d";}i:11;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:6;a:2:{s:6:"weight";s:4:"2722";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.001";s:5:"words";a:2:{s:7:"a+b+c+d";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}s:1:"e";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:9:"a+b+c+d e";}i:12;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:6;a:2:{s:6:"weight";s:4:"3722";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.001";s:5:"words";a:3:{s:7:"a+b+c+d";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}s:1:"e";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}s:1:"f";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:13:""a+b+c+d e f"";}i:13;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:6;a:2:{s:6:"weight";s:4:"2722";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.001";s:5:"words";a:2:{s:7:"a+b+c+d";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}s:5:"e+f|g";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:15:""a+b+c+d e+f|g"";}i:14;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:1;a:2:{s:6:"weight";s:4:"3673";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.001";s:5:"words";a:3:{s:7:"bbb@ccc";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}s:3:"ddd";a:2:{s:4:"docs";s:1:"5";s:4:"hits";s:1:"5";}s:4:"@eee";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:18:""bbb@ccc ddd @eee"";}i:15;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:1;a:2:{s:6:"weight";s:4:"3673";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.001";s:5:"words";a:3:{s:3:"ddd";a:2:{s:4:"docs";s:1:"5";s:4:"hits";s:1:"5";}s:4:"@eee";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}s:11:"fff@ggg@hhh";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:22:""ddd @eee fff@ggg@hhh"";}i:16;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:1;a:2:{s:6:"weight";s:4:"3722";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.001";s:5:"words";a:3:{s:11:"fff@ggg@hhh";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}s:4:"iii@";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}s:3:"kkk";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:22:""fff@ggg@hhh iii@ kkk"";}i:17;a:6:{s:5:"query";s:1:"@";s:5:"error";s:49:"index test: syntax error, unexpected $end near ''";s:7:"warning";s:0:"";s:5:"total";i:0;s:11:"total_found";i:0;s:4:"time";i:0;}i:18;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:3;a:2:{s:6:"weight";s:4:"1722";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:1:"@";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:2:"\@";}i:19;a:6:{s:5:"query";s:8:"@eee kkk";s:5:"error";s:55:"index test: query error: no field 'eee' found in schema";s:7:"warning";s:0:"";s:5:"total";i:0;s:11:"total_found";i:0;s:4:"time";i:0;}i:20;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:1;a:2:{s:6:"weight";s:4:"1722";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.002";s:5:"words";a:2:{s:4:"@eee";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}s:3:"kkk";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:9:"\@eee kkk";}i:21;a:12:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:5:"total";s:1:"0";s:11:"total_found";s:1:"0";s:4:"time";s:5:"0.001";s:5:"words";a:1:{s:7:"aaa*ccc";a:2:{s:4:"docs";s:1:"0";s:4:"hits";s:1:"0";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:8:"aaa\*ccc";}i:22;a:12:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:5:"total";s:1:"0";s:11:"total_found";s:1:"0";s:4:"time";s:5:"0.001";s:5:"words";a:1:{s:7:"aaa*ccc";a:2:{s:4:"docs";s:1:"0";s:4:"hits";s:1:"0";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:7:"aaa*ccc";}i:23;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:7;a:2:{s:6:"weight";s:4:"1722";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.002";s:5:"words";a:1:{s:7:"bbb*ccc";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:8:"bbb\*ccc";}i:24;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:7;a:2:{s:6:"weight";s:4:"1722";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.001";s:5:"words";a:1:{s:7:"bbb*ccc";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:7:"bbb*ccc";}i:25;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:4:{i:1;a:2:{s:6:"weight";s:4:"2586";s:5:"attrs";a:0:{}}i:4;a:2:{s:6:"weight";s:4:"2586";s:5:"attrs";a:0:{}}i:7;a:2:{s:6:"weight";s:4:"2586";s:5:"attrs";a:0:{}}i:10;a:2:{s:6:"weight";s:4:"2586";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"4";s:11:"total_found";s:1:"4";s:4:"time";s:5:"0.002";s:5:"words";a:2:{s:3:"bbb";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:1:"4";}s:3:"ccc";a:2:{s:4:"docs";s:1:"5";s:4:"hits";s:1:"5";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:8:" bbb ccc";}i:26;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:4:{i:1;a:2:{s:6:"weight";s:4:"2586";s:5:"attrs";a:0:{}}i:4;a:2:{s:6:"weight";s:4:"2586";s:5:"attrs";a:0:{}}i:7;a:2:{s:6:"weight";s:4:"2586";s:5:"attrs";a:0:{}}i:10;a:2:{s:6:"weight";s:4:"2586";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"4";s:11:"total_found";s:1:"4";s:4:"time";s:5:"0.003";s:5:"words";a:2:{s:3:"bbb";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:1:"4";}s:3:"ccc";a:2:{s:4:"docs";s:1:"5";s:4:"hits";s:1:"5";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:9:""bbb ccc"";}i:27;a:12:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:5:"total";s:1:"0";s:11:"total_found";s:1:"0";s:4:"time";s:5:"0.001";s:5:"words";a:1:{s:7:"fff*ggg";a:2:{s:4:"docs";s:1:"0";s:4:"hits";s:1:"0";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:8:"fff\*ggg";}i:28;a:12:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:5:"total";s:1:"0";s:11:"total_found";s:1:"0";s:4:"time";s:5:"0.001";s:5:"words";a:1:{s:7:"fff*ggg";a:2:{s:4:"docs";s:1:"0";s:4:"hits";s:1:"0";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:7:"fff*ggg";}i:29;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:7;a:2:{s:6:"weight";s:4:"1722";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.001";s:5:"words";a:1:{s:11:"fff*ggg*hhh";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:11:"fff*ggg*hhh";}i:30;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:7;a:2:{s:6:"weight";s:4:"2648";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.002";s:5:"words";a:2:{s:7:"bbb*ccc";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}s:3:"ddd";a:2:{s:4:"docs";s:1:"5";s:4:"hits";s:1:"5";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:13:""bbb*ccc ddd"";}i:31;a:12:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:5:"total";s:1:"0";s:11:"total_found";s:1:"0";s:4:"time";s:5:"0.002";s:5:"words";a:3:{s:7:"bbb*ccc";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}s:3:"ccc";a:2:{s:4:"docs";s:1:"5";s:4:"hits";s:1:"5";}s:3:"ddd";a:2:{s:4:"docs";s:1:"5";s:4:"hits";s:1:"5";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:17:""bbb*ccc ccc ddd"";}i:32;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:7;a:2:{s:6:"weight";s:4:"2611";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.001";s:5:"words";a:2:{s:7:"bbb*ccc";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}s:3:"ddd";a:2:{s:4:"docs";s:1:"5";s:4:"hits";s:1:"5";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:14:"bbb*ccc << ddd";}i:33;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:11;a:2:{s:6:"weight";s:4:"1722";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.001";s:5:"words";a:1:{s:5:"hello";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:5:"hello";}i:34;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:11;a:2:{s:6:"weight";s:4:"2722";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.001";s:5:"words";a:2:{s:5:"hello";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}s:5:"world";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:13:""hello world"";}i:35;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:11;a:2:{s:6:"weight";s:4:"1722";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.001";s:5:"words";a:2:{s:5:"hello";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}s:5:"u.s.a";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:11:"hello U.S.A";}i:36;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:20;a:2:{s:6:"weight";s:4:"1722";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.001";s:5:"words";a:1:{s:4:"must";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:4:"must";}i:37;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:20;a:2:{s:6:"weight";s:4:"1722";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:7:"must!!!";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:10:"must\!\!\!";}i:38;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:21;a:2:{s:6:"weight";s:4:"1722";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:4:"dude";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:4:"dude";}i:39;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:21;a:2:{s:6:"weight";s:4:"1722";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:5:"@dude";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:6:"\@dude";}i:40;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:4:{i:30;a:2:{s:6:"weight";s:4:"1598";s:5:"attrs";a:0:{}}i:31;a:2:{s:6:"weight";s:4:"1598";s:5:"attrs";a:0:{}}i:32;a:2:{s:6:"weight";s:4:"1598";s:5:"attrs";a:0:{}}i:33;a:2:{s:6:"weight";s:4:"1598";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"4";s:11:"total_found";s:1:"4";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:5:"posse";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:1:"4";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:5:"posse";}i:41;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:31;a:2:{s:6:"weight";s:4:"1722";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:7:"posse()";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:9:"posse\(\)";}i:42;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:32;a:2:{s:6:"weight";s:4:"1722";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:7:"posse[]";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:9:"posse\[\]";}i:43;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:33;a:2:{s:6:"weight";s:4:"1722";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:7:"posse{}";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:9:"posse\{\}";}i:44;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:31;a:2:{s:6:"weight";s:4:"1722";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:7:"posse()";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:9:""posse()"";}i:45;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:32;a:2:{s:6:"weight";s:4:"1722";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:7:"posse[]";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:9:""posse[]"";}i:46;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:33;a:2:{s:6:"weight";s:4:"1722";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:7:"posse{}";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:9:""posse{}"";}i:47;a:3:{s:8:"sphinxql";s:55:"select * from test1 where match ( 'zzzzzz .(buzzzz)' )";s:10:"total_rows";i:1;s:4:"rows";a:1:{i:0;a:2:{s:2:"id";s:1:"1";s:6:"weight";s:4:"1500";}}}i:48;a:2:{s:8:"sphinxql";s:41:"select * from test1 where match ( 'a+b' )";s:10:"total_rows";i:0;}i:49;a:3:{s:8:"sphinxql";s:44:"select * from test2 where match ( 'a11-22' )";s:10:"total_rows";i:1;s:4:"rows";a:1:{i:0;a:2:{s:2:"id";s:1:"1";s:6:"weight";s:4:"1643";}}}i:50;a:3:{s:8:"sphinxql";s:43:"select * from test2 where match ( '11-22' )";s:10:"total_rows";i:1;s:4:"rows";a:1:{i:0;a:2:{s:2:"id";s:1:"2";s:6:"weight";s:4:"1643";}}}}i:1;a:51:{i:0;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:5:{i:1;a:2:{s:6:"weight";s:4:"2586";s:5:"attrs";a:0:{}}i:4;a:2:{s:6:"weight";s:4:"2586";s:5:"attrs";a:0:{}}i:7;a:2:{s:6:"weight";s:4:"2586";s:5:"attrs";a:0:{}}i:10;a:2:{s:6:"weight";s:4:"2586";s:5:"attrs";a:0:{}}i:5;a:2:{s:6:"weight";s:4:"1537";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"5";s:11:"total_found";s:1:"5";s:4:"time";s:5:"0.001";s:5:"words";a:2:{s:3:"bbb";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:1:"4";}s:3:"ccc";a:2:{s:4:"docs";s:1:"5";s:4:"hits";s:1:"5";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:7:"bbb|ccc";}i:1;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:1;a:2:{s:6:"weight";s:4:"1722";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:7:"bbb@ccc";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:7:"bbb@ccc";}i:2;a:12:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:5:"total";s:1:"0";s:11:"total_found";s:1:"0";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:7:"bbb|ccc";a:2:{s:4:"docs";s:1:"0";s:4:"hits";s:1:"0";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:8:"bbb\|ccc";}i:3;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:1;a:2:{s:6:"weight";s:4:"1722";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:7:"bbb@ccc";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:8:"bbb\@ccc";}i:4;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:4:{i:1;a:2:{s:6:"weight";s:4:"2586";s:5:"attrs";a:0:{}}i:4;a:2:{s:6:"weight";s:4:"2586";s:5:"attrs";a:0:{}}i:7;a:2:{s:6:"weight";s:4:"2586";s:5:"attrs";a:0:{}}i:10;a:2:{s:6:"weight";s:4:"2586";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"4";s:11:"total_found";s:1:"4";s:4:"time";s:5:"0.001";s:5:"words";a:2:{s:3:"bbb";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:1:"4";}s:3:"ccc";a:2:{s:4:"docs";s:1:"5";s:4:"hits";s:1:"5";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:7:"bbb ccc";}i:5;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:4:{i:1;a:2:{s:6:"weight";s:4:"2586";s:5:"attrs";a:0:{}}i:4;a:2:{s:6:"weight";s:4:"2586";s:5:"attrs";a:0:{}}i:7;a:2:{s:6:"weight";s:4:"2586";s:5:"attrs";a:0:{}}i:10;a:2:{s:6:"weight";s:4:"2586";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"4";s:11:"total_found";s:1:"4";s:4:"time";s:5:"0.001";s:5:"words";a:2:{s:3:"bbb";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:1:"4";}s:3:"ccc";a:2:{s:4:"docs";s:1:"5";s:4:"hits";s:1:"5";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:9:""bbb ccc"";}i:6;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:6:{i:5;a:2:{s:6:"weight";s:4:"3585";s:5:"attrs";a:0:{}}i:1;a:2:{s:6:"weight";s:4:"2585";s:5:"attrs";a:0:{}}i:7;a:2:{s:6:"weight";s:4:"2585";s:5:"attrs";a:0:{}}i:4;a:2:{s:6:"weight";s:4:"2543";s:5:"attrs";a:0:{}}i:10;a:2:{s:6:"weight";s:4:"2543";s:5:"attrs";a:0:{}}i:9;a:2:{s:6:"weight";s:4:"1518";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"6";s:11:"total_found";s:1:"6";s:4:"time";s:5:"0.001";s:5:"words";a:3:{s:3:"aaa";a:2:{s:4:"docs";s:1:"6";s:4:"hits";s:1:"6";}s:3:"eee";a:2:{s:4:"docs";s:1:"3";s:4:"hits";s:1:"3";}s:3:"ccc";a:2:{s:4:"docs";s:1:"5";s:4:"hits";s:1:"5";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:11:"aaa|eee|ccc";}i:7;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:5;a:2:{s:6:"weight";s:4:"1722";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:11:"aaa|eee|ccc";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:13:"aaa\|eee\|ccc";}i:8;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:5;a:2:{s:6:"weight";s:4:"1722";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:11:"aaa|eee|ccc";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:13:""aaa|eee|ccc"";}i:9;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:5;a:2:{s:6:"weight";s:4:"1722";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:11:"aaa|eee|ccc";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:15:""aaa\|eee\|ccc"";}i:10;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:6;a:2:{s:6:"weight";s:4:"1722";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:7:"a+b+c+d";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:7:"a+b+c+d";}i:11;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:6;a:2:{s:6:"weight";s:4:"2722";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.001";s:5:"words";a:2:{s:7:"a+b+c+d";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}s:1:"e";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:9:"a+b+c+d e";}i:12;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:6;a:2:{s:6:"weight";s:4:"3722";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.001";s:5:"words";a:3:{s:7:"a+b+c+d";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}s:1:"e";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}s:1:"f";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:13:""a+b+c+d e f"";}i:13;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:6;a:2:{s:6:"weight";s:4:"2722";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.001";s:5:"words";a:2:{s:7:"a+b+c+d";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}s:5:"e+f|g";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:15:""a+b+c+d e+f|g"";}i:14;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:1;a:2:{s:6:"weight";s:4:"3673";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.001";s:5:"words";a:3:{s:7:"bbb@ccc";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}s:3:"ddd";a:2:{s:4:"docs";s:1:"5";s:4:"hits";s:1:"5";}s:4:"@eee";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:18:""bbb@ccc ddd @eee"";}i:15;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:1;a:2:{s:6:"weight";s:4:"3673";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.001";s:5:"words";a:3:{s:3:"ddd";a:2:{s:4:"docs";s:1:"5";s:4:"hits";s:1:"5";}s:4:"@eee";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}s:11:"fff@ggg@hhh";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:22:""ddd @eee fff@ggg@hhh"";}i:16;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:1;a:2:{s:6:"weight";s:4:"3722";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.001";s:5:"words";a:3:{s:11:"fff@ggg@hhh";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}s:4:"iii@";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}s:3:"kkk";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:22:""fff@ggg@hhh iii@ kkk"";}i:17;a:6:{s:5:"query";s:1:"@";s:5:"error";s:49:"index test: syntax error, unexpected $end near ''";s:7:"warning";s:0:"";s:5:"total";i:0;s:11:"total_found";i:0;s:4:"time";i:0;}i:18;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:3;a:2:{s:6:"weight";s:4:"1722";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:1:"@";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:2:"\@";}i:19;a:6:{s:5:"query";s:8:"@eee kkk";s:5:"error";s:55:"index test: query error: no field 'eee' found in schema";s:7:"warning";s:0:"";s:5:"total";i:0;s:11:"total_found";i:0;s:4:"time";i:0;}i:20;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:1;a:2:{s:6:"weight";s:4:"1722";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.001";s:5:"words";a:2:{s:4:"@eee";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}s:3:"kkk";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:9:"\@eee kkk";}i:21;a:12:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:5:"total";s:1:"0";s:11:"total_found";s:1:"0";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:7:"aaa*ccc";a:2:{s:4:"docs";s:1:"0";s:4:"hits";s:1:"0";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:8:"aaa\*ccc";}i:22;a:12:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:5:"total";s:1:"0";s:11:"total_found";s:1:"0";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:7:"aaa*ccc";a:2:{s:4:"docs";s:1:"0";s:4:"hits";s:1:"0";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:7:"aaa*ccc";}i:23;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:7;a:2:{s:6:"weight";s:4:"1722";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:7:"bbb*ccc";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:8:"bbb\*ccc";}i:24;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:7;a:2:{s:6:"weight";s:4:"1722";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:7:"bbb*ccc";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:7:"bbb*ccc";}i:25;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:4:{i:1;a:2:{s:6:"weight";s:4:"2586";s:5:"attrs";a:0:{}}i:4;a:2:{s:6:"weight";s:4:"2586";s:5:"attrs";a:0:{}}i:7;a:2:{s:6:"weight";s:4:"2586";s:5:"attrs";a:0:{}}i:10;a:2:{s:6:"weight";s:4:"2586";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"4";s:11:"total_found";s:1:"4";s:4:"time";s:5:"0.000";s:5:"words";a:2:{s:3:"bbb";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:1:"4";}s:3:"ccc";a:2:{s:4:"docs";s:1:"5";s:4:"hits";s:1:"5";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:8:" bbb ccc";}i:26;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:4:{i:1;a:2:{s:6:"weight";s:4:"2586";s:5:"attrs";a:0:{}}i:4;a:2:{s:6:"weight";s:4:"2586";s:5:"attrs";a:0:{}}i:7;a:2:{s:6:"weight";s:4:"2586";s:5:"attrs";a:0:{}}i:10;a:2:{s:6:"weight";s:4:"2586";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"4";s:11:"total_found";s:1:"4";s:4:"time";s:5:"0.001";s:5:"words";a:2:{s:3:"bbb";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:1:"4";}s:3:"ccc";a:2:{s:4:"docs";s:1:"5";s:4:"hits";s:1:"5";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:9:""bbb ccc"";}i:27;a:12:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:5:"total";s:1:"0";s:11:"total_found";s:1:"0";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:7:"fff*ggg";a:2:{s:4:"docs";s:1:"0";s:4:"hits";s:1:"0";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:8:"fff\*ggg";}i:28;a:12:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:5:"total";s:1:"0";s:11:"total_found";s:1:"0";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:7:"fff*ggg";a:2:{s:4:"docs";s:1:"0";s:4:"hits";s:1:"0";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:7:"fff*ggg";}i:29;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:7;a:2:{s:6:"weight";s:4:"1722";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:11:"fff*ggg*hhh";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:11:"fff*ggg*hhh";}i:30;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:7;a:2:{s:6:"weight";s:4:"2648";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.001";s:5:"words";a:2:{s:7:"bbb*ccc";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}s:3:"ddd";a:2:{s:4:"docs";s:1:"5";s:4:"hits";s:1:"5";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:13:""bbb*ccc ddd"";}i:31;a:12:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:5:"total";s:1:"0";s:11:"total_found";s:1:"0";s:4:"time";s:5:"0.001";s:5:"words";a:3:{s:7:"bbb*ccc";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}s:3:"ccc";a:2:{s:4:"docs";s:1:"5";s:4:"hits";s:1:"5";}s:3:"ddd";a:2:{s:4:"docs";s:1:"5";s:4:"hits";s:1:"5";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:17:""bbb*ccc ccc ddd"";}i:32;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:7;a:2:{s:6:"weight";s:4:"2611";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.001";s:5:"words";a:2:{s:7:"bbb*ccc";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}s:3:"ddd";a:2:{s:4:"docs";s:1:"5";s:4:"hits";s:1:"5";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:14:"bbb*ccc << ddd";}i:33;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:11;a:2:{s:6:"weight";s:4:"1722";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:5:"hello";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:5:"hello";}i:34;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:11;a:2:{s:6:"weight";s:4:"2722";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.001";s:5:"words";a:2:{s:5:"hello";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}s:5:"world";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:13:""hello world"";}i:35;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:11;a:2:{s:6:"weight";s:4:"1722";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.001";s:5:"words";a:2:{s:5:"hello";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}s:5:"u.s.a";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:11:"hello U.S.A";}i:36;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:20;a:2:{s:6:"weight";s:4:"1722";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:4:"must";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:4:"must";}i:37;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:20;a:2:{s:6:"weight";s:4:"1722";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:7:"must!!!";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:10:"must\!\!\!";}i:38;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:21;a:2:{s:6:"weight";s:4:"1722";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:4:"dude";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:4:"dude";}i:39;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:21;a:2:{s:6:"weight";s:4:"1722";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:5:"@dude";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:6:"\@dude";}i:40;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:4:{i:30;a:2:{s:6:"weight";s:4:"1598";s:5:"attrs";a:0:{}}i:31;a:2:{s:6:"weight";s:4:"1598";s:5:"attrs";a:0:{}}i:32;a:2:{s:6:"weight";s:4:"1598";s:5:"attrs";a:0:{}}i:33;a:2:{s:6:"weight";s:4:"1598";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"4";s:11:"total_found";s:1:"4";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:5:"posse";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:1:"4";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:5:"posse";}i:41;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:31;a:2:{s:6:"weight";s:4:"1722";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:7:"posse()";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:9:"posse\(\)";}i:42;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:32;a:2:{s:6:"weight";s:4:"1722";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:7:"posse[]";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:9:"posse\[\]";}i:43;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:33;a:2:{s:6:"weight";s:4:"1722";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:7:"posse{}";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:9:"posse\{\}";}i:44;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:31;a:2:{s:6:"weight";s:4:"1722";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:7:"posse()";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:9:""posse()"";}i:45;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:32;a:2:{s:6:"weight";s:4:"1722";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:7:"posse[]";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:9:""posse[]"";}i:46;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:33;a:2:{s:6:"weight";s:4:"1722";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:7:"posse{}";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:9:""posse{}"";}i:47;a:3:{s:8:"sphinxql";s:55:"select * from test1 where match ( 'zzzzzz .(buzzzz)' )";s:10:"total_rows";i:1;s:4:"rows";a:1:{i:0;a:2:{s:2:"id";s:1:"1";s:6:"weight";s:4:"1500";}}}i:48;a:2:{s:8:"sphinxql";s:41:"select * from test1 where match ( 'a+b' )";s:10:"total_rows";i:0;}i:49;a:3:{s:8:"sphinxql";s:44:"select * from test2 where match ( 'a11-22' )";s:10:"total_rows";i:1;s:4:"rows";a:1:{i:0;a:2:{s:2:"id";s:1:"1";s:6:"weight";s:4:"1643";}}}i:50;a:3:{s:8:"sphinxql";s:43:"select * from test2 where match ( '11-22' )";s:10:"total_rows";i:1;s:4:"rows";a:1:{i:0;a:2:{s:2:"id";s:1:"2";s:6:"weight";s:4:"1643";}}}}} \ No newline at end of file +a:2:{i:0;a:63:{i:0;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:5:{i:1;a:2:{s:6:"weight";s:4:"2586";s:5:"attrs";a:0:{}}i:4;a:2:{s:6:"weight";s:4:"2586";s:5:"attrs";a:0:{}}i:7;a:2:{s:6:"weight";s:4:"2586";s:5:"attrs";a:0:{}}i:10;a:2:{s:6:"weight";s:4:"2586";s:5:"attrs";a:0:{}}i:5;a:2:{s:6:"weight";s:4:"1537";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"5";s:11:"total_found";s:1:"5";s:4:"time";s:5:"0.003";s:5:"words";a:2:{s:3:"bbb";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:1:"4";}s:3:"ccc";a:2:{s:4:"docs";s:1:"5";s:4:"hits";s:1:"5";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:7:"bbb|ccc";}i:1;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:1;a:2:{s:6:"weight";s:4:"1722";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.002";s:5:"words";a:1:{s:7:"bbb@ccc";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:7:"bbb@ccc";}i:2;a:12:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:5:"total";s:1:"0";s:11:"total_found";s:1:"0";s:4:"time";s:5:"0.001";s:5:"words";a:1:{s:7:"bbb|ccc";a:2:{s:4:"docs";s:1:"0";s:4:"hits";s:1:"0";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:8:"bbb\|ccc";}i:3;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:1;a:2:{s:6:"weight";s:4:"1722";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.002";s:5:"words";a:1:{s:7:"bbb@ccc";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:8:"bbb\@ccc";}i:4;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:4:{i:1;a:2:{s:6:"weight";s:4:"2586";s:5:"attrs";a:0:{}}i:4;a:2:{s:6:"weight";s:4:"2586";s:5:"attrs";a:0:{}}i:7;a:2:{s:6:"weight";s:4:"2586";s:5:"attrs";a:0:{}}i:10;a:2:{s:6:"weight";s:4:"2586";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"4";s:11:"total_found";s:1:"4";s:4:"time";s:5:"0.003";s:5:"words";a:2:{s:3:"bbb";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:1:"4";}s:3:"ccc";a:2:{s:4:"docs";s:1:"5";s:4:"hits";s:1:"5";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:7:"bbb ccc";}i:5;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:4:{i:1;a:2:{s:6:"weight";s:4:"2586";s:5:"attrs";a:0:{}}i:4;a:2:{s:6:"weight";s:4:"2586";s:5:"attrs";a:0:{}}i:7;a:2:{s:6:"weight";s:4:"2586";s:5:"attrs";a:0:{}}i:10;a:2:{s:6:"weight";s:4:"2586";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"4";s:11:"total_found";s:1:"4";s:4:"time";s:5:"0.003";s:5:"words";a:2:{s:3:"bbb";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:1:"4";}s:3:"ccc";a:2:{s:4:"docs";s:1:"5";s:4:"hits";s:1:"5";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:9:""bbb ccc"";}i:6;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:6:{i:5;a:2:{s:6:"weight";s:4:"3585";s:5:"attrs";a:0:{}}i:1;a:2:{s:6:"weight";s:4:"2585";s:5:"attrs";a:0:{}}i:7;a:2:{s:6:"weight";s:4:"2585";s:5:"attrs";a:0:{}}i:4;a:2:{s:6:"weight";s:4:"2543";s:5:"attrs";a:0:{}}i:10;a:2:{s:6:"weight";s:4:"2543";s:5:"attrs";a:0:{}}i:9;a:2:{s:6:"weight";s:4:"1518";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"6";s:11:"total_found";s:1:"6";s:4:"time";s:5:"0.003";s:5:"words";a:3:{s:3:"aaa";a:2:{s:4:"docs";s:1:"6";s:4:"hits";s:1:"6";}s:3:"eee";a:2:{s:4:"docs";s:1:"3";s:4:"hits";s:1:"3";}s:3:"ccc";a:2:{s:4:"docs";s:1:"5";s:4:"hits";s:1:"5";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:11:"aaa|eee|ccc";}i:7;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:5;a:2:{s:6:"weight";s:4:"1722";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.002";s:5:"words";a:1:{s:11:"aaa|eee|ccc";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:13:"aaa\|eee\|ccc";}i:8;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:5;a:2:{s:6:"weight";s:4:"1722";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.002";s:5:"words";a:1:{s:11:"aaa|eee|ccc";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:13:""aaa|eee|ccc"";}i:9;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:5;a:2:{s:6:"weight";s:4:"1722";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.001";s:5:"words";a:1:{s:11:"aaa|eee|ccc";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:15:""aaa\|eee\|ccc"";}i:10;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:6;a:2:{s:6:"weight";s:4:"1722";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.001";s:5:"words";a:1:{s:7:"a+b+c+d";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:7:"a+b+c+d";}i:11;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:6;a:2:{s:6:"weight";s:4:"2722";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.001";s:5:"words";a:2:{s:7:"a+b+c+d";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}s:1:"e";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:9:"a+b+c+d e";}i:12;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:6;a:2:{s:6:"weight";s:4:"3722";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.002";s:5:"words";a:3:{s:7:"a+b+c+d";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}s:1:"e";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}s:1:"f";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:13:""a+b+c+d e f"";}i:13;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:6;a:2:{s:6:"weight";s:4:"2722";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.001";s:5:"words";a:2:{s:7:"a+b+c+d";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}s:5:"e+f|g";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:15:""a+b+c+d e+f|g"";}i:14;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:1;a:2:{s:6:"weight";s:4:"3673";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.002";s:5:"words";a:3:{s:7:"bbb@ccc";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}s:3:"ddd";a:2:{s:4:"docs";s:1:"5";s:4:"hits";s:1:"5";}s:4:"@eee";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:18:""bbb@ccc ddd @eee"";}i:15;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:1;a:2:{s:6:"weight";s:4:"3673";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.002";s:5:"words";a:3:{s:3:"ddd";a:2:{s:4:"docs";s:1:"5";s:4:"hits";s:1:"5";}s:4:"@eee";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}s:11:"fff@ggg@hhh";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:22:""ddd @eee fff@ggg@hhh"";}i:16;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:1;a:2:{s:6:"weight";s:4:"3722";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.002";s:5:"words";a:3:{s:11:"fff@ggg@hhh";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}s:4:"iii@";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}s:3:"kkk";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:22:""fff@ggg@hhh iii@ kkk"";}i:17;a:6:{s:5:"query";s:1:"@";s:5:"error";s:49:"index test: syntax error, unexpected $end near ''";s:7:"warning";s:0:"";s:5:"total";i:0;s:11:"total_found";i:0;s:4:"time";i:0;}i:18;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:3;a:2:{s:6:"weight";s:4:"1722";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.001";s:5:"words";a:1:{s:1:"@";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:2:"\@";}i:19;a:6:{s:5:"query";s:8:"@eee kkk";s:5:"error";s:55:"index test: query error: no field 'eee' found in schema";s:7:"warning";s:0:"";s:5:"total";i:0;s:11:"total_found";i:0;s:4:"time";i:0;}i:20;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:1;a:2:{s:6:"weight";s:4:"1722";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.001";s:5:"words";a:2:{s:4:"@eee";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}s:3:"kkk";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:9:"\@eee kkk";}i:21;a:12:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:5:"total";s:1:"0";s:11:"total_found";s:1:"0";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:7:"aaa*ccc";a:2:{s:4:"docs";s:1:"0";s:4:"hits";s:1:"0";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:8:"aaa\*ccc";}i:22;a:12:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:5:"total";s:1:"0";s:11:"total_found";s:1:"0";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:7:"aaa*ccc";a:2:{s:4:"docs";s:1:"0";s:4:"hits";s:1:"0";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:7:"aaa*ccc";}i:23;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:7;a:2:{s:6:"weight";s:4:"1722";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.001";s:5:"words";a:1:{s:7:"bbb*ccc";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:8:"bbb\*ccc";}i:24;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:7;a:2:{s:6:"weight";s:4:"1722";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.001";s:5:"words";a:1:{s:7:"bbb*ccc";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:7:"bbb*ccc";}i:25;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:4:{i:1;a:2:{s:6:"weight";s:4:"2586";s:5:"attrs";a:0:{}}i:4;a:2:{s:6:"weight";s:4:"2586";s:5:"attrs";a:0:{}}i:7;a:2:{s:6:"weight";s:4:"2586";s:5:"attrs";a:0:{}}i:10;a:2:{s:6:"weight";s:4:"2586";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"4";s:11:"total_found";s:1:"4";s:4:"time";s:5:"0.001";s:5:"words";a:2:{s:3:"bbb";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:1:"4";}s:3:"ccc";a:2:{s:4:"docs";s:1:"5";s:4:"hits";s:1:"5";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:8:" bbb ccc";}i:26;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:4:{i:1;a:2:{s:6:"weight";s:4:"2586";s:5:"attrs";a:0:{}}i:4;a:2:{s:6:"weight";s:4:"2586";s:5:"attrs";a:0:{}}i:7;a:2:{s:6:"weight";s:4:"2586";s:5:"attrs";a:0:{}}i:10;a:2:{s:6:"weight";s:4:"2586";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"4";s:11:"total_found";s:1:"4";s:4:"time";s:5:"0.001";s:5:"words";a:2:{s:3:"bbb";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:1:"4";}s:3:"ccc";a:2:{s:4:"docs";s:1:"5";s:4:"hits";s:1:"5";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:9:""bbb ccc"";}i:27;a:12:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:5:"total";s:1:"0";s:11:"total_found";s:1:"0";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:7:"fff*ggg";a:2:{s:4:"docs";s:1:"0";s:4:"hits";s:1:"0";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:8:"fff\*ggg";}i:28;a:12:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:5:"total";s:1:"0";s:11:"total_found";s:1:"0";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:7:"fff*ggg";a:2:{s:4:"docs";s:1:"0";s:4:"hits";s:1:"0";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:7:"fff*ggg";}i:29;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:7;a:2:{s:6:"weight";s:4:"1722";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.001";s:5:"words";a:1:{s:11:"fff*ggg*hhh";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:11:"fff*ggg*hhh";}i:30;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:7;a:2:{s:6:"weight";s:4:"2648";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.001";s:5:"words";a:2:{s:7:"bbb*ccc";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}s:3:"ddd";a:2:{s:4:"docs";s:1:"5";s:4:"hits";s:1:"5";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:13:""bbb*ccc ddd"";}i:31;a:12:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:5:"total";s:1:"0";s:11:"total_found";s:1:"0";s:4:"time";s:5:"0.002";s:5:"words";a:3:{s:7:"bbb*ccc";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}s:3:"ccc";a:2:{s:4:"docs";s:1:"5";s:4:"hits";s:1:"5";}s:3:"ddd";a:2:{s:4:"docs";s:1:"5";s:4:"hits";s:1:"5";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:17:""bbb*ccc ccc ddd"";}i:32;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:7;a:2:{s:6:"weight";s:4:"2611";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.001";s:5:"words";a:2:{s:7:"bbb*ccc";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}s:3:"ddd";a:2:{s:4:"docs";s:1:"5";s:4:"hits";s:1:"5";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:14:"bbb*ccc << ddd";}i:33;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:11;a:2:{s:6:"weight";s:4:"1722";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.001";s:5:"words";a:1:{s:5:"hello";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:5:"hello";}i:34;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:11;a:2:{s:6:"weight";s:4:"2722";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.001";s:5:"words";a:2:{s:5:"hello";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}s:5:"world";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:13:""hello world"";}i:35;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:11;a:2:{s:6:"weight";s:4:"1722";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.001";s:5:"words";a:2:{s:5:"hello";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}s:5:"u.s.a";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:11:"hello U.S.A";}i:36;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:20;a:2:{s:6:"weight";s:4:"1722";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.001";s:5:"words";a:1:{s:4:"must";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:4:"must";}i:37;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:20;a:2:{s:6:"weight";s:4:"1722";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.001";s:5:"words";a:1:{s:7:"must!!!";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:10:"must\!\!\!";}i:38;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:21;a:2:{s:6:"weight";s:4:"1722";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.001";s:5:"words";a:1:{s:4:"dude";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:4:"dude";}i:39;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:21;a:2:{s:6:"weight";s:4:"1722";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.001";s:5:"words";a:1:{s:5:"@dude";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:6:"\@dude";}i:40;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:4:{i:30;a:2:{s:6:"weight";s:4:"1598";s:5:"attrs";a:0:{}}i:31;a:2:{s:6:"weight";s:4:"1598";s:5:"attrs";a:0:{}}i:32;a:2:{s:6:"weight";s:4:"1598";s:5:"attrs";a:0:{}}i:33;a:2:{s:6:"weight";s:4:"1598";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"4";s:11:"total_found";s:1:"4";s:4:"time";s:5:"0.001";s:5:"words";a:1:{s:5:"posse";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:1:"4";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:5:"posse";}i:41;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:31;a:2:{s:6:"weight";s:4:"1722";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.001";s:5:"words";a:1:{s:7:"posse()";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:9:"posse\(\)";}i:42;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:32;a:2:{s:6:"weight";s:4:"1722";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.001";s:5:"words";a:1:{s:7:"posse[]";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:9:"posse\[\]";}i:43;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:33;a:2:{s:6:"weight";s:4:"1722";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.001";s:5:"words";a:1:{s:7:"posse{}";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:9:"posse\{\}";}i:44;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:31;a:2:{s:6:"weight";s:4:"1722";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.001";s:5:"words";a:1:{s:7:"posse()";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:9:""posse()"";}i:45;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:32;a:2:{s:6:"weight";s:4:"1722";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.001";s:5:"words";a:1:{s:7:"posse[]";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:9:""posse[]"";}i:46;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:33;a:2:{s:6:"weight";s:4:"1722";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.001";s:5:"words";a:1:{s:7:"posse{}";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:9:""posse{}"";}i:47;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:8;a:2:{s:6:"weight";s:4:"1722";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.001";s:5:"words";a:1:{s:7:"ggg*hhh";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:9:"^ggg*hhh$";}i:48;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:8;a:2:{s:6:"weight";s:4:"1722";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.001";s:5:"words";a:1:{s:7:"ggg*hhh";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:8:"^ggg*hhh";}i:49;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:8;a:2:{s:6:"weight";s:4:"1722";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.001";s:5:"words";a:1:{s:7:"ggg*hhh";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:8:"ggg*hhh$";}i:50;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:2:{i:2;a:2:{s:6:"weight";s:4:"1575";s:5:"attrs";a:0:{}}i:8;a:2:{s:6:"weight";s:4:"1575";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"2";s:11:"total_found";s:1:"2";s:4:"time";s:5:"0.001";s:5:"words";a:1:{s:3:"ggg";a:2:{s:4:"docs";s:1:"5";s:4:"hits";s:1:"5";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:4:"^ggg";}i:51;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:3:{i:2;a:2:{s:6:"weight";s:4:"1575";s:5:"attrs";a:0:{}}i:8;a:2:{s:6:"weight";s:4:"1575";s:5:"attrs";a:0:{}}i:9;a:2:{s:6:"weight";s:4:"1575";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"3";s:11:"total_found";s:1:"3";s:4:"time";s:5:"0.001";s:5:"words";a:1:{s:3:"hhh";a:2:{s:4:"docs";s:1:"5";s:4:"hits";s:1:"5";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:4:"hhh$";}i:52;a:12:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:5:"total";s:1:"0";s:11:"total_found";s:1:"0";s:4:"time";s:5:"0.001";s:5:"words";a:1:{s:3:"ggg";a:2:{s:4:"docs";s:1:"5";s:4:"hits";s:1:"5";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:4:"ggg$";}i:53;a:12:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:5:"total";s:1:"0";s:11:"total_found";s:1:"0";s:4:"time";s:5:"0.001";s:5:"words";a:1:{s:3:"hhh";a:2:{s:4:"docs";s:1:"5";s:4:"hits";s:1:"5";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:4:"^hhh";}i:54;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:2:{i:2;a:2:{s:6:"weight";s:4:"1575";s:5:"attrs";a:0:{}}i:8;a:2:{s:6:"weight";s:4:"1575";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"2";s:11:"total_found";s:1:"2";s:4:"time";s:5:"0.001";s:5:"words";a:1:{s:3:"gg*";a:2:{s:4:"docs";s:1:"5";s:4:"hits";s:1:"5";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:4:"^gg*";}i:55;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:3:{i:2;a:2:{s:6:"weight";s:4:"1603";s:5:"attrs";a:0:{}}i:8;a:2:{s:6:"weight";s:4:"1575";s:5:"attrs";a:0:{}}i:9;a:2:{s:6:"weight";s:4:"1575";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"3";s:11:"total_found";s:1:"3";s:4:"time";s:5:"0.001";s:5:"words";a:1:{s:3:"*hh";a:2:{s:4:"docs";s:1:"5";s:4:"hits";s:1:"7";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:4:"*hh$";}i:56;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:2:{i:2;a:2:{s:6:"weight";s:4:"1535";s:5:"attrs";a:0:{}}i:8;a:2:{s:6:"weight";s:4:"1535";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"2";s:11:"total_found";s:1:"2";s:4:"time";s:5:"0.001";s:5:"words";a:1:{s:3:"*g*";a:2:{s:4:"docs";s:1:"7";s:4:"hits";s:1:"8";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:4:"^*g*";}i:57;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:3:{i:11;a:2:{s:6:"weight";s:4:"1560";s:5:"attrs";a:0:{}}i:2;a:2:{s:6:"weight";s:4:"1548";s:5:"attrs";a:0:{}}i:21;a:2:{s:6:"weight";s:4:"1535";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"3";s:11:"total_found";s:1:"3";s:4:"time";s:5:"0.001";s:5:"words";a:1:{s:3:"*h*";a:2:{s:4:"docs";s:1:"7";s:4:"hits";s:2:"12";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:4:"^*h*";}i:58;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:2:{i:4;a:2:{s:6:"weight";s:4:"1554";s:5:"attrs";a:0:{}}i:5;a:2:{s:6:"weight";s:4:"1554";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"2";s:11:"total_found";s:1:"2";s:4:"time";s:5:"0.001";s:5:"words";a:1:{s:3:"*c*";a:2:{s:4:"docs";s:1:"6";s:4:"hits";s:1:"7";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:4:"*c*$";}i:59;a:3:{s:8:"sphinxql";s:55:"select * from test1 where match ( 'zzzzzz .(buzzzz)' )";s:10:"total_rows";i:1;s:4:"rows";a:1:{i:0;a:2:{s:2:"id";s:1:"1";s:6:"weight";s:4:"1500";}}}i:60;a:2:{s:8:"sphinxql";s:41:"select * from test1 where match ( 'a+b' )";s:10:"total_rows";i:0;}i:61;a:3:{s:8:"sphinxql";s:44:"select * from test2 where match ( 'a11-22' )";s:10:"total_rows";i:1;s:4:"rows";a:1:{i:0;a:2:{s:2:"id";s:1:"1";s:6:"weight";s:4:"1643";}}}i:62;a:3:{s:8:"sphinxql";s:43:"select * from test2 where match ( '11-22' )";s:10:"total_rows";i:1;s:4:"rows";a:1:{i:0;a:2:{s:2:"id";s:1:"2";s:6:"weight";s:4:"1643";}}}}i:1;a:63:{i:0;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:5:{i:1;a:2:{s:6:"weight";s:4:"2586";s:5:"attrs";a:0:{}}i:4;a:2:{s:6:"weight";s:4:"2586";s:5:"attrs";a:0:{}}i:7;a:2:{s:6:"weight";s:4:"2586";s:5:"attrs";a:0:{}}i:10;a:2:{s:6:"weight";s:4:"2586";s:5:"attrs";a:0:{}}i:5;a:2:{s:6:"weight";s:4:"1537";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"5";s:11:"total_found";s:1:"5";s:4:"time";s:5:"0.001";s:5:"words";a:2:{s:3:"bbb";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:1:"4";}s:3:"ccc";a:2:{s:4:"docs";s:1:"5";s:4:"hits";s:1:"5";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:7:"bbb|ccc";}i:1;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:1;a:2:{s:6:"weight";s:4:"1722";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:7:"bbb@ccc";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:7:"bbb@ccc";}i:2;a:12:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:5:"total";s:1:"0";s:11:"total_found";s:1:"0";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:7:"bbb|ccc";a:2:{s:4:"docs";s:1:"0";s:4:"hits";s:1:"0";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:8:"bbb\|ccc";}i:3;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:1;a:2:{s:6:"weight";s:4:"1722";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:7:"bbb@ccc";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:8:"bbb\@ccc";}i:4;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:4:{i:1;a:2:{s:6:"weight";s:4:"2586";s:5:"attrs";a:0:{}}i:4;a:2:{s:6:"weight";s:4:"2586";s:5:"attrs";a:0:{}}i:7;a:2:{s:6:"weight";s:4:"2586";s:5:"attrs";a:0:{}}i:10;a:2:{s:6:"weight";s:4:"2586";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"4";s:11:"total_found";s:1:"4";s:4:"time";s:5:"0.001";s:5:"words";a:2:{s:3:"bbb";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:1:"4";}s:3:"ccc";a:2:{s:4:"docs";s:1:"5";s:4:"hits";s:1:"5";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:7:"bbb ccc";}i:5;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:4:{i:1;a:2:{s:6:"weight";s:4:"2586";s:5:"attrs";a:0:{}}i:4;a:2:{s:6:"weight";s:4:"2586";s:5:"attrs";a:0:{}}i:7;a:2:{s:6:"weight";s:4:"2586";s:5:"attrs";a:0:{}}i:10;a:2:{s:6:"weight";s:4:"2586";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"4";s:11:"total_found";s:1:"4";s:4:"time";s:5:"0.001";s:5:"words";a:2:{s:3:"bbb";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:1:"4";}s:3:"ccc";a:2:{s:4:"docs";s:1:"5";s:4:"hits";s:1:"5";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:9:""bbb ccc"";}i:6;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:6:{i:5;a:2:{s:6:"weight";s:4:"3585";s:5:"attrs";a:0:{}}i:1;a:2:{s:6:"weight";s:4:"2585";s:5:"attrs";a:0:{}}i:7;a:2:{s:6:"weight";s:4:"2585";s:5:"attrs";a:0:{}}i:4;a:2:{s:6:"weight";s:4:"2543";s:5:"attrs";a:0:{}}i:10;a:2:{s:6:"weight";s:4:"2543";s:5:"attrs";a:0:{}}i:9;a:2:{s:6:"weight";s:4:"1518";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"6";s:11:"total_found";s:1:"6";s:4:"time";s:5:"0.001";s:5:"words";a:3:{s:3:"aaa";a:2:{s:4:"docs";s:1:"6";s:4:"hits";s:1:"6";}s:3:"eee";a:2:{s:4:"docs";s:1:"3";s:4:"hits";s:1:"3";}s:3:"ccc";a:2:{s:4:"docs";s:1:"5";s:4:"hits";s:1:"5";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:11:"aaa|eee|ccc";}i:7;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:5;a:2:{s:6:"weight";s:4:"1722";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:11:"aaa|eee|ccc";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:13:"aaa\|eee\|ccc";}i:8;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:5;a:2:{s:6:"weight";s:4:"1722";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:11:"aaa|eee|ccc";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:13:""aaa|eee|ccc"";}i:9;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:5;a:2:{s:6:"weight";s:4:"1722";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:11:"aaa|eee|ccc";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:15:""aaa\|eee\|ccc"";}i:10;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:6;a:2:{s:6:"weight";s:4:"1722";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:7:"a+b+c+d";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:7:"a+b+c+d";}i:11;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:6;a:2:{s:6:"weight";s:4:"2722";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.001";s:5:"words";a:2:{s:7:"a+b+c+d";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}s:1:"e";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:9:"a+b+c+d e";}i:12;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:6;a:2:{s:6:"weight";s:4:"3722";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.001";s:5:"words";a:3:{s:7:"a+b+c+d";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}s:1:"e";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}s:1:"f";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:13:""a+b+c+d e f"";}i:13;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:6;a:2:{s:6:"weight";s:4:"2722";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.001";s:5:"words";a:2:{s:7:"a+b+c+d";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}s:5:"e+f|g";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:15:""a+b+c+d e+f|g"";}i:14;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:1;a:2:{s:6:"weight";s:4:"3673";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.001";s:5:"words";a:3:{s:7:"bbb@ccc";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}s:3:"ddd";a:2:{s:4:"docs";s:1:"5";s:4:"hits";s:1:"5";}s:4:"@eee";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:18:""bbb@ccc ddd @eee"";}i:15;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:1;a:2:{s:6:"weight";s:4:"3673";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.001";s:5:"words";a:3:{s:3:"ddd";a:2:{s:4:"docs";s:1:"5";s:4:"hits";s:1:"5";}s:4:"@eee";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}s:11:"fff@ggg@hhh";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:22:""ddd @eee fff@ggg@hhh"";}i:16;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:1;a:2:{s:6:"weight";s:4:"3722";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.001";s:5:"words";a:3:{s:11:"fff@ggg@hhh";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}s:4:"iii@";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}s:3:"kkk";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:22:""fff@ggg@hhh iii@ kkk"";}i:17;a:6:{s:5:"query";s:1:"@";s:5:"error";s:49:"index test: syntax error, unexpected $end near ''";s:7:"warning";s:0:"";s:5:"total";i:0;s:11:"total_found";i:0;s:4:"time";i:0;}i:18;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:3;a:2:{s:6:"weight";s:4:"1722";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:1:"@";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:2:"\@";}i:19;a:6:{s:5:"query";s:8:"@eee kkk";s:5:"error";s:55:"index test: query error: no field 'eee' found in schema";s:7:"warning";s:0:"";s:5:"total";i:0;s:11:"total_found";i:0;s:4:"time";i:0;}i:20;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:1;a:2:{s:6:"weight";s:4:"1722";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.001";s:5:"words";a:2:{s:4:"@eee";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}s:3:"kkk";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:9:"\@eee kkk";}i:21;a:12:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:5:"total";s:1:"0";s:11:"total_found";s:1:"0";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:7:"aaa*ccc";a:2:{s:4:"docs";s:1:"0";s:4:"hits";s:1:"0";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:8:"aaa\*ccc";}i:22;a:12:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:5:"total";s:1:"0";s:11:"total_found";s:1:"0";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:7:"aaa*ccc";a:2:{s:4:"docs";s:1:"0";s:4:"hits";s:1:"0";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:7:"aaa*ccc";}i:23;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:7;a:2:{s:6:"weight";s:4:"1722";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:7:"bbb*ccc";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:8:"bbb\*ccc";}i:24;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:7;a:2:{s:6:"weight";s:4:"1722";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:7:"bbb*ccc";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:7:"bbb*ccc";}i:25;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:4:{i:1;a:2:{s:6:"weight";s:4:"2586";s:5:"attrs";a:0:{}}i:4;a:2:{s:6:"weight";s:4:"2586";s:5:"attrs";a:0:{}}i:7;a:2:{s:6:"weight";s:4:"2586";s:5:"attrs";a:0:{}}i:10;a:2:{s:6:"weight";s:4:"2586";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"4";s:11:"total_found";s:1:"4";s:4:"time";s:5:"0.001";s:5:"words";a:2:{s:3:"bbb";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:1:"4";}s:3:"ccc";a:2:{s:4:"docs";s:1:"5";s:4:"hits";s:1:"5";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:8:" bbb ccc";}i:26;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:4:{i:1;a:2:{s:6:"weight";s:4:"2586";s:5:"attrs";a:0:{}}i:4;a:2:{s:6:"weight";s:4:"2586";s:5:"attrs";a:0:{}}i:7;a:2:{s:6:"weight";s:4:"2586";s:5:"attrs";a:0:{}}i:10;a:2:{s:6:"weight";s:4:"2586";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"4";s:11:"total_found";s:1:"4";s:4:"time";s:5:"0.001";s:5:"words";a:2:{s:3:"bbb";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:1:"4";}s:3:"ccc";a:2:{s:4:"docs";s:1:"5";s:4:"hits";s:1:"5";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:9:""bbb ccc"";}i:27;a:12:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:5:"total";s:1:"0";s:11:"total_found";s:1:"0";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:7:"fff*ggg";a:2:{s:4:"docs";s:1:"0";s:4:"hits";s:1:"0";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:8:"fff\*ggg";}i:28;a:12:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:5:"total";s:1:"0";s:11:"total_found";s:1:"0";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:7:"fff*ggg";a:2:{s:4:"docs";s:1:"0";s:4:"hits";s:1:"0";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:7:"fff*ggg";}i:29;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:7;a:2:{s:6:"weight";s:4:"1722";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:11:"fff*ggg*hhh";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:11:"fff*ggg*hhh";}i:30;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:7;a:2:{s:6:"weight";s:4:"2648";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.001";s:5:"words";a:2:{s:7:"bbb*ccc";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}s:3:"ddd";a:2:{s:4:"docs";s:1:"5";s:4:"hits";s:1:"5";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:13:""bbb*ccc ddd"";}i:31;a:12:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:5:"total";s:1:"0";s:11:"total_found";s:1:"0";s:4:"time";s:5:"0.001";s:5:"words";a:3:{s:7:"bbb*ccc";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}s:3:"ccc";a:2:{s:4:"docs";s:1:"5";s:4:"hits";s:1:"5";}s:3:"ddd";a:2:{s:4:"docs";s:1:"5";s:4:"hits";s:1:"5";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:17:""bbb*ccc ccc ddd"";}i:32;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:7;a:2:{s:6:"weight";s:4:"2611";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.001";s:5:"words";a:2:{s:7:"bbb*ccc";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}s:3:"ddd";a:2:{s:4:"docs";s:1:"5";s:4:"hits";s:1:"5";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:14:"bbb*ccc << ddd";}i:33;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:11;a:2:{s:6:"weight";s:4:"1722";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:5:"hello";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:5:"hello";}i:34;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:11;a:2:{s:6:"weight";s:4:"2722";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.001";s:5:"words";a:2:{s:5:"hello";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}s:5:"world";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:13:""hello world"";}i:35;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:11;a:2:{s:6:"weight";s:4:"1722";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.001";s:5:"words";a:2:{s:5:"hello";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}s:5:"u.s.a";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:11:"hello U.S.A";}i:36;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:20;a:2:{s:6:"weight";s:4:"1722";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:4:"must";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:4:"must";}i:37;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:20;a:2:{s:6:"weight";s:4:"1722";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:7:"must!!!";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:10:"must\!\!\!";}i:38;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:21;a:2:{s:6:"weight";s:4:"1722";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:4:"dude";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:4:"dude";}i:39;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:21;a:2:{s:6:"weight";s:4:"1722";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:5:"@dude";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:6:"\@dude";}i:40;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:4:{i:30;a:2:{s:6:"weight";s:4:"1598";s:5:"attrs";a:0:{}}i:31;a:2:{s:6:"weight";s:4:"1598";s:5:"attrs";a:0:{}}i:32;a:2:{s:6:"weight";s:4:"1598";s:5:"attrs";a:0:{}}i:33;a:2:{s:6:"weight";s:4:"1598";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"4";s:11:"total_found";s:1:"4";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:5:"posse";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:1:"4";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:5:"posse";}i:41;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:31;a:2:{s:6:"weight";s:4:"1722";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:7:"posse()";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:9:"posse\(\)";}i:42;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:32;a:2:{s:6:"weight";s:4:"1722";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:7:"posse[]";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:9:"posse\[\]";}i:43;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:33;a:2:{s:6:"weight";s:4:"1722";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:7:"posse{}";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:9:"posse\{\}";}i:44;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:31;a:2:{s:6:"weight";s:4:"1722";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:7:"posse()";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:9:""posse()"";}i:45;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:32;a:2:{s:6:"weight";s:4:"1722";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:7:"posse[]";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:9:""posse[]"";}i:46;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:33;a:2:{s:6:"weight";s:4:"1722";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:7:"posse{}";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:9:""posse{}"";}i:47;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:8;a:2:{s:6:"weight";s:4:"1722";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:7:"ggg*hhh";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:9:"^ggg*hhh$";}i:48;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:8;a:2:{s:6:"weight";s:4:"1722";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:7:"ggg*hhh";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:8:"^ggg*hhh";}i:49;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:8;a:2:{s:6:"weight";s:4:"1722";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:7:"ggg*hhh";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:8:"ggg*hhh$";}i:50;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:2:{i:2;a:2:{s:6:"weight";s:4:"1575";s:5:"attrs";a:0:{}}i:8;a:2:{s:6:"weight";s:4:"1575";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"2";s:11:"total_found";s:1:"2";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:3:"ggg";a:2:{s:4:"docs";s:1:"5";s:4:"hits";s:1:"5";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:4:"^ggg";}i:51;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:3:{i:2;a:2:{s:6:"weight";s:4:"1575";s:5:"attrs";a:0:{}}i:8;a:2:{s:6:"weight";s:4:"1575";s:5:"attrs";a:0:{}}i:9;a:2:{s:6:"weight";s:4:"1575";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"3";s:11:"total_found";s:1:"3";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:3:"hhh";a:2:{s:4:"docs";s:1:"5";s:4:"hits";s:1:"5";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:4:"hhh$";}i:52;a:12:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:5:"total";s:1:"0";s:11:"total_found";s:1:"0";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:3:"ggg";a:2:{s:4:"docs";s:1:"5";s:4:"hits";s:1:"5";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:4:"ggg$";}i:53;a:12:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:5:"total";s:1:"0";s:11:"total_found";s:1:"0";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:3:"hhh";a:2:{s:4:"docs";s:1:"5";s:4:"hits";s:1:"5";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:4:"^hhh";}i:54;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:2:{i:2;a:2:{s:6:"weight";s:4:"1575";s:5:"attrs";a:0:{}}i:8;a:2:{s:6:"weight";s:4:"1575";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"2";s:11:"total_found";s:1:"2";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:3:"gg*";a:2:{s:4:"docs";s:1:"5";s:4:"hits";s:1:"5";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:4:"^gg*";}i:55;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:3:{i:2;a:2:{s:6:"weight";s:4:"1603";s:5:"attrs";a:0:{}}i:8;a:2:{s:6:"weight";s:4:"1575";s:5:"attrs";a:0:{}}i:9;a:2:{s:6:"weight";s:4:"1575";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"3";s:11:"total_found";s:1:"3";s:4:"time";s:5:"0.001";s:5:"words";a:1:{s:3:"*hh";a:2:{s:4:"docs";s:1:"5";s:4:"hits";s:1:"7";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:4:"*hh$";}i:56;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:2:{i:2;a:2:{s:6:"weight";s:4:"1535";s:5:"attrs";a:0:{}}i:8;a:2:{s:6:"weight";s:4:"1535";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"2";s:11:"total_found";s:1:"2";s:4:"time";s:5:"0.001";s:5:"words";a:1:{s:3:"*g*";a:2:{s:4:"docs";s:1:"7";s:4:"hits";s:1:"8";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:4:"^*g*";}i:57;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:3:{i:11;a:2:{s:6:"weight";s:4:"1560";s:5:"attrs";a:0:{}}i:2;a:2:{s:6:"weight";s:4:"1548";s:5:"attrs";a:0:{}}i:21;a:2:{s:6:"weight";s:4:"1535";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"3";s:11:"total_found";s:1:"3";s:4:"time";s:5:"0.001";s:5:"words";a:1:{s:3:"*h*";a:2:{s:4:"docs";s:1:"7";s:4:"hits";s:2:"12";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:4:"^*h*";}i:58;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:2:{i:4;a:2:{s:6:"weight";s:4:"1554";s:5:"attrs";a:0:{}}i:5;a:2:{s:6:"weight";s:4:"1554";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"2";s:11:"total_found";s:1:"2";s:4:"time";s:5:"0.001";s:5:"words";a:1:{s:3:"*c*";a:2:{s:4:"docs";s:1:"6";s:4:"hits";s:1:"7";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:4:"*c*$";}i:59;a:3:{s:8:"sphinxql";s:55:"select * from test1 where match ( 'zzzzzz .(buzzzz)' )";s:10:"total_rows";i:1;s:4:"rows";a:1:{i:0;a:2:{s:2:"id";s:1:"1";s:6:"weight";s:4:"1500";}}}i:60;a:2:{s:8:"sphinxql";s:41:"select * from test1 where match ( 'a+b' )";s:10:"total_rows";i:0;}i:61;a:3:{s:8:"sphinxql";s:44:"select * from test2 where match ( 'a11-22' )";s:10:"total_rows";i:1;s:4:"rows";a:1:{i:0;a:2:{s:2:"id";s:1:"1";s:6:"weight";s:4:"1643";}}}i:62;a:3:{s:8:"sphinxql";s:43:"select * from test2 where match ( '11-22' )";s:10:"total_rows";i:1;s:4:"rows";a:1:{i:0;a:2:{s:2:"id";s:1:"2";s:6:"weight";s:4:"1643";}}}}} \ No newline at end of file diff -Nru sphinxsearch-0.9.9+2.0.2beta/test/test_063/test.xml sphinxsearch-2.0.4/test/test_063/test.xml --- sphinxsearch-0.9.9+2.0.2beta/test/test_063/test.xml 2011-06-07 13:21:26.000000000 +0000 +++ sphinxsearch-2.0.4/test/test_063/test.xml 2012-01-31 17:15:46.000000000 +0000 @@ -72,6 +72,18 @@ charset_type = utf-8 } +index star +{ + source = test + path = /star + + blend_chars = @, ., !, (, ), [, ], {, } + charset_type = utf-8 + min_infix_len = 1 + enable_star = 1 +} + + @@ -170,6 +182,20 @@ "posse()" "posse[]" "posse{}" + + ^ggg*hhh$ + ^ggg*hhh + ggg*hhh$ + ^ggg + hhh$ + ggg$ + ^hhh + + ^gg* + *hh$ + ^*g* + ^*h* + *c*$ diff -Nru sphinxsearch-0.9.9+2.0.2beta/test/test_100/test.xml sphinxsearch-2.0.4/test/test_100/test.xml --- sphinxsearch-0.9.9+2.0.2beta/test/test_100/test.xml 2011-07-12 15:43:45.000000000 +0000 +++ sphinxsearch-2.0.4/test/test_100/test.xml 2011-11-21 15:58:19.000000000 +0000 @@ -44,8 +44,7 @@ "before_match" => "", "after_match" => "", "chunk_separator" => " ... ", - "around" => 3, - "allow_empty"=>true + "around" => 3 ); $results = array(); diff -Nru sphinxsearch-0.9.9+2.0.2beta/test/test_130/test.xml sphinxsearch-2.0.4/test/test_130/test.xml --- sphinxsearch-0.9.9+2.0.2beta/test/test_130/test.xml 2011-11-15 14:01:21.000000000 +0000 +++ sphinxsearch-2.0.4/test/test_130/test.xml 2011-11-21 15:58:19.000000000 +0000 @@ -32,7 +32,7 @@ $results = array(); $docs = array( 'test_130/load_file.txt' ); -$opts = array( 'load_files'=>true, 'limit'=>0, 'allow_empty'=>1 ); +$opts = array( 'load_files'=>true, 'limit'=>0 ); $results[] = $client->BuildExcerpts($docs, 'test', 'end point', $opts ); $results[] = $client->BuildExcerpts($docs, 'test', 'not_found', $opts ); diff -Nru sphinxsearch-0.9.9+2.0.2beta/test/test_132/model.bin sphinxsearch-2.0.4/test/test_132/model.bin --- sphinxsearch-0.9.9+2.0.2beta/test/test_132/model.bin 2011-11-14 13:27:43.000000000 +0000 +++ sphinxsearch-2.0.4/test/test_132/model.bin 2011-12-20 13:17:09.000000000 +0000 @@ -1 +1 @@ -a:2:{i:0;a:6:{i:0;a:12:{i:0;s:11:"iteration=0";i:1;s:7:"up.ok=2";i:2;s:10:"started=ok";i:3;s:11:"iteration=1";i:4;s:7:"up.ok=2";i:5;s:10:"started=ok";i:6;s:11:"iteration=2";i:7;s:7:"up.ok=2";i:8;s:10:"started=ok";i:9;s:11:"iteration=3";i:10;s:7:"up.ok=2";i:11;s:10:"started=ok";}i:1;a:3:{s:8:"sphinxql";s:38:"select * from idx where match('test3')";s:10:"total_rows";i:1;s:4:"rows";a:1:{i:0;a:4:{s:2:"id";s:1:"3";s:6:"weight";s:4:"1695";s:7:"section";s:3:"103";s:4:"mva1";s:5:"6,7,8";}}}i:2;a:3:{s:8:"sphinxql";s:16:"select * from rt";s:10:"total_rows";i:2;s:4:"rows";a:2:{i:0;a:5:{s:2:"id";s:1:"1";s:6:"weight";s:1:"1";s:3:"gid";s:4:"3212";s:4:"mva1";s:5:"1,2,3";s:4:"mva2";s:5:"3,4,5";}i:1;a:5:{s:2:"id";s:1:"3";s:6:"weight";s:1:"1";s:3:"gid";s:2:"33";s:4:"mva1";s:1:"3";s:4:"mva2";s:1:"3";}}}i:3;a:3:{s:8:"sphinxql";s:17:"select * from idx";s:10:"total_rows";i:4;s:4:"rows";a:4:{i:0;a:4:{s:2:"id";s:1:"1";s:6:"weight";s:1:"1";s:7:"section";s:3:"101";s:4:"mva1";s:3:"1,2";}i:1;a:4:{s:2:"id";s:1:"2";s:6:"weight";s:1:"1";s:7:"section";s:3:"102";s:4:"mva1";s:14:"1002,1023,4456";}i:2;a:4:{s:2:"id";s:1:"3";s:6:"weight";s:1:"1";s:7:"section";s:3:"103";s:4:"mva1";s:5:"6,7,8";}i:3;a:4:{s:2:"id";s:1:"4";s:6:"weight";s:1:"1";s:7:"section";s:3:"104";s:4:"mva1";s:14:"1004,1005,1006";}}}i:4;a:2:{s:8:"sphinxql";s:43:"update hung set mva1=(3,2, 1, 2) where id>2";s:14:"total_affected";i:1998;}i:5;a:3:{s:8:"sphinxql";s:35:"select * from hung order by @id asc";s:10:"total_rows";i:20;s:4:"rows";a:20:{i:0;a:5:{s:2:"id";s:1:"1";s:6:"weight";s:1:"1";s:3:"gid";s:4:"1000";s:4:"mva1";s:8:"989,1033";s:4:"mva2";s:4:"1033";}i:1;a:5:{s:2:"id";s:1:"2";s:6:"weight";s:1:"1";s:3:"gid";s:4:"2000";s:4:"mva1";s:9:"1989,2033";s:4:"mva2";s:4:"2033";}i:2;a:5:{s:2:"id";s:1:"3";s:6:"weight";s:1:"1";s:3:"gid";s:4:"3000";s:4:"mva1";s:5:"1,2,3";s:4:"mva2";s:4:"3033";}i:3;a:5:{s:2:"id";s:1:"4";s:6:"weight";s:1:"1";s:3:"gid";s:4:"4000";s:4:"mva1";s:5:"1,2,3";s:4:"mva2";s:4:"4033";}i:4;a:5:{s:2:"id";s:1:"5";s:6:"weight";s:1:"1";s:3:"gid";s:4:"5000";s:4:"mva1";s:5:"1,2,3";s:4:"mva2";s:4:"5033";}i:5;a:5:{s:2:"id";s:1:"6";s:6:"weight";s:1:"1";s:3:"gid";s:4:"6000";s:4:"mva1";s:5:"1,2,3";s:4:"mva2";s:4:"6033";}i:6;a:5:{s:2:"id";s:1:"7";s:6:"weight";s:1:"1";s:3:"gid";s:4:"7000";s:4:"mva1";s:5:"1,2,3";s:4:"mva2";s:4:"7033";}i:7;a:5:{s:2:"id";s:1:"8";s:6:"weight";s:1:"1";s:3:"gid";s:4:"8000";s:4:"mva1";s:5:"1,2,3";s:4:"mva2";s:4:"8033";}i:8;a:5:{s:2:"id";s:1:"9";s:6:"weight";s:1:"1";s:3:"gid";s:4:"9000";s:4:"mva1";s:5:"1,2,3";s:4:"mva2";s:4:"9033";}i:9;a:5:{s:2:"id";s:2:"10";s:6:"weight";s:1:"1";s:3:"gid";s:5:"10000";s:4:"mva1";s:5:"1,2,3";s:4:"mva2";s:5:"10033";}i:10;a:5:{s:2:"id";s:2:"11";s:6:"weight";s:1:"1";s:3:"gid";s:5:"11000";s:4:"mva1";s:5:"1,2,3";s:4:"mva2";s:5:"11033";}i:11;a:5:{s:2:"id";s:2:"12";s:6:"weight";s:1:"1";s:3:"gid";s:5:"12000";s:4:"mva1";s:5:"1,2,3";s:4:"mva2";s:5:"12033";}i:12;a:5:{s:2:"id";s:2:"13";s:6:"weight";s:1:"1";s:3:"gid";s:5:"13000";s:4:"mva1";s:5:"1,2,3";s:4:"mva2";s:5:"13033";}i:13;a:5:{s:2:"id";s:2:"14";s:6:"weight";s:1:"1";s:3:"gid";s:5:"14000";s:4:"mva1";s:5:"1,2,3";s:4:"mva2";s:5:"14033";}i:14;a:5:{s:2:"id";s:2:"15";s:6:"weight";s:1:"1";s:3:"gid";s:5:"15000";s:4:"mva1";s:5:"1,2,3";s:4:"mva2";s:5:"15033";}i:15;a:5:{s:2:"id";s:2:"16";s:6:"weight";s:1:"1";s:3:"gid";s:5:"16000";s:4:"mva1";s:5:"1,2,3";s:4:"mva2";s:5:"16033";}i:16;a:5:{s:2:"id";s:2:"17";s:6:"weight";s:1:"1";s:3:"gid";s:5:"17000";s:4:"mva1";s:5:"1,2,3";s:4:"mva2";s:5:"17033";}i:17;a:5:{s:2:"id";s:2:"18";s:6:"weight";s:1:"1";s:3:"gid";s:5:"18000";s:4:"mva1";s:5:"1,2,3";s:4:"mva2";s:5:"18033";}i:18;a:5:{s:2:"id";s:2:"19";s:6:"weight";s:1:"1";s:3:"gid";s:5:"19000";s:4:"mva1";s:5:"1,2,3";s:4:"mva2";s:5:"19033";}i:19;a:5:{s:2:"id";s:2:"20";s:6:"weight";s:1:"1";s:3:"gid";s:5:"20000";s:4:"mva1";s:5:"1,2,3";s:4:"mva2";s:5:"20033";}}}}i:1;a:6:{i:0;a:12:{i:0;s:11:"iteration=0";i:1;s:7:"up.ok=2";i:2;s:10:"started=ok";i:3;s:11:"iteration=1";i:4;s:7:"up.ok=2";i:5;s:10:"started=ok";i:6;s:11:"iteration=2";i:7;s:7:"up.ok=2";i:8;s:10:"started=ok";i:9;s:11:"iteration=3";i:10;s:7:"up.ok=2";i:11;s:10:"started=ok";}i:1;a:3:{s:8:"sphinxql";s:38:"select * from idx where match('test3')";s:10:"total_rows";i:1;s:4:"rows";a:1:{i:0;a:4:{s:2:"id";s:1:"3";s:6:"weight";s:4:"1695";s:7:"section";s:3:"103";s:4:"mva1";s:5:"6,7,8";}}}i:2;a:3:{s:8:"sphinxql";s:16:"select * from rt";s:10:"total_rows";i:2;s:4:"rows";a:2:{i:0;a:5:{s:2:"id";s:1:"1";s:6:"weight";s:1:"1";s:3:"gid";s:4:"3212";s:4:"mva1";s:5:"1,2,3";s:4:"mva2";s:5:"3,4,5";}i:1;a:5:{s:2:"id";s:1:"3";s:6:"weight";s:1:"1";s:3:"gid";s:2:"33";s:4:"mva1";s:1:"3";s:4:"mva2";s:1:"3";}}}i:3;a:3:{s:8:"sphinxql";s:17:"select * from idx";s:10:"total_rows";i:4;s:4:"rows";a:4:{i:0;a:4:{s:2:"id";s:1:"1";s:6:"weight";s:1:"1";s:7:"section";s:3:"101";s:4:"mva1";s:3:"1,2";}i:1;a:4:{s:2:"id";s:1:"2";s:6:"weight";s:1:"1";s:7:"section";s:3:"102";s:4:"mva1";s:14:"1002,1023,4456";}i:2;a:4:{s:2:"id";s:1:"3";s:6:"weight";s:1:"1";s:7:"section";s:3:"103";s:4:"mva1";s:5:"6,7,8";}i:3;a:4:{s:2:"id";s:1:"4";s:6:"weight";s:1:"1";s:7:"section";s:3:"104";s:4:"mva1";s:14:"1004,1005,1006";}}}i:4;a:2:{s:8:"sphinxql";s:43:"update hung set mva1=(3,2, 1, 2) where id>2";s:14:"total_affected";i:1998;}i:5;a:3:{s:8:"sphinxql";s:35:"select * from hung order by @id asc";s:10:"total_rows";i:20;s:4:"rows";a:20:{i:0;a:5:{s:2:"id";s:1:"1";s:6:"weight";s:1:"1";s:3:"gid";s:4:"1000";s:4:"mva1";s:8:"989,1033";s:4:"mva2";s:4:"1033";}i:1;a:5:{s:2:"id";s:1:"2";s:6:"weight";s:1:"1";s:3:"gid";s:4:"2000";s:4:"mva1";s:9:"1989,2033";s:4:"mva2";s:4:"2033";}i:2;a:5:{s:2:"id";s:1:"3";s:6:"weight";s:1:"1";s:3:"gid";s:4:"3000";s:4:"mva1";s:5:"1,2,3";s:4:"mva2";s:4:"3033";}i:3;a:5:{s:2:"id";s:1:"4";s:6:"weight";s:1:"1";s:3:"gid";s:4:"4000";s:4:"mva1";s:5:"1,2,3";s:4:"mva2";s:4:"4033";}i:4;a:5:{s:2:"id";s:1:"5";s:6:"weight";s:1:"1";s:3:"gid";s:4:"5000";s:4:"mva1";s:5:"1,2,3";s:4:"mva2";s:4:"5033";}i:5;a:5:{s:2:"id";s:1:"6";s:6:"weight";s:1:"1";s:3:"gid";s:4:"6000";s:4:"mva1";s:5:"1,2,3";s:4:"mva2";s:4:"6033";}i:6;a:5:{s:2:"id";s:1:"7";s:6:"weight";s:1:"1";s:3:"gid";s:4:"7000";s:4:"mva1";s:5:"1,2,3";s:4:"mva2";s:4:"7033";}i:7;a:5:{s:2:"id";s:1:"8";s:6:"weight";s:1:"1";s:3:"gid";s:4:"8000";s:4:"mva1";s:5:"1,2,3";s:4:"mva2";s:4:"8033";}i:8;a:5:{s:2:"id";s:1:"9";s:6:"weight";s:1:"1";s:3:"gid";s:4:"9000";s:4:"mva1";s:5:"1,2,3";s:4:"mva2";s:4:"9033";}i:9;a:5:{s:2:"id";s:2:"10";s:6:"weight";s:1:"1";s:3:"gid";s:5:"10000";s:4:"mva1";s:5:"1,2,3";s:4:"mva2";s:5:"10033";}i:10;a:5:{s:2:"id";s:2:"11";s:6:"weight";s:1:"1";s:3:"gid";s:5:"11000";s:4:"mva1";s:5:"1,2,3";s:4:"mva2";s:5:"11033";}i:11;a:5:{s:2:"id";s:2:"12";s:6:"weight";s:1:"1";s:3:"gid";s:5:"12000";s:4:"mva1";s:5:"1,2,3";s:4:"mva2";s:5:"12033";}i:12;a:5:{s:2:"id";s:2:"13";s:6:"weight";s:1:"1";s:3:"gid";s:5:"13000";s:4:"mva1";s:5:"1,2,3";s:4:"mva2";s:5:"13033";}i:13;a:5:{s:2:"id";s:2:"14";s:6:"weight";s:1:"1";s:3:"gid";s:5:"14000";s:4:"mva1";s:5:"1,2,3";s:4:"mva2";s:5:"14033";}i:14;a:5:{s:2:"id";s:2:"15";s:6:"weight";s:1:"1";s:3:"gid";s:5:"15000";s:4:"mva1";s:5:"1,2,3";s:4:"mva2";s:5:"15033";}i:15;a:5:{s:2:"id";s:2:"16";s:6:"weight";s:1:"1";s:3:"gid";s:5:"16000";s:4:"mva1";s:5:"1,2,3";s:4:"mva2";s:5:"16033";}i:16;a:5:{s:2:"id";s:2:"17";s:6:"weight";s:1:"1";s:3:"gid";s:5:"17000";s:4:"mva1";s:5:"1,2,3";s:4:"mva2";s:5:"17033";}i:17;a:5:{s:2:"id";s:2:"18";s:6:"weight";s:1:"1";s:3:"gid";s:5:"18000";s:4:"mva1";s:5:"1,2,3";s:4:"mva2";s:5:"18033";}i:18;a:5:{s:2:"id";s:2:"19";s:6:"weight";s:1:"1";s:3:"gid";s:5:"19000";s:4:"mva1";s:5:"1,2,3";s:4:"mva2";s:5:"19033";}i:19;a:5:{s:2:"id";s:2:"20";s:6:"weight";s:1:"1";s:3:"gid";s:5:"20000";s:4:"mva1";s:5:"1,2,3";s:4:"mva2";s:5:"20033";}}}}} \ No newline at end of file +a:2:{i:0;a:6:{i:0;a:36:{i:0;s:11:"iteration=0";i:1;s:7:"up.ok=2";i:2;s:10:"started=ok";i:3;s:11:"iteration=1";i:4;s:7:"up.ok=2";i:5;s:10:"started=ok";i:6;s:11:"iteration=2";i:7;s:7:"up.ok=2";i:8;s:10:"started=ok";i:9;s:11:"iteration=3";i:10;s:7:"up.ok=2";i:11;s:10:"started=ok";i:12;s:45:"select * from rt_mva order by id desc limit 3";i:13;s:34:"id = 16000 weight = 1 mva = 16000 ";i:14;s:34:"id = 15999 weight = 1 mva = 15999 ";i:15;s:34:"id = 15998 weight = 1 mva = 15998 ";i:16;s:9:"show meta";i:17;s:12:"total = 1000";i:18;s:19:"total_found = 16000";i:19;s:60:"select * from rt_mva where mva<17000 order by id asc limit 3";i:20;s:26:"id = 1 weight = 1 mva = 1 ";i:21;s:26:"id = 2 weight = 1 mva = 2 ";i:22;s:26:"id = 3 weight = 1 mva = 3 ";i:23;s:9:"show meta";i:24;s:12:"total = 1000";i:25;s:19:"total_found = 16000";i:26;s:59:"replace into rt_mva (id, text, mva) values ( 1, ' ', 333 )";i:27;s:63:"1064; raw 1, column 3: non-MVA value specified for a MVA column";i:28;s:58:"replace into rt_mva (id, text, mva) values ( 2, ' ', () )";i:29;s:44:"select * from rt_mva order by id asc limit 3";i:30;s:26:"id = 1 weight = 1 mva = 1 ";i:31;s:25:"id = 2 weight = 1 mva = ";i:32;s:26:"id = 3 weight = 1 mva = 3 ";i:33;s:9:"show meta";i:34;s:12:"total = 1000";i:35;s:19:"total_found = 16000";}i:1;a:3:{s:8:"sphinxql";s:38:"select * from idx where match('test3')";s:10:"total_rows";i:1;s:4:"rows";a:1:{i:0;a:4:{s:2:"id";s:1:"3";s:6:"weight";s:4:"1695";s:7:"section";s:3:"103";s:4:"mva1";s:5:"6,7,8";}}}i:2;a:3:{s:8:"sphinxql";s:16:"select * from rt";s:10:"total_rows";i:2;s:4:"rows";a:2:{i:0;a:5:{s:2:"id";s:1:"1";s:6:"weight";s:1:"1";s:3:"gid";s:4:"3212";s:4:"mva1";s:5:"1,2,3";s:4:"mva2";s:5:"3,4,5";}i:1;a:5:{s:2:"id";s:1:"3";s:6:"weight";s:1:"1";s:3:"gid";s:2:"33";s:4:"mva1";s:1:"3";s:4:"mva2";s:1:"3";}}}i:3;a:3:{s:8:"sphinxql";s:17:"select * from idx";s:10:"total_rows";i:4;s:4:"rows";a:4:{i:0;a:4:{s:2:"id";s:1:"1";s:6:"weight";s:1:"1";s:7:"section";s:3:"101";s:4:"mva1";s:3:"1,2";}i:1;a:4:{s:2:"id";s:1:"2";s:6:"weight";s:1:"1";s:7:"section";s:3:"102";s:4:"mva1";s:14:"1002,1023,4456";}i:2;a:4:{s:2:"id";s:1:"3";s:6:"weight";s:1:"1";s:7:"section";s:3:"103";s:4:"mva1";s:5:"6,7,8";}i:3;a:4:{s:2:"id";s:1:"4";s:6:"weight";s:1:"1";s:7:"section";s:3:"104";s:4:"mva1";s:14:"1004,1005,1006";}}}i:4;a:2:{s:8:"sphinxql";s:43:"update hung set mva1=(3,2, 1, 2) where id>2";s:14:"total_affected";i:1998;}i:5;a:3:{s:8:"sphinxql";s:35:"select * from hung order by @id asc";s:10:"total_rows";i:20;s:4:"rows";a:20:{i:0;a:5:{s:2:"id";s:1:"1";s:6:"weight";s:1:"1";s:3:"gid";s:4:"1000";s:4:"mva1";s:8:"989,1033";s:4:"mva2";s:4:"1033";}i:1;a:5:{s:2:"id";s:1:"2";s:6:"weight";s:1:"1";s:3:"gid";s:4:"2000";s:4:"mva1";s:9:"1989,2033";s:4:"mva2";s:4:"2033";}i:2;a:5:{s:2:"id";s:1:"3";s:6:"weight";s:1:"1";s:3:"gid";s:4:"3000";s:4:"mva1";s:5:"1,2,3";s:4:"mva2";s:4:"3033";}i:3;a:5:{s:2:"id";s:1:"4";s:6:"weight";s:1:"1";s:3:"gid";s:4:"4000";s:4:"mva1";s:5:"1,2,3";s:4:"mva2";s:4:"4033";}i:4;a:5:{s:2:"id";s:1:"5";s:6:"weight";s:1:"1";s:3:"gid";s:4:"5000";s:4:"mva1";s:5:"1,2,3";s:4:"mva2";s:4:"5033";}i:5;a:5:{s:2:"id";s:1:"6";s:6:"weight";s:1:"1";s:3:"gid";s:4:"6000";s:4:"mva1";s:5:"1,2,3";s:4:"mva2";s:4:"6033";}i:6;a:5:{s:2:"id";s:1:"7";s:6:"weight";s:1:"1";s:3:"gid";s:4:"7000";s:4:"mva1";s:5:"1,2,3";s:4:"mva2";s:4:"7033";}i:7;a:5:{s:2:"id";s:1:"8";s:6:"weight";s:1:"1";s:3:"gid";s:4:"8000";s:4:"mva1";s:5:"1,2,3";s:4:"mva2";s:4:"8033";}i:8;a:5:{s:2:"id";s:1:"9";s:6:"weight";s:1:"1";s:3:"gid";s:4:"9000";s:4:"mva1";s:5:"1,2,3";s:4:"mva2";s:4:"9033";}i:9;a:5:{s:2:"id";s:2:"10";s:6:"weight";s:1:"1";s:3:"gid";s:5:"10000";s:4:"mva1";s:5:"1,2,3";s:4:"mva2";s:5:"10033";}i:10;a:5:{s:2:"id";s:2:"11";s:6:"weight";s:1:"1";s:3:"gid";s:5:"11000";s:4:"mva1";s:5:"1,2,3";s:4:"mva2";s:5:"11033";}i:11;a:5:{s:2:"id";s:2:"12";s:6:"weight";s:1:"1";s:3:"gid";s:5:"12000";s:4:"mva1";s:5:"1,2,3";s:4:"mva2";s:5:"12033";}i:12;a:5:{s:2:"id";s:2:"13";s:6:"weight";s:1:"1";s:3:"gid";s:5:"13000";s:4:"mva1";s:5:"1,2,3";s:4:"mva2";s:5:"13033";}i:13;a:5:{s:2:"id";s:2:"14";s:6:"weight";s:1:"1";s:3:"gid";s:5:"14000";s:4:"mva1";s:5:"1,2,3";s:4:"mva2";s:5:"14033";}i:14;a:5:{s:2:"id";s:2:"15";s:6:"weight";s:1:"1";s:3:"gid";s:5:"15000";s:4:"mva1";s:5:"1,2,3";s:4:"mva2";s:5:"15033";}i:15;a:5:{s:2:"id";s:2:"16";s:6:"weight";s:1:"1";s:3:"gid";s:5:"16000";s:4:"mva1";s:5:"1,2,3";s:4:"mva2";s:5:"16033";}i:16;a:5:{s:2:"id";s:2:"17";s:6:"weight";s:1:"1";s:3:"gid";s:5:"17000";s:4:"mva1";s:5:"1,2,3";s:4:"mva2";s:5:"17033";}i:17;a:5:{s:2:"id";s:2:"18";s:6:"weight";s:1:"1";s:3:"gid";s:5:"18000";s:4:"mva1";s:5:"1,2,3";s:4:"mva2";s:5:"18033";}i:18;a:5:{s:2:"id";s:2:"19";s:6:"weight";s:1:"1";s:3:"gid";s:5:"19000";s:4:"mva1";s:5:"1,2,3";s:4:"mva2";s:5:"19033";}i:19;a:5:{s:2:"id";s:2:"20";s:6:"weight";s:1:"1";s:3:"gid";s:5:"20000";s:4:"mva1";s:5:"1,2,3";s:4:"mva2";s:5:"20033";}}}}i:1;a:6:{i:0;a:36:{i:0;s:11:"iteration=0";i:1;s:7:"up.ok=2";i:2;s:10:"started=ok";i:3;s:11:"iteration=1";i:4;s:7:"up.ok=2";i:5;s:10:"started=ok";i:6;s:11:"iteration=2";i:7;s:7:"up.ok=2";i:8;s:10:"started=ok";i:9;s:11:"iteration=3";i:10;s:7:"up.ok=2";i:11;s:10:"started=ok";i:12;s:45:"select * from rt_mva order by id desc limit 3";i:13;s:34:"id = 16000 weight = 1 mva = 16000 ";i:14;s:34:"id = 15999 weight = 1 mva = 15999 ";i:15;s:34:"id = 15998 weight = 1 mva = 15998 ";i:16;s:9:"show meta";i:17;s:12:"total = 1000";i:18;s:19:"total_found = 16000";i:19;s:60:"select * from rt_mva where mva<17000 order by id asc limit 3";i:20;s:26:"id = 1 weight = 1 mva = 1 ";i:21;s:26:"id = 2 weight = 1 mva = 2 ";i:22;s:26:"id = 3 weight = 1 mva = 3 ";i:23;s:9:"show meta";i:24;s:12:"total = 1000";i:25;s:19:"total_found = 16000";i:26;s:59:"replace into rt_mva (id, text, mva) values ( 1, ' ', 333 )";i:27;s:63:"1064; raw 1, column 3: non-MVA value specified for a MVA column";i:28;s:58:"replace into rt_mva (id, text, mva) values ( 2, ' ', () )";i:29;s:44:"select * from rt_mva order by id asc limit 3";i:30;s:26:"id = 1 weight = 1 mva = 1 ";i:31;s:25:"id = 2 weight = 1 mva = ";i:32;s:26:"id = 3 weight = 1 mva = 3 ";i:33;s:9:"show meta";i:34;s:12:"total = 1000";i:35;s:19:"total_found = 16000";}i:1;a:3:{s:8:"sphinxql";s:38:"select * from idx where match('test3')";s:10:"total_rows";i:1;s:4:"rows";a:1:{i:0;a:4:{s:2:"id";s:1:"3";s:6:"weight";s:4:"1695";s:7:"section";s:3:"103";s:4:"mva1";s:5:"6,7,8";}}}i:2;a:3:{s:8:"sphinxql";s:16:"select * from rt";s:10:"total_rows";i:2;s:4:"rows";a:2:{i:0;a:5:{s:2:"id";s:1:"1";s:6:"weight";s:1:"1";s:3:"gid";s:4:"3212";s:4:"mva1";s:5:"1,2,3";s:4:"mva2";s:5:"3,4,5";}i:1;a:5:{s:2:"id";s:1:"3";s:6:"weight";s:1:"1";s:3:"gid";s:2:"33";s:4:"mva1";s:1:"3";s:4:"mva2";s:1:"3";}}}i:3;a:3:{s:8:"sphinxql";s:17:"select * from idx";s:10:"total_rows";i:4;s:4:"rows";a:4:{i:0;a:4:{s:2:"id";s:1:"1";s:6:"weight";s:1:"1";s:7:"section";s:3:"101";s:4:"mva1";s:3:"1,2";}i:1;a:4:{s:2:"id";s:1:"2";s:6:"weight";s:1:"1";s:7:"section";s:3:"102";s:4:"mva1";s:14:"1002,1023,4456";}i:2;a:4:{s:2:"id";s:1:"3";s:6:"weight";s:1:"1";s:7:"section";s:3:"103";s:4:"mva1";s:5:"6,7,8";}i:3;a:4:{s:2:"id";s:1:"4";s:6:"weight";s:1:"1";s:7:"section";s:3:"104";s:4:"mva1";s:14:"1004,1005,1006";}}}i:4;a:2:{s:8:"sphinxql";s:43:"update hung set mva1=(3,2, 1, 2) where id>2";s:14:"total_affected";i:1998;}i:5;a:3:{s:8:"sphinxql";s:35:"select * from hung order by @id asc";s:10:"total_rows";i:20;s:4:"rows";a:20:{i:0;a:5:{s:2:"id";s:1:"1";s:6:"weight";s:1:"1";s:3:"gid";s:4:"1000";s:4:"mva1";s:8:"989,1033";s:4:"mva2";s:4:"1033";}i:1;a:5:{s:2:"id";s:1:"2";s:6:"weight";s:1:"1";s:3:"gid";s:4:"2000";s:4:"mva1";s:9:"1989,2033";s:4:"mva2";s:4:"2033";}i:2;a:5:{s:2:"id";s:1:"3";s:6:"weight";s:1:"1";s:3:"gid";s:4:"3000";s:4:"mva1";s:5:"1,2,3";s:4:"mva2";s:4:"3033";}i:3;a:5:{s:2:"id";s:1:"4";s:6:"weight";s:1:"1";s:3:"gid";s:4:"4000";s:4:"mva1";s:5:"1,2,3";s:4:"mva2";s:4:"4033";}i:4;a:5:{s:2:"id";s:1:"5";s:6:"weight";s:1:"1";s:3:"gid";s:4:"5000";s:4:"mva1";s:5:"1,2,3";s:4:"mva2";s:4:"5033";}i:5;a:5:{s:2:"id";s:1:"6";s:6:"weight";s:1:"1";s:3:"gid";s:4:"6000";s:4:"mva1";s:5:"1,2,3";s:4:"mva2";s:4:"6033";}i:6;a:5:{s:2:"id";s:1:"7";s:6:"weight";s:1:"1";s:3:"gid";s:4:"7000";s:4:"mva1";s:5:"1,2,3";s:4:"mva2";s:4:"7033";}i:7;a:5:{s:2:"id";s:1:"8";s:6:"weight";s:1:"1";s:3:"gid";s:4:"8000";s:4:"mva1";s:5:"1,2,3";s:4:"mva2";s:4:"8033";}i:8;a:5:{s:2:"id";s:1:"9";s:6:"weight";s:1:"1";s:3:"gid";s:4:"9000";s:4:"mva1";s:5:"1,2,3";s:4:"mva2";s:4:"9033";}i:9;a:5:{s:2:"id";s:2:"10";s:6:"weight";s:1:"1";s:3:"gid";s:5:"10000";s:4:"mva1";s:5:"1,2,3";s:4:"mva2";s:5:"10033";}i:10;a:5:{s:2:"id";s:2:"11";s:6:"weight";s:1:"1";s:3:"gid";s:5:"11000";s:4:"mva1";s:5:"1,2,3";s:4:"mva2";s:5:"11033";}i:11;a:5:{s:2:"id";s:2:"12";s:6:"weight";s:1:"1";s:3:"gid";s:5:"12000";s:4:"mva1";s:5:"1,2,3";s:4:"mva2";s:5:"12033";}i:12;a:5:{s:2:"id";s:2:"13";s:6:"weight";s:1:"1";s:3:"gid";s:5:"13000";s:4:"mva1";s:5:"1,2,3";s:4:"mva2";s:5:"13033";}i:13;a:5:{s:2:"id";s:2:"14";s:6:"weight";s:1:"1";s:3:"gid";s:5:"14000";s:4:"mva1";s:5:"1,2,3";s:4:"mva2";s:5:"14033";}i:14;a:5:{s:2:"id";s:2:"15";s:6:"weight";s:1:"1";s:3:"gid";s:5:"15000";s:4:"mva1";s:5:"1,2,3";s:4:"mva2";s:5:"15033";}i:15;a:5:{s:2:"id";s:2:"16";s:6:"weight";s:1:"1";s:3:"gid";s:5:"16000";s:4:"mva1";s:5:"1,2,3";s:4:"mva2";s:5:"16033";}i:16;a:5:{s:2:"id";s:2:"17";s:6:"weight";s:1:"1";s:3:"gid";s:5:"17000";s:4:"mva1";s:5:"1,2,3";s:4:"mva2";s:5:"17033";}i:17;a:5:{s:2:"id";s:2:"18";s:6:"weight";s:1:"1";s:3:"gid";s:5:"18000";s:4:"mva1";s:5:"1,2,3";s:4:"mva2";s:5:"18033";}i:18;a:5:{s:2:"id";s:2:"19";s:6:"weight";s:1:"1";s:3:"gid";s:5:"19000";s:4:"mva1";s:5:"1,2,3";s:4:"mva2";s:5:"19033";}i:19;a:5:{s:2:"id";s:2:"20";s:6:"weight";s:1:"1";s:3:"gid";s:5:"20000";s:4:"mva1";s:5:"1,2,3";s:4:"mva2";s:5:"20033";}}}}} \ No newline at end of file diff -Nru sphinxsearch-0.9.9+2.0.2beta/test/test_132/test.xml sphinxsearch-2.0.4/test/test_132/test.xml --- sphinxsearch-0.9.9+2.0.2beta/test/test_132/test.xml 2011-11-14 13:27:43.000000000 +0000 +++ sphinxsearch-2.0.4/test/test_132/test.xml 2011-12-20 13:17:09.000000000 +0000 @@ -64,12 +64,59 @@ rt_attr_multi = mva2 } +index rt_mva +{ + type = rt + path = /rt_mva + charset_type = utf-8 + docinfo = extern + rt_mem_limit = 128k + + rt_field = text + rt_attr_multi = mva +} + $v ) + { + $line .= $k . " = " . $v . "\t"; + } + $results[] = $line; + } else + { + $results[] = $row["Variable_name"] . " = " . $row["Value"]; + } + } + @mysql_free_result ( $res ); + } + + return $results; +'); + global $sd_address, $sd_sphinxql_port; $sockStr = "$sd_address:$sd_sphinxql_port"; if ($sd_address == "localhost") @@ -139,6 +186,48 @@ $results[] = 'i=$i' . @mysql_error(); } @mysql_close($sock); + +// regression that rt dumps MVA to plain index wrong way +$sock = @mysql_connect ($sockStr,'','', true ); +if ( $sock === false ) +{ + $results[] = "error: can't connect to searchd: " . @mysql_errno ( $sock ) . " : " . @mysql_error ( $sock ); + return; +} + +$q = "INSERT INTO rt_mva (id, text, mva) VALUES "; +for ( $i = 1; $i <= 16000; $i++) +{ + $q .= "( $i, ' ', ($i) )"; + if ( ( $i%100 )!=0 ) + $q.= ","; + + if ( ( $i%100 )==0 ) + { + @mysql_query ( $q ); + $q = "INSERT INTO rt_mva (id, text, mva) VALUES "; + } + if ( @mysql_error() ) + $results[] = 'i=$i' . @mysql_error(); +} + +$results = array_merge ( $results, $query ( "select * from rt_mva order by id desc limit 3", $sock ) ); +$results = array_merge ( $results, $query ( "show meta", $sock ) ); +$results = array_merge ( $results, $query ( "select * from rt_mva where mva<17000 order by id asc limit 3", $sock ) ); +$results = array_merge ( $results, $query ( "show meta", $sock ) ); + +// regressions: +// crash on INSERT .. ( id, text, mva ) values ( 1, '', 15 ) +// invalid syntax INSERT .. ( id, text, mva ) values ( 1, '', () ) + +$results = array_merge ( $results, $query ( "replace into rt_mva (id, text, mva) values ( 1, ' ', 333 )", $sock ) ); +$results = array_merge ( $results, $query ( "replace into rt_mva (id, text, mva) values ( 2, ' ', () )", $sock ) ); +$results = array_merge ( $results, $query ( "select * from rt_mva order by id asc limit 3", $sock ) ); +$results = array_merge ( $results, $query ( "show meta", $sock ) ); + +@mysql_close($sock); + + ]]> diff -Nru sphinxsearch-0.9.9+2.0.2beta/test/test_133/model.bin sphinxsearch-2.0.4/test/test_133/model.bin --- sphinxsearch-0.9.9+2.0.2beta/test/test_133/model.bin 2011-02-23 23:37:41.000000000 +0000 +++ sphinxsearch-2.0.4/test/test_133/model.bin 2012-02-20 15:08:34.000000000 +0000 @@ -1 +1 @@ -a:4:{i:0;a:19:{i:0;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:7:"matches";a:3:{i:2;a:2:{s:6:"weight";s:4:"2590";s:5:"attrs";a:1:{s:3:"gid";s:1:"1";}}i:3;a:2:{s:6:"weight";s:4:"2590";s:5:"attrs";a:1:{s:3:"gid";s:1:"1";}}i:4;a:2:{s:6:"weight";s:4:"1590";s:5:"attrs";a:1:{s:3:"gid";s:1:"1";}}}s:5:"total";s:1:"3";s:11:"total_found";s:1:"3";s:4:"time";s:5:"0.001";s:5:"words";a:2:{s:3:"one";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:1:"6";}s:3:"two";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:1:"4";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:16:"one SENTENCE two";}i:1;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:7:"matches";a:3:{i:2;a:2:{s:6:"weight";s:4:"3590";s:5:"attrs";a:1:{s:3:"gid";s:1:"1";}}i:3;a:2:{s:6:"weight";s:4:"2590";s:5:"attrs";a:1:{s:3:"gid";s:1:"1";}}i:4;a:2:{s:6:"weight";s:4:"2590";s:5:"attrs";a:1:{s:3:"gid";s:1:"1";}}}s:5:"total";s:1:"3";s:11:"total_found";s:1:"3";s:4:"time";s:5:"0.001";s:5:"words";a:3:{s:3:"one";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:1:"6";}s:3:"two";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:1:"4";}s:5:"three";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:1:"4";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:22:"one SENTENCE two three";}i:2;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:7:"matches";a:2:{i:2;a:2:{s:6:"weight";s:4:"3590";s:5:"attrs";a:1:{s:3:"gid";s:1:"1";}}i:4;a:2:{s:6:"weight";s:4:"2590";s:5:"attrs";a:1:{s:3:"gid";s:1:"1";}}}s:5:"total";s:1:"2";s:11:"total_found";s:1:"2";s:4:"time";s:5:"0.001";s:5:"words";a:3:{s:3:"one";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:1:"6";}s:3:"two";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:1:"4";}s:5:"three";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:1:"4";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:31:"one SENTENCE two SENTENCE three";}i:3;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:7:"matches";a:1:{i:2;a:2:{s:6:"weight";s:4:"2590";s:5:"attrs";a:1:{s:3:"gid";s:1:"1";}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.001";s:5:"words";a:3:{s:3:"one";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:1:"6";}s:3:"two";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:1:"4";}s:5:"three";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:1:"4";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:24:""one two" SENTENCE three";}i:4;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:7:"matches";a:2:{i:5;a:2:{s:6:"weight";s:4:"2849";s:5:"attrs";a:1:{s:3:"gid";s:1:"1";}}i:6;a:2:{s:6:"weight";s:4:"1771";s:5:"attrs";a:1:{s:3:"gid";s:1:"1";}}}s:5:"total";s:1:"2";s:11:"total_found";s:1:"2";s:4:"time";s:5:"0.001";s:5:"words";a:2:{s:3:"zam";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:3:"349";}s:3:"ram";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:3:"175";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:16:"zam SENTENCE ram";}i:5;a:12:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:5:"total";s:1:"0";s:11:"total_found";s:1:"0";s:4:"time";s:5:"0.001";s:5:"words";a:2:{s:3:"fox";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}s:3:"dog";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:17:"fox PARAGRAPH dog";}i:6;a:12:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:5:"total";s:1:"0";s:11:"total_found";s:1:"0";s:4:"time";s:5:"0.001";s:5:"words";a:2:{s:8:"sentence";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}s:9:"paragraph";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:27:"sentence SENTENCE paragraph";}i:7;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:7:"matches";a:1:{i:101;a:2:{s:6:"weight";s:4:"1721";s:5:"attrs";a:1:{s:3:"gid";s:1:"2";}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.000";s:5:"words";a:2:{s:8:"sentence";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}s:9:"paragraph";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:28:"sentence PARAGRAPH paragraph";}i:8;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:7:"matches";a:1:{i:200;a:2:{s:6:"weight";s:4:"1721";s:5:"attrs";a:1:{s:3:"gid";s:1:"3";}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.001";s:5:"words";a:1:{s:6:"walrus";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:17:"ZONE:zoneA walrus";}i:9;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:7:"matches";a:1:{i:200;a:2:{s:6:"weight";s:4:"1721";s:5:"attrs";a:1:{s:3:"gid";s:1:"3";}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.001";s:5:"words";a:1:{s:6:"walrus";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:17:"ZONE:zoneB walrus";}i:10;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:7:"matches";a:1:{i:200;a:2:{s:6:"weight";s:4:"1721";s:5:"attrs";a:1:{s:3:"gid";s:1:"3";}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.001";s:5:"words";a:2:{s:6:"walrus";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}s:4:"time";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:22:"ZONE:zoneA walrus time";}i:11;a:12:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:5:"total";s:1:"0";s:11:"total_found";s:1:"0";s:4:"time";s:5:"0.001";s:5:"words";a:2:{s:6:"walrus";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}s:4:"time";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:22:"ZONE:zoneB walrus time";}i:12;a:12:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:5:"total";s:1:"0";s:11:"total_found";s:1:"0";s:4:"time";s:5:"0.001";s:5:"words";a:3:{s:8:"cabbages";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}s:3:"and";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:2:"11";}s:5:"kings";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:29:"ZONE:zoneC cabbages and kings";}i:13;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:7:"matches";a:1:{i:201;a:2:{s:6:"weight";s:4:"2695";s:5:"attrs";a:1:{s:3:"gid";s:1:"3";}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.001";s:5:"words";a:3:{s:5:"kings";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}s:3:"and";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:2:"11";}s:5:"ships";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:26:"ZONE:zoneC kings and ships";}i:14;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:7:"matches";a:1:{i:202;a:2:{s:6:"weight";s:4:"1624";s:5:"attrs";a:1:{s:3:"gid";s:1:"3";}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.001";s:5:"words";a:2:{s:5:"sweet";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:1:"4";}s:8:"disagree";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"2";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:33:"ZONE:(zoneA,zoneB) sweet disagree";}i:15;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:7:"matches";a:2:{i:202;a:2:{s:6:"weight";s:4:"3636";s:5:"attrs";a:1:{s:3:"gid";s:1:"3";}}i:300;a:2:{s:6:"weight";s:4:"3636";s:5:"attrs";a:1:{s:3:"gid";s:1:"4";}}}s:5:"total";s:1:"2";s:11:"total_found";s:1:"2";s:4:"time";s:5:"0.001";s:5:"words";a:3:{s:3:"who";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"2";}s:2:"am";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"2";}s:1:"i";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:1:"4";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:10:""Who am I"";}i:16;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:7:"matches";a:4:{i:310;a:2:{s:6:"weight";s:4:"2572";s:5:"attrs";a:1:{s:3:"gid";s:1:"4";}}i:311;a:2:{s:6:"weight";s:4:"2572";s:5:"attrs";a:1:{s:3:"gid";s:1:"4";}}i:202;a:2:{s:6:"weight";s:4:"2555";s:5:"attrs";a:1:{s:3:"gid";s:1:"3";}}i:300;a:2:{s:6:"weight";s:4:"2555";s:5:"attrs";a:1:{s:3:"gid";s:1:"4";}}}s:5:"total";s:1:"4";s:11:"total_found";s:1:"4";s:4:"time";s:5:"0.001";s:5:"words";a:2:{s:2:"of";a:2:{s:4:"docs";s:1:"7";s:4:"hits";s:1:"8";}s:4:"this";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:1:"6";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:9:""of this"";}i:17;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:7:"matches";a:2:{i:310;a:2:{s:6:"weight";s:4:"2622";s:5:"attrs";a:1:{s:3:"gid";s:1:"4";}}i:311;a:2:{s:6:"weight";s:4:"2622";s:5:"attrs";a:1:{s:3:"gid";s:1:"4";}}}s:5:"total";s:1:"2";s:11:"total_found";s:1:"2";s:4:"time";s:5:"0.001";s:5:"words";a:2:{s:4:"like";a:2:{s:4:"docs";s:1:"3";s:4:"hits";s:1:"5";}s:4:"this";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:1:"6";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:22:"ZONE:zoneA "like this"";}i:18;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:7:"matches";a:1:{i:400;a:2:{s:6:"weight";s:4:"1721";s:5:"attrs";a:1:{s:3:"gid";s:1:"5";}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:7:"strikes";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:7:"strikes";}}i:1;a:19:{i:0;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:7:"matches";a:3:{i:2;a:2:{s:6:"weight";s:4:"2590";s:5:"attrs";a:1:{s:3:"gid";s:1:"1";}}i:3;a:2:{s:6:"weight";s:4:"2590";s:5:"attrs";a:1:{s:3:"gid";s:1:"1";}}i:4;a:2:{s:6:"weight";s:4:"1590";s:5:"attrs";a:1:{s:3:"gid";s:1:"1";}}}s:5:"total";s:1:"3";s:11:"total_found";s:1:"3";s:4:"time";s:5:"0.001";s:5:"words";a:2:{s:3:"one";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:1:"6";}s:3:"two";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:1:"4";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:16:"one SENTENCE two";}i:1;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:7:"matches";a:3:{i:2;a:2:{s:6:"weight";s:4:"3590";s:5:"attrs";a:1:{s:3:"gid";s:1:"1";}}i:3;a:2:{s:6:"weight";s:4:"2590";s:5:"attrs";a:1:{s:3:"gid";s:1:"1";}}i:4;a:2:{s:6:"weight";s:4:"2590";s:5:"attrs";a:1:{s:3:"gid";s:1:"1";}}}s:5:"total";s:1:"3";s:11:"total_found";s:1:"3";s:4:"time";s:5:"0.001";s:5:"words";a:3:{s:3:"one";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:1:"6";}s:3:"two";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:1:"4";}s:5:"three";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:1:"4";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:22:"one SENTENCE two three";}i:2;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:7:"matches";a:2:{i:2;a:2:{s:6:"weight";s:4:"3590";s:5:"attrs";a:1:{s:3:"gid";s:1:"1";}}i:4;a:2:{s:6:"weight";s:4:"2590";s:5:"attrs";a:1:{s:3:"gid";s:1:"1";}}}s:5:"total";s:1:"2";s:11:"total_found";s:1:"2";s:4:"time";s:5:"0.001";s:5:"words";a:3:{s:3:"one";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:1:"6";}s:3:"two";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:1:"4";}s:5:"three";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:1:"4";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:31:"one SENTENCE two SENTENCE three";}i:3;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:7:"matches";a:1:{i:2;a:2:{s:6:"weight";s:4:"2590";s:5:"attrs";a:1:{s:3:"gid";s:1:"1";}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.001";s:5:"words";a:3:{s:3:"one";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:1:"6";}s:3:"two";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:1:"4";}s:5:"three";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:1:"4";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:24:""one two" SENTENCE three";}i:4;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:7:"matches";a:2:{i:5;a:2:{s:6:"weight";s:4:"2849";s:5:"attrs";a:1:{s:3:"gid";s:1:"1";}}i:6;a:2:{s:6:"weight";s:4:"1771";s:5:"attrs";a:1:{s:3:"gid";s:1:"1";}}}s:5:"total";s:1:"2";s:11:"total_found";s:1:"2";s:4:"time";s:5:"0.001";s:5:"words";a:2:{s:3:"zam";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:3:"349";}s:3:"ram";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:3:"175";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:16:"zam SENTENCE ram";}i:5;a:12:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:5:"total";s:1:"0";s:11:"total_found";s:1:"0";s:4:"time";s:5:"0.001";s:5:"words";a:2:{s:3:"fox";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}s:3:"dog";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:17:"fox PARAGRAPH dog";}i:6;a:12:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:5:"total";s:1:"0";s:11:"total_found";s:1:"0";s:4:"time";s:5:"0.001";s:5:"words";a:2:{s:8:"sentence";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}s:9:"paragraph";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:27:"sentence SENTENCE paragraph";}i:7;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:7:"matches";a:1:{i:101;a:2:{s:6:"weight";s:4:"1721";s:5:"attrs";a:1:{s:3:"gid";s:1:"2";}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.001";s:5:"words";a:2:{s:8:"sentence";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}s:9:"paragraph";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:28:"sentence PARAGRAPH paragraph";}i:8;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:7:"matches";a:1:{i:200;a:2:{s:6:"weight";s:4:"1721";s:5:"attrs";a:1:{s:3:"gid";s:1:"3";}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.001";s:5:"words";a:1:{s:6:"walrus";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:17:"ZONE:zoneA walrus";}i:9;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:7:"matches";a:1:{i:200;a:2:{s:6:"weight";s:4:"1721";s:5:"attrs";a:1:{s:3:"gid";s:1:"3";}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.001";s:5:"words";a:1:{s:6:"walrus";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:17:"ZONE:zoneB walrus";}i:10;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:7:"matches";a:1:{i:200;a:2:{s:6:"weight";s:4:"1721";s:5:"attrs";a:1:{s:3:"gid";s:1:"3";}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.001";s:5:"words";a:2:{s:6:"walrus";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}s:4:"time";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:22:"ZONE:zoneA walrus time";}i:11;a:12:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:5:"total";s:1:"0";s:11:"total_found";s:1:"0";s:4:"time";s:5:"0.001";s:5:"words";a:2:{s:6:"walrus";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}s:4:"time";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:22:"ZONE:zoneB walrus time";}i:12;a:12:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:5:"total";s:1:"0";s:11:"total_found";s:1:"0";s:4:"time";s:5:"0.001";s:5:"words";a:3:{s:8:"cabbages";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}s:3:"and";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:2:"11";}s:5:"kings";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:29:"ZONE:zoneC cabbages and kings";}i:13;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:7:"matches";a:1:{i:201;a:2:{s:6:"weight";s:4:"2695";s:5:"attrs";a:1:{s:3:"gid";s:1:"3";}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.001";s:5:"words";a:3:{s:5:"kings";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}s:3:"and";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:2:"11";}s:5:"ships";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:26:"ZONE:zoneC kings and ships";}i:14;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:7:"matches";a:1:{i:202;a:2:{s:6:"weight";s:4:"1624";s:5:"attrs";a:1:{s:3:"gid";s:1:"3";}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.001";s:5:"words";a:2:{s:5:"sweet";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:1:"4";}s:8:"disagree";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"2";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:33:"ZONE:(zoneA,zoneB) sweet disagree";}i:15;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:7:"matches";a:2:{i:202;a:2:{s:6:"weight";s:4:"3636";s:5:"attrs";a:1:{s:3:"gid";s:1:"3";}}i:300;a:2:{s:6:"weight";s:4:"3636";s:5:"attrs";a:1:{s:3:"gid";s:1:"4";}}}s:5:"total";s:1:"2";s:11:"total_found";s:1:"2";s:4:"time";s:5:"0.001";s:5:"words";a:3:{s:3:"who";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"2";}s:2:"am";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"2";}s:1:"i";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:1:"4";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:10:""Who am I"";}i:16;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:7:"matches";a:4:{i:310;a:2:{s:6:"weight";s:4:"2572";s:5:"attrs";a:1:{s:3:"gid";s:1:"4";}}i:311;a:2:{s:6:"weight";s:4:"2572";s:5:"attrs";a:1:{s:3:"gid";s:1:"4";}}i:202;a:2:{s:6:"weight";s:4:"2555";s:5:"attrs";a:1:{s:3:"gid";s:1:"3";}}i:300;a:2:{s:6:"weight";s:4:"2555";s:5:"attrs";a:1:{s:3:"gid";s:1:"4";}}}s:5:"total";s:1:"4";s:11:"total_found";s:1:"4";s:4:"time";s:5:"0.001";s:5:"words";a:2:{s:2:"of";a:2:{s:4:"docs";s:1:"7";s:4:"hits";s:1:"8";}s:4:"this";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:1:"6";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:9:""of this"";}i:17;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:7:"matches";a:2:{i:310;a:2:{s:6:"weight";s:4:"2622";s:5:"attrs";a:1:{s:3:"gid";s:1:"4";}}i:311;a:2:{s:6:"weight";s:4:"2622";s:5:"attrs";a:1:{s:3:"gid";s:1:"4";}}}s:5:"total";s:1:"2";s:11:"total_found";s:1:"2";s:4:"time";s:5:"0.001";s:5:"words";a:2:{s:4:"like";a:2:{s:4:"docs";s:1:"3";s:4:"hits";s:1:"5";}s:4:"this";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:1:"6";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:22:"ZONE:zoneA "like this"";}i:18;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:7:"matches";a:1:{i:400;a:2:{s:6:"weight";s:4:"1721";s:5:"attrs";a:1:{s:3:"gid";s:1:"5";}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:7:"strikes";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:7:"strikes";}}i:2;a:19:{i:0;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:7:"matches";a:3:{i:2;a:2:{s:6:"weight";s:4:"2590";s:5:"attrs";a:1:{s:3:"gid";s:1:"1";}}i:3;a:2:{s:6:"weight";s:4:"2590";s:5:"attrs";a:1:{s:3:"gid";s:1:"1";}}i:4;a:2:{s:6:"weight";s:4:"1590";s:5:"attrs";a:1:{s:3:"gid";s:1:"1";}}}s:5:"total";s:1:"3";s:11:"total_found";s:1:"3";s:4:"time";s:5:"0.001";s:5:"words";a:2:{s:3:"one";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:1:"6";}s:3:"two";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:1:"4";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:16:"one SENTENCE two";}i:1;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:7:"matches";a:3:{i:2;a:2:{s:6:"weight";s:4:"3590";s:5:"attrs";a:1:{s:3:"gid";s:1:"1";}}i:3;a:2:{s:6:"weight";s:4:"2590";s:5:"attrs";a:1:{s:3:"gid";s:1:"1";}}i:4;a:2:{s:6:"weight";s:4:"2590";s:5:"attrs";a:1:{s:3:"gid";s:1:"1";}}}s:5:"total";s:1:"3";s:11:"total_found";s:1:"3";s:4:"time";s:5:"0.001";s:5:"words";a:3:{s:3:"one";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:1:"6";}s:3:"two";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:1:"4";}s:5:"three";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:1:"4";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:22:"one SENTENCE two three";}i:2;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:7:"matches";a:2:{i:2;a:2:{s:6:"weight";s:4:"3590";s:5:"attrs";a:1:{s:3:"gid";s:1:"1";}}i:4;a:2:{s:6:"weight";s:4:"2590";s:5:"attrs";a:1:{s:3:"gid";s:1:"1";}}}s:5:"total";s:1:"2";s:11:"total_found";s:1:"2";s:4:"time";s:5:"0.001";s:5:"words";a:3:{s:3:"one";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:1:"6";}s:3:"two";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:1:"4";}s:5:"three";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:1:"4";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:31:"one SENTENCE two SENTENCE three";}i:3;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:7:"matches";a:1:{i:2;a:2:{s:6:"weight";s:4:"2590";s:5:"attrs";a:1:{s:3:"gid";s:1:"1";}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.001";s:5:"words";a:3:{s:3:"one";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:1:"6";}s:3:"two";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:1:"4";}s:5:"three";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:1:"4";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:24:""one two" SENTENCE three";}i:4;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:7:"matches";a:2:{i:5;a:2:{s:6:"weight";s:4:"2849";s:5:"attrs";a:1:{s:3:"gid";s:1:"1";}}i:6;a:2:{s:6:"weight";s:4:"1771";s:5:"attrs";a:1:{s:3:"gid";s:1:"1";}}}s:5:"total";s:1:"2";s:11:"total_found";s:1:"2";s:4:"time";s:5:"0.001";s:5:"words";a:2:{s:3:"zam";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:3:"349";}s:3:"ram";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:3:"175";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:16:"zam SENTENCE ram";}i:5;a:12:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:5:"total";s:1:"0";s:11:"total_found";s:1:"0";s:4:"time";s:5:"0.001";s:5:"words";a:2:{s:3:"fox";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}s:3:"dog";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:17:"fox PARAGRAPH dog";}i:6;a:12:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:5:"total";s:1:"0";s:11:"total_found";s:1:"0";s:4:"time";s:5:"0.001";s:5:"words";a:2:{s:8:"sentence";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}s:9:"paragraph";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:27:"sentence SENTENCE paragraph";}i:7;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:7:"matches";a:1:{i:101;a:2:{s:6:"weight";s:4:"1721";s:5:"attrs";a:1:{s:3:"gid";s:1:"2";}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.001";s:5:"words";a:2:{s:8:"sentence";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}s:9:"paragraph";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:28:"sentence PARAGRAPH paragraph";}i:8;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:7:"matches";a:1:{i:200;a:2:{s:6:"weight";s:4:"1721";s:5:"attrs";a:1:{s:3:"gid";s:1:"3";}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.001";s:5:"words";a:1:{s:6:"walrus";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:17:"ZONE:zoneA walrus";}i:9;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:7:"matches";a:1:{i:200;a:2:{s:6:"weight";s:4:"1721";s:5:"attrs";a:1:{s:3:"gid";s:1:"3";}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.001";s:5:"words";a:1:{s:6:"walrus";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:17:"ZONE:zoneB walrus";}i:10;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:7:"matches";a:1:{i:200;a:2:{s:6:"weight";s:4:"1721";s:5:"attrs";a:1:{s:3:"gid";s:1:"3";}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.001";s:5:"words";a:2:{s:6:"walrus";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}s:4:"time";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:22:"ZONE:zoneA walrus time";}i:11;a:12:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:5:"total";s:1:"0";s:11:"total_found";s:1:"0";s:4:"time";s:5:"0.001";s:5:"words";a:2:{s:6:"walrus";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}s:4:"time";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:22:"ZONE:zoneB walrus time";}i:12;a:12:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:5:"total";s:1:"0";s:11:"total_found";s:1:"0";s:4:"time";s:5:"0.001";s:5:"words";a:3:{s:8:"cabbages";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}s:3:"and";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:2:"11";}s:5:"kings";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:29:"ZONE:zoneC cabbages and kings";}i:13;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:7:"matches";a:1:{i:201;a:2:{s:6:"weight";s:4:"2695";s:5:"attrs";a:1:{s:3:"gid";s:1:"3";}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.001";s:5:"words";a:3:{s:5:"kings";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}s:3:"and";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:2:"11";}s:5:"ships";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:26:"ZONE:zoneC kings and ships";}i:14;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:7:"matches";a:1:{i:202;a:2:{s:6:"weight";s:4:"1624";s:5:"attrs";a:1:{s:3:"gid";s:1:"3";}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.001";s:5:"words";a:2:{s:5:"sweet";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:1:"4";}s:8:"disagree";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"2";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:33:"ZONE:(zoneA,zoneB) sweet disagree";}i:15;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:7:"matches";a:2:{i:202;a:2:{s:6:"weight";s:4:"3636";s:5:"attrs";a:1:{s:3:"gid";s:1:"3";}}i:300;a:2:{s:6:"weight";s:4:"3636";s:5:"attrs";a:1:{s:3:"gid";s:1:"4";}}}s:5:"total";s:1:"2";s:11:"total_found";s:1:"2";s:4:"time";s:5:"0.001";s:5:"words";a:3:{s:3:"who";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"2";}s:2:"am";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"2";}s:1:"i";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:1:"4";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:10:""Who am I"";}i:16;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:7:"matches";a:4:{i:310;a:2:{s:6:"weight";s:4:"2572";s:5:"attrs";a:1:{s:3:"gid";s:1:"4";}}i:311;a:2:{s:6:"weight";s:4:"2572";s:5:"attrs";a:1:{s:3:"gid";s:1:"4";}}i:202;a:2:{s:6:"weight";s:4:"2555";s:5:"attrs";a:1:{s:3:"gid";s:1:"3";}}i:300;a:2:{s:6:"weight";s:4:"2555";s:5:"attrs";a:1:{s:3:"gid";s:1:"4";}}}s:5:"total";s:1:"4";s:11:"total_found";s:1:"4";s:4:"time";s:5:"0.001";s:5:"words";a:2:{s:2:"of";a:2:{s:4:"docs";s:1:"7";s:4:"hits";s:1:"8";}s:4:"this";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:1:"6";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:9:""of this"";}i:17;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:7:"matches";a:2:{i:310;a:2:{s:6:"weight";s:4:"2622";s:5:"attrs";a:1:{s:3:"gid";s:1:"4";}}i:311;a:2:{s:6:"weight";s:4:"2622";s:5:"attrs";a:1:{s:3:"gid";s:1:"4";}}}s:5:"total";s:1:"2";s:11:"total_found";s:1:"2";s:4:"time";s:5:"0.001";s:5:"words";a:2:{s:4:"like";a:2:{s:4:"docs";s:1:"3";s:4:"hits";s:1:"5";}s:4:"this";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:1:"6";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:22:"ZONE:zoneA "like this"";}i:18;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:7:"matches";a:1:{i:400;a:2:{s:6:"weight";s:4:"1721";s:5:"attrs";a:1:{s:3:"gid";s:1:"5";}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:7:"strikes";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:7:"strikes";}}i:3;a:19:{i:0;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:7:"matches";a:3:{i:2;a:2:{s:6:"weight";s:4:"2590";s:5:"attrs";a:1:{s:3:"gid";s:1:"1";}}i:3;a:2:{s:6:"weight";s:4:"2590";s:5:"attrs";a:1:{s:3:"gid";s:1:"1";}}i:4;a:2:{s:6:"weight";s:4:"1590";s:5:"attrs";a:1:{s:3:"gid";s:1:"1";}}}s:5:"total";s:1:"3";s:11:"total_found";s:1:"3";s:4:"time";s:5:"0.001";s:5:"words";a:2:{s:3:"one";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:1:"6";}s:3:"two";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:1:"4";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:16:"one SENTENCE two";}i:1;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:7:"matches";a:3:{i:2;a:2:{s:6:"weight";s:4:"3590";s:5:"attrs";a:1:{s:3:"gid";s:1:"1";}}i:3;a:2:{s:6:"weight";s:4:"2590";s:5:"attrs";a:1:{s:3:"gid";s:1:"1";}}i:4;a:2:{s:6:"weight";s:4:"2590";s:5:"attrs";a:1:{s:3:"gid";s:1:"1";}}}s:5:"total";s:1:"3";s:11:"total_found";s:1:"3";s:4:"time";s:5:"0.001";s:5:"words";a:3:{s:3:"one";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:1:"6";}s:3:"two";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:1:"4";}s:5:"three";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:1:"4";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:22:"one SENTENCE two three";}i:2;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:7:"matches";a:2:{i:2;a:2:{s:6:"weight";s:4:"3590";s:5:"attrs";a:1:{s:3:"gid";s:1:"1";}}i:4;a:2:{s:6:"weight";s:4:"2590";s:5:"attrs";a:1:{s:3:"gid";s:1:"1";}}}s:5:"total";s:1:"2";s:11:"total_found";s:1:"2";s:4:"time";s:5:"0.001";s:5:"words";a:3:{s:3:"one";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:1:"6";}s:3:"two";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:1:"4";}s:5:"three";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:1:"4";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:31:"one SENTENCE two SENTENCE three";}i:3;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:7:"matches";a:1:{i:2;a:2:{s:6:"weight";s:4:"2590";s:5:"attrs";a:1:{s:3:"gid";s:1:"1";}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.001";s:5:"words";a:3:{s:3:"one";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:1:"6";}s:3:"two";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:1:"4";}s:5:"three";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:1:"4";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:24:""one two" SENTENCE three";}i:4;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:7:"matches";a:2:{i:5;a:2:{s:6:"weight";s:4:"2849";s:5:"attrs";a:1:{s:3:"gid";s:1:"1";}}i:6;a:2:{s:6:"weight";s:4:"1771";s:5:"attrs";a:1:{s:3:"gid";s:1:"1";}}}s:5:"total";s:1:"2";s:11:"total_found";s:1:"2";s:4:"time";s:5:"0.001";s:5:"words";a:2:{s:3:"zam";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:3:"349";}s:3:"ram";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:3:"175";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:16:"zam SENTENCE ram";}i:5;a:12:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:5:"total";s:1:"0";s:11:"total_found";s:1:"0";s:4:"time";s:5:"0.001";s:5:"words";a:2:{s:3:"fox";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}s:3:"dog";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:17:"fox PARAGRAPH dog";}i:6;a:12:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:5:"total";s:1:"0";s:11:"total_found";s:1:"0";s:4:"time";s:5:"0.001";s:5:"words";a:2:{s:8:"sentence";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}s:9:"paragraph";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:27:"sentence SENTENCE paragraph";}i:7;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:7:"matches";a:1:{i:101;a:2:{s:6:"weight";s:4:"1721";s:5:"attrs";a:1:{s:3:"gid";s:1:"2";}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.001";s:5:"words";a:2:{s:8:"sentence";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}s:9:"paragraph";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:28:"sentence PARAGRAPH paragraph";}i:8;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:7:"matches";a:1:{i:200;a:2:{s:6:"weight";s:4:"1721";s:5:"attrs";a:1:{s:3:"gid";s:1:"3";}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.001";s:5:"words";a:1:{s:6:"walrus";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:17:"ZONE:zoneA walrus";}i:9;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:7:"matches";a:1:{i:200;a:2:{s:6:"weight";s:4:"1721";s:5:"attrs";a:1:{s:3:"gid";s:1:"3";}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.001";s:5:"words";a:1:{s:6:"walrus";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:17:"ZONE:zoneB walrus";}i:10;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:7:"matches";a:1:{i:200;a:2:{s:6:"weight";s:4:"1721";s:5:"attrs";a:1:{s:3:"gid";s:1:"3";}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.001";s:5:"words";a:2:{s:6:"walrus";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}s:4:"time";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:22:"ZONE:zoneA walrus time";}i:11;a:12:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:5:"total";s:1:"0";s:11:"total_found";s:1:"0";s:4:"time";s:5:"0.001";s:5:"words";a:2:{s:6:"walrus";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}s:4:"time";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:22:"ZONE:zoneB walrus time";}i:12;a:12:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:5:"total";s:1:"0";s:11:"total_found";s:1:"0";s:4:"time";s:5:"0.001";s:5:"words";a:3:{s:8:"cabbages";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}s:3:"and";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:2:"11";}s:5:"kings";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:29:"ZONE:zoneC cabbages and kings";}i:13;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:7:"matches";a:1:{i:201;a:2:{s:6:"weight";s:4:"2695";s:5:"attrs";a:1:{s:3:"gid";s:1:"3";}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.001";s:5:"words";a:3:{s:5:"kings";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}s:3:"and";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:2:"11";}s:5:"ships";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:26:"ZONE:zoneC kings and ships";}i:14;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:7:"matches";a:1:{i:202;a:2:{s:6:"weight";s:4:"1624";s:5:"attrs";a:1:{s:3:"gid";s:1:"3";}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.001";s:5:"words";a:2:{s:5:"sweet";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:1:"4";}s:8:"disagree";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"2";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:33:"ZONE:(zoneA,zoneB) sweet disagree";}i:15;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:7:"matches";a:2:{i:202;a:2:{s:6:"weight";s:4:"3636";s:5:"attrs";a:1:{s:3:"gid";s:1:"3";}}i:300;a:2:{s:6:"weight";s:4:"3636";s:5:"attrs";a:1:{s:3:"gid";s:1:"4";}}}s:5:"total";s:1:"2";s:11:"total_found";s:1:"2";s:4:"time";s:5:"0.001";s:5:"words";a:3:{s:3:"who";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"2";}s:2:"am";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"2";}s:1:"i";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:1:"4";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:10:""Who am I"";}i:16;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:7:"matches";a:4:{i:310;a:2:{s:6:"weight";s:4:"2572";s:5:"attrs";a:1:{s:3:"gid";s:1:"4";}}i:311;a:2:{s:6:"weight";s:4:"2572";s:5:"attrs";a:1:{s:3:"gid";s:1:"4";}}i:202;a:2:{s:6:"weight";s:4:"2555";s:5:"attrs";a:1:{s:3:"gid";s:1:"3";}}i:300;a:2:{s:6:"weight";s:4:"2555";s:5:"attrs";a:1:{s:3:"gid";s:1:"4";}}}s:5:"total";s:1:"4";s:11:"total_found";s:1:"4";s:4:"time";s:5:"0.001";s:5:"words";a:2:{s:2:"of";a:2:{s:4:"docs";s:1:"7";s:4:"hits";s:1:"8";}s:4:"this";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:1:"6";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:9:""of this"";}i:17;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:7:"matches";a:2:{i:310;a:2:{s:6:"weight";s:4:"2622";s:5:"attrs";a:1:{s:3:"gid";s:1:"4";}}i:311;a:2:{s:6:"weight";s:4:"2622";s:5:"attrs";a:1:{s:3:"gid";s:1:"4";}}}s:5:"total";s:1:"2";s:11:"total_found";s:1:"2";s:4:"time";s:5:"0.001";s:5:"words";a:2:{s:4:"like";a:2:{s:4:"docs";s:1:"3";s:4:"hits";s:1:"5";}s:4:"this";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:1:"6";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:22:"ZONE:zoneA "like this"";}i:18;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:7:"matches";a:1:{i:400;a:2:{s:6:"weight";s:4:"1721";s:5:"attrs";a:1:{s:3:"gid";s:1:"5";}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:7:"strikes";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:7:"strikes";}}} \ No newline at end of file +a:4:{i:0;a:19:{i:0;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:7:"matches";a:3:{i:2;a:2:{s:6:"weight";s:4:"2594";s:5:"attrs";a:1:{s:3:"gid";i:1;}}i:3;a:2:{s:6:"weight";s:4:"2594";s:5:"attrs";a:1:{s:3:"gid";i:1;}}i:4;a:2:{s:6:"weight";s:4:"1594";s:5:"attrs";a:1:{s:3:"gid";i:1;}}}s:5:"total";s:1:"3";s:11:"total_found";s:1:"3";s:4:"time";s:5:"0.001";s:5:"words";a:2:{s:3:"one";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:1:"6";}s:3:"two";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:1:"4";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:16:"one SENTENCE two";}i:1;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:7:"matches";a:3:{i:2;a:2:{s:6:"weight";s:4:"3594";s:5:"attrs";a:1:{s:3:"gid";i:1;}}i:3;a:2:{s:6:"weight";s:4:"2594";s:5:"attrs";a:1:{s:3:"gid";i:1;}}i:4;a:2:{s:6:"weight";s:4:"2594";s:5:"attrs";a:1:{s:3:"gid";i:1;}}}s:5:"total";s:1:"3";s:11:"total_found";s:1:"3";s:4:"time";s:5:"0.001";s:5:"words";a:3:{s:3:"one";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:1:"6";}s:3:"two";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:1:"4";}s:5:"three";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:1:"4";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:22:"one SENTENCE two three";}i:2;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:7:"matches";a:2:{i:2;a:2:{s:6:"weight";s:4:"3594";s:5:"attrs";a:1:{s:3:"gid";i:1;}}i:4;a:2:{s:6:"weight";s:4:"2594";s:5:"attrs";a:1:{s:3:"gid";i:1;}}}s:5:"total";s:1:"2";s:11:"total_found";s:1:"2";s:4:"time";s:5:"0.001";s:5:"words";a:3:{s:3:"one";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:1:"6";}s:3:"two";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:1:"4";}s:5:"three";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:1:"4";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:31:"one SENTENCE two SENTENCE three";}i:3;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:7:"matches";a:1:{i:2;a:2:{s:6:"weight";s:4:"2594";s:5:"attrs";a:1:{s:3:"gid";i:1;}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.001";s:5:"words";a:3:{s:3:"one";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:1:"6";}s:3:"two";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:1:"4";}s:5:"three";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:1:"4";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:24:""one two" SENTENCE three";}i:4;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:7:"matches";a:2:{i:5;a:2:{s:6:"weight";s:4:"2853";s:5:"attrs";a:1:{s:3:"gid";i:1;}}i:6;a:2:{s:6:"weight";s:4:"1775";s:5:"attrs";a:1:{s:3:"gid";i:1;}}}s:5:"total";s:1:"2";s:11:"total_found";s:1:"2";s:4:"time";s:5:"0.001";s:5:"words";a:2:{s:3:"zam";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:3:"349";}s:3:"ram";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:3:"175";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:16:"zam SENTENCE ram";}i:5;a:12:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:5:"total";s:1:"0";s:11:"total_found";s:1:"0";s:4:"time";s:5:"0.001";s:5:"words";a:2:{s:3:"fox";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}s:3:"dog";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:17:"fox PARAGRAPH dog";}i:6;a:12:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:5:"total";s:1:"0";s:11:"total_found";s:1:"0";s:4:"time";s:5:"0.001";s:5:"words";a:2:{s:8:"sentence";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}s:9:"paragraph";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:27:"sentence SENTENCE paragraph";}i:7;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:7:"matches";a:1:{i:101;a:2:{s:6:"weight";s:4:"1722";s:5:"attrs";a:1:{s:3:"gid";i:2;}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.001";s:5:"words";a:2:{s:8:"sentence";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}s:9:"paragraph";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:28:"sentence PARAGRAPH paragraph";}i:8;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:7:"matches";a:1:{i:200;a:2:{s:6:"weight";s:4:"1722";s:5:"attrs";a:1:{s:3:"gid";i:3;}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.001";s:5:"words";a:1:{s:6:"walrus";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:17:"ZONE:zoneA walrus";}i:9;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:7:"matches";a:1:{i:200;a:2:{s:6:"weight";s:4:"1722";s:5:"attrs";a:1:{s:3:"gid";i:3;}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.001";s:5:"words";a:1:{s:6:"walrus";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:17:"ZONE:zoneB walrus";}i:10;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:7:"matches";a:1:{i:200;a:2:{s:6:"weight";s:4:"1722";s:5:"attrs";a:1:{s:3:"gid";i:3;}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.001";s:5:"words";a:2:{s:6:"walrus";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}s:4:"time";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:22:"ZONE:zoneA walrus time";}i:11;a:12:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:5:"total";s:1:"0";s:11:"total_found";s:1:"0";s:4:"time";s:5:"0.001";s:5:"words";a:2:{s:6:"walrus";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}s:4:"time";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:22:"ZONE:zoneB walrus time";}i:12;a:12:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:5:"total";s:1:"0";s:11:"total_found";s:1:"0";s:4:"time";s:5:"0.001";s:5:"words";a:3:{s:8:"cabbages";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"2";}s:3:"and";a:2:{s:4:"docs";s:1:"5";s:4:"hits";s:2:"14";}s:5:"kings";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"2";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:29:"ZONE:zoneC cabbages and kings";}i:13;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:7:"matches";a:1:{i:201;a:2:{s:6:"weight";s:4:"2644";s:5:"attrs";a:1:{s:3:"gid";i:3;}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.001";s:5:"words";a:3:{s:5:"kings";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"2";}s:3:"and";a:2:{s:4:"docs";s:1:"5";s:4:"hits";s:2:"14";}s:5:"ships";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"2";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:26:"ZONE:zoneC kings and ships";}i:14;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:7:"matches";a:1:{i:202;a:2:{s:6:"weight";s:4:"1628";s:5:"attrs";a:1:{s:3:"gid";i:3;}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.001";s:5:"words";a:2:{s:5:"sweet";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:1:"4";}s:8:"disagree";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"2";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:33:"ZONE:(zoneA,zoneB) sweet disagree";}i:15;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:7:"matches";a:2:{i:202;a:2:{s:6:"weight";s:4:"3639";s:5:"attrs";a:1:{s:3:"gid";i:3;}}i:300;a:2:{s:6:"weight";s:4:"3639";s:5:"attrs";a:1:{s:3:"gid";i:4;}}}s:5:"total";s:1:"2";s:11:"total_found";s:1:"2";s:4:"time";s:5:"0.001";s:5:"words";a:3:{s:3:"who";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"2";}s:2:"am";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"2";}s:1:"i";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:1:"4";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:10:""Who am I"";}i:16;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:7:"matches";a:4:{i:310;a:2:{s:6:"weight";s:4:"2569";s:5:"attrs";a:1:{s:3:"gid";i:4;}}i:311;a:2:{s:6:"weight";s:4:"2569";s:5:"attrs";a:1:{s:3:"gid";i:4;}}i:202;a:2:{s:6:"weight";s:4:"2551";s:5:"attrs";a:1:{s:3:"gid";i:3;}}i:300;a:2:{s:6:"weight";s:4:"2551";s:5:"attrs";a:1:{s:3:"gid";i:4;}}}s:5:"total";s:1:"4";s:11:"total_found";s:1:"4";s:4:"time";s:5:"0.001";s:5:"words";a:2:{s:2:"of";a:2:{s:4:"docs";s:1:"8";s:4:"hits";s:2:"10";}s:4:"this";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:1:"6";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:9:""of this"";}i:17;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:7:"matches";a:2:{i:310;a:2:{s:6:"weight";s:4:"2626";s:5:"attrs";a:1:{s:3:"gid";i:4;}}i:311;a:2:{s:6:"weight";s:4:"2626";s:5:"attrs";a:1:{s:3:"gid";i:4;}}}s:5:"total";s:1:"2";s:11:"total_found";s:1:"2";s:4:"time";s:5:"0.001";s:5:"words";a:2:{s:4:"like";a:2:{s:4:"docs";s:1:"3";s:4:"hits";s:1:"5";}s:4:"this";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:1:"6";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:22:"ZONE:zoneA "like this"";}i:18;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:7:"matches";a:1:{i:400;a:2:{s:6:"weight";s:4:"1722";s:5:"attrs";a:1:{s:3:"gid";i:5;}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.001";s:5:"words";a:1:{s:7:"strikes";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:7:"strikes";}}i:1;a:19:{i:0;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:7:"matches";a:3:{i:2;a:2:{s:6:"weight";s:4:"2594";s:5:"attrs";a:1:{s:3:"gid";i:1;}}i:3;a:2:{s:6:"weight";s:4:"2594";s:5:"attrs";a:1:{s:3:"gid";i:1;}}i:4;a:2:{s:6:"weight";s:4:"1594";s:5:"attrs";a:1:{s:3:"gid";i:1;}}}s:5:"total";s:1:"3";s:11:"total_found";s:1:"3";s:4:"time";s:5:"0.001";s:5:"words";a:2:{s:3:"one";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:1:"6";}s:3:"two";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:1:"4";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:16:"one SENTENCE two";}i:1;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:7:"matches";a:3:{i:2;a:2:{s:6:"weight";s:4:"3594";s:5:"attrs";a:1:{s:3:"gid";i:1;}}i:3;a:2:{s:6:"weight";s:4:"2594";s:5:"attrs";a:1:{s:3:"gid";i:1;}}i:4;a:2:{s:6:"weight";s:4:"2594";s:5:"attrs";a:1:{s:3:"gid";i:1;}}}s:5:"total";s:1:"3";s:11:"total_found";s:1:"3";s:4:"time";s:5:"0.001";s:5:"words";a:3:{s:3:"one";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:1:"6";}s:3:"two";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:1:"4";}s:5:"three";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:1:"4";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:22:"one SENTENCE two three";}i:2;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:7:"matches";a:2:{i:2;a:2:{s:6:"weight";s:4:"3594";s:5:"attrs";a:1:{s:3:"gid";i:1;}}i:4;a:2:{s:6:"weight";s:4:"2594";s:5:"attrs";a:1:{s:3:"gid";i:1;}}}s:5:"total";s:1:"2";s:11:"total_found";s:1:"2";s:4:"time";s:5:"0.001";s:5:"words";a:3:{s:3:"one";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:1:"6";}s:3:"two";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:1:"4";}s:5:"three";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:1:"4";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:31:"one SENTENCE two SENTENCE three";}i:3;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:7:"matches";a:1:{i:2;a:2:{s:6:"weight";s:4:"2594";s:5:"attrs";a:1:{s:3:"gid";i:1;}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.001";s:5:"words";a:3:{s:3:"one";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:1:"6";}s:3:"two";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:1:"4";}s:5:"three";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:1:"4";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:24:""one two" SENTENCE three";}i:4;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:7:"matches";a:2:{i:5;a:2:{s:6:"weight";s:4:"2853";s:5:"attrs";a:1:{s:3:"gid";i:1;}}i:6;a:2:{s:6:"weight";s:4:"1775";s:5:"attrs";a:1:{s:3:"gid";i:1;}}}s:5:"total";s:1:"2";s:11:"total_found";s:1:"2";s:4:"time";s:5:"0.001";s:5:"words";a:2:{s:3:"zam";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:3:"349";}s:3:"ram";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:3:"175";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:16:"zam SENTENCE ram";}i:5;a:12:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:5:"total";s:1:"0";s:11:"total_found";s:1:"0";s:4:"time";s:5:"0.001";s:5:"words";a:2:{s:3:"fox";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}s:3:"dog";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:17:"fox PARAGRAPH dog";}i:6;a:12:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:5:"total";s:1:"0";s:11:"total_found";s:1:"0";s:4:"time";s:5:"0.001";s:5:"words";a:2:{s:8:"sentence";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}s:9:"paragraph";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:27:"sentence SENTENCE paragraph";}i:7;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:7:"matches";a:1:{i:101;a:2:{s:6:"weight";s:4:"1722";s:5:"attrs";a:1:{s:3:"gid";i:2;}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.001";s:5:"words";a:2:{s:8:"sentence";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}s:9:"paragraph";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:28:"sentence PARAGRAPH paragraph";}i:8;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:7:"matches";a:1:{i:200;a:2:{s:6:"weight";s:4:"1722";s:5:"attrs";a:1:{s:3:"gid";i:3;}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.001";s:5:"words";a:1:{s:6:"walrus";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:17:"ZONE:zoneA walrus";}i:9;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:7:"matches";a:1:{i:200;a:2:{s:6:"weight";s:4:"1722";s:5:"attrs";a:1:{s:3:"gid";i:3;}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.001";s:5:"words";a:1:{s:6:"walrus";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:17:"ZONE:zoneB walrus";}i:10;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:7:"matches";a:1:{i:200;a:2:{s:6:"weight";s:4:"1722";s:5:"attrs";a:1:{s:3:"gid";i:3;}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.001";s:5:"words";a:2:{s:6:"walrus";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}s:4:"time";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:22:"ZONE:zoneA walrus time";}i:11;a:12:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:5:"total";s:1:"0";s:11:"total_found";s:1:"0";s:4:"time";s:5:"0.001";s:5:"words";a:2:{s:6:"walrus";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}s:4:"time";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:22:"ZONE:zoneB walrus time";}i:12;a:12:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:5:"total";s:1:"0";s:11:"total_found";s:1:"0";s:4:"time";s:5:"0.001";s:5:"words";a:3:{s:8:"cabbages";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"2";}s:3:"and";a:2:{s:4:"docs";s:1:"5";s:4:"hits";s:2:"14";}s:5:"kings";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"2";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:29:"ZONE:zoneC cabbages and kings";}i:13;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:7:"matches";a:1:{i:201;a:2:{s:6:"weight";s:4:"2644";s:5:"attrs";a:1:{s:3:"gid";i:3;}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.001";s:5:"words";a:3:{s:5:"kings";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"2";}s:3:"and";a:2:{s:4:"docs";s:1:"5";s:4:"hits";s:2:"14";}s:5:"ships";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"2";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:26:"ZONE:zoneC kings and ships";}i:14;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:7:"matches";a:1:{i:202;a:2:{s:6:"weight";s:4:"1628";s:5:"attrs";a:1:{s:3:"gid";i:3;}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.001";s:5:"words";a:2:{s:5:"sweet";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:1:"4";}s:8:"disagree";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"2";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:33:"ZONE:(zoneA,zoneB) sweet disagree";}i:15;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:7:"matches";a:2:{i:202;a:2:{s:6:"weight";s:4:"3639";s:5:"attrs";a:1:{s:3:"gid";i:3;}}i:300;a:2:{s:6:"weight";s:4:"3639";s:5:"attrs";a:1:{s:3:"gid";i:4;}}}s:5:"total";s:1:"2";s:11:"total_found";s:1:"2";s:4:"time";s:5:"0.001";s:5:"words";a:3:{s:3:"who";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"2";}s:2:"am";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"2";}s:1:"i";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:1:"4";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:10:""Who am I"";}i:16;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:7:"matches";a:4:{i:310;a:2:{s:6:"weight";s:4:"2569";s:5:"attrs";a:1:{s:3:"gid";i:4;}}i:311;a:2:{s:6:"weight";s:4:"2569";s:5:"attrs";a:1:{s:3:"gid";i:4;}}i:202;a:2:{s:6:"weight";s:4:"2551";s:5:"attrs";a:1:{s:3:"gid";i:3;}}i:300;a:2:{s:6:"weight";s:4:"2551";s:5:"attrs";a:1:{s:3:"gid";i:4;}}}s:5:"total";s:1:"4";s:11:"total_found";s:1:"4";s:4:"time";s:5:"0.001";s:5:"words";a:2:{s:2:"of";a:2:{s:4:"docs";s:1:"8";s:4:"hits";s:2:"10";}s:4:"this";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:1:"6";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:9:""of this"";}i:17;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:7:"matches";a:2:{i:310;a:2:{s:6:"weight";s:4:"2626";s:5:"attrs";a:1:{s:3:"gid";i:4;}}i:311;a:2:{s:6:"weight";s:4:"2626";s:5:"attrs";a:1:{s:3:"gid";i:4;}}}s:5:"total";s:1:"2";s:11:"total_found";s:1:"2";s:4:"time";s:5:"0.001";s:5:"words";a:2:{s:4:"like";a:2:{s:4:"docs";s:1:"3";s:4:"hits";s:1:"5";}s:4:"this";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:1:"6";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:22:"ZONE:zoneA "like this"";}i:18;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:7:"matches";a:1:{i:400;a:2:{s:6:"weight";s:4:"1722";s:5:"attrs";a:1:{s:3:"gid";i:5;}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.001";s:5:"words";a:1:{s:7:"strikes";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:7:"strikes";}}i:2;a:19:{i:0;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:7:"matches";a:3:{i:2;a:2:{s:6:"weight";s:4:"2594";s:5:"attrs";a:1:{s:3:"gid";i:1;}}i:3;a:2:{s:6:"weight";s:4:"2594";s:5:"attrs";a:1:{s:3:"gid";i:1;}}i:4;a:2:{s:6:"weight";s:4:"1594";s:5:"attrs";a:1:{s:3:"gid";i:1;}}}s:5:"total";s:1:"3";s:11:"total_found";s:1:"3";s:4:"time";s:5:"0.001";s:5:"words";a:2:{s:3:"one";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:1:"6";}s:3:"two";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:1:"4";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:16:"one SENTENCE two";}i:1;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:7:"matches";a:3:{i:2;a:2:{s:6:"weight";s:4:"3594";s:5:"attrs";a:1:{s:3:"gid";i:1;}}i:3;a:2:{s:6:"weight";s:4:"2594";s:5:"attrs";a:1:{s:3:"gid";i:1;}}i:4;a:2:{s:6:"weight";s:4:"2594";s:5:"attrs";a:1:{s:3:"gid";i:1;}}}s:5:"total";s:1:"3";s:11:"total_found";s:1:"3";s:4:"time";s:5:"0.001";s:5:"words";a:3:{s:3:"one";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:1:"6";}s:3:"two";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:1:"4";}s:5:"three";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:1:"4";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:22:"one SENTENCE two three";}i:2;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:7:"matches";a:2:{i:2;a:2:{s:6:"weight";s:4:"3594";s:5:"attrs";a:1:{s:3:"gid";i:1;}}i:4;a:2:{s:6:"weight";s:4:"2594";s:5:"attrs";a:1:{s:3:"gid";i:1;}}}s:5:"total";s:1:"2";s:11:"total_found";s:1:"2";s:4:"time";s:5:"0.001";s:5:"words";a:3:{s:3:"one";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:1:"6";}s:3:"two";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:1:"4";}s:5:"three";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:1:"4";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:31:"one SENTENCE two SENTENCE three";}i:3;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:7:"matches";a:1:{i:2;a:2:{s:6:"weight";s:4:"2594";s:5:"attrs";a:1:{s:3:"gid";i:1;}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.001";s:5:"words";a:3:{s:3:"one";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:1:"6";}s:3:"two";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:1:"4";}s:5:"three";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:1:"4";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:24:""one two" SENTENCE three";}i:4;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:7:"matches";a:2:{i:5;a:2:{s:6:"weight";s:4:"2853";s:5:"attrs";a:1:{s:3:"gid";i:1;}}i:6;a:2:{s:6:"weight";s:4:"1775";s:5:"attrs";a:1:{s:3:"gid";i:1;}}}s:5:"total";s:1:"2";s:11:"total_found";s:1:"2";s:4:"time";s:5:"0.001";s:5:"words";a:2:{s:3:"zam";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:3:"349";}s:3:"ram";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:3:"175";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:16:"zam SENTENCE ram";}i:5;a:12:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:5:"total";s:1:"0";s:11:"total_found";s:1:"0";s:4:"time";s:5:"0.001";s:5:"words";a:2:{s:3:"fox";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}s:3:"dog";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:17:"fox PARAGRAPH dog";}i:6;a:12:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:5:"total";s:1:"0";s:11:"total_found";s:1:"0";s:4:"time";s:5:"0.001";s:5:"words";a:2:{s:8:"sentence";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}s:9:"paragraph";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:27:"sentence SENTENCE paragraph";}i:7;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:7:"matches";a:1:{i:101;a:2:{s:6:"weight";s:4:"1722";s:5:"attrs";a:1:{s:3:"gid";i:2;}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.001";s:5:"words";a:2:{s:8:"sentence";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}s:9:"paragraph";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:28:"sentence PARAGRAPH paragraph";}i:8;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:7:"matches";a:1:{i:200;a:2:{s:6:"weight";s:4:"1722";s:5:"attrs";a:1:{s:3:"gid";i:3;}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.001";s:5:"words";a:1:{s:6:"walrus";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:17:"ZONE:zoneA walrus";}i:9;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:7:"matches";a:1:{i:200;a:2:{s:6:"weight";s:4:"1722";s:5:"attrs";a:1:{s:3:"gid";i:3;}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.001";s:5:"words";a:1:{s:6:"walrus";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:17:"ZONE:zoneB walrus";}i:10;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:7:"matches";a:1:{i:200;a:2:{s:6:"weight";s:4:"1722";s:5:"attrs";a:1:{s:3:"gid";i:3;}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.001";s:5:"words";a:2:{s:6:"walrus";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}s:4:"time";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:22:"ZONE:zoneA walrus time";}i:11;a:12:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:5:"total";s:1:"0";s:11:"total_found";s:1:"0";s:4:"time";s:5:"0.001";s:5:"words";a:2:{s:6:"walrus";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}s:4:"time";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:22:"ZONE:zoneB walrus time";}i:12;a:12:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:5:"total";s:1:"0";s:11:"total_found";s:1:"0";s:4:"time";s:5:"0.001";s:5:"words";a:3:{s:8:"cabbages";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"2";}s:3:"and";a:2:{s:4:"docs";s:1:"5";s:4:"hits";s:2:"14";}s:5:"kings";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"2";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:29:"ZONE:zoneC cabbages and kings";}i:13;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:7:"matches";a:1:{i:201;a:2:{s:6:"weight";s:4:"2644";s:5:"attrs";a:1:{s:3:"gid";i:3;}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.001";s:5:"words";a:3:{s:5:"kings";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"2";}s:3:"and";a:2:{s:4:"docs";s:1:"5";s:4:"hits";s:2:"14";}s:5:"ships";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"2";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:26:"ZONE:zoneC kings and ships";}i:14;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:7:"matches";a:1:{i:202;a:2:{s:6:"weight";s:4:"1628";s:5:"attrs";a:1:{s:3:"gid";i:3;}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.001";s:5:"words";a:2:{s:5:"sweet";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:1:"4";}s:8:"disagree";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"2";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:33:"ZONE:(zoneA,zoneB) sweet disagree";}i:15;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:7:"matches";a:2:{i:202;a:2:{s:6:"weight";s:4:"3639";s:5:"attrs";a:1:{s:3:"gid";i:3;}}i:300;a:2:{s:6:"weight";s:4:"3639";s:5:"attrs";a:1:{s:3:"gid";i:4;}}}s:5:"total";s:1:"2";s:11:"total_found";s:1:"2";s:4:"time";s:5:"0.001";s:5:"words";a:3:{s:3:"who";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"2";}s:2:"am";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"2";}s:1:"i";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:1:"4";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:10:""Who am I"";}i:16;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:7:"matches";a:4:{i:310;a:2:{s:6:"weight";s:4:"2569";s:5:"attrs";a:1:{s:3:"gid";i:4;}}i:311;a:2:{s:6:"weight";s:4:"2569";s:5:"attrs";a:1:{s:3:"gid";i:4;}}i:202;a:2:{s:6:"weight";s:4:"2551";s:5:"attrs";a:1:{s:3:"gid";i:3;}}i:300;a:2:{s:6:"weight";s:4:"2551";s:5:"attrs";a:1:{s:3:"gid";i:4;}}}s:5:"total";s:1:"4";s:11:"total_found";s:1:"4";s:4:"time";s:5:"0.001";s:5:"words";a:2:{s:2:"of";a:2:{s:4:"docs";s:1:"8";s:4:"hits";s:2:"10";}s:4:"this";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:1:"6";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:9:""of this"";}i:17;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:7:"matches";a:2:{i:310;a:2:{s:6:"weight";s:4:"2626";s:5:"attrs";a:1:{s:3:"gid";i:4;}}i:311;a:2:{s:6:"weight";s:4:"2626";s:5:"attrs";a:1:{s:3:"gid";i:4;}}}s:5:"total";s:1:"2";s:11:"total_found";s:1:"2";s:4:"time";s:5:"0.001";s:5:"words";a:2:{s:4:"like";a:2:{s:4:"docs";s:1:"3";s:4:"hits";s:1:"5";}s:4:"this";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:1:"6";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:22:"ZONE:zoneA "like this"";}i:18;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:7:"matches";a:1:{i:400;a:2:{s:6:"weight";s:4:"1722";s:5:"attrs";a:1:{s:3:"gid";i:5;}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.001";s:5:"words";a:1:{s:7:"strikes";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:7:"strikes";}}i:3;a:19:{i:0;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:7:"matches";a:3:{i:2;a:2:{s:6:"weight";s:4:"2594";s:5:"attrs";a:1:{s:3:"gid";i:1;}}i:3;a:2:{s:6:"weight";s:4:"2594";s:5:"attrs";a:1:{s:3:"gid";i:1;}}i:4;a:2:{s:6:"weight";s:4:"1594";s:5:"attrs";a:1:{s:3:"gid";i:1;}}}s:5:"total";s:1:"3";s:11:"total_found";s:1:"3";s:4:"time";s:5:"0.000";s:5:"words";a:2:{s:3:"one";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:1:"6";}s:3:"two";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:1:"4";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:16:"one SENTENCE two";}i:1;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:7:"matches";a:3:{i:2;a:2:{s:6:"weight";s:4:"3594";s:5:"attrs";a:1:{s:3:"gid";i:1;}}i:3;a:2:{s:6:"weight";s:4:"2594";s:5:"attrs";a:1:{s:3:"gid";i:1;}}i:4;a:2:{s:6:"weight";s:4:"2594";s:5:"attrs";a:1:{s:3:"gid";i:1;}}}s:5:"total";s:1:"3";s:11:"total_found";s:1:"3";s:4:"time";s:5:"0.001";s:5:"words";a:3:{s:3:"one";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:1:"6";}s:3:"two";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:1:"4";}s:5:"three";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:1:"4";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:22:"one SENTENCE two three";}i:2;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:7:"matches";a:2:{i:2;a:2:{s:6:"weight";s:4:"3594";s:5:"attrs";a:1:{s:3:"gid";i:1;}}i:4;a:2:{s:6:"weight";s:4:"2594";s:5:"attrs";a:1:{s:3:"gid";i:1;}}}s:5:"total";s:1:"2";s:11:"total_found";s:1:"2";s:4:"time";s:5:"0.001";s:5:"words";a:3:{s:3:"one";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:1:"6";}s:3:"two";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:1:"4";}s:5:"three";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:1:"4";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:31:"one SENTENCE two SENTENCE three";}i:3;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:7:"matches";a:1:{i:2;a:2:{s:6:"weight";s:4:"2594";s:5:"attrs";a:1:{s:3:"gid";i:1;}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.001";s:5:"words";a:3:{s:3:"one";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:1:"6";}s:3:"two";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:1:"4";}s:5:"three";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:1:"4";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:24:""one two" SENTENCE three";}i:4;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:7:"matches";a:2:{i:5;a:2:{s:6:"weight";s:4:"2853";s:5:"attrs";a:1:{s:3:"gid";i:1;}}i:6;a:2:{s:6:"weight";s:4:"1775";s:5:"attrs";a:1:{s:3:"gid";i:1;}}}s:5:"total";s:1:"2";s:11:"total_found";s:1:"2";s:4:"time";s:5:"0.001";s:5:"words";a:2:{s:3:"zam";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:3:"349";}s:3:"ram";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:3:"175";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:16:"zam SENTENCE ram";}i:5;a:12:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:5:"total";s:1:"0";s:11:"total_found";s:1:"0";s:4:"time";s:5:"0.001";s:5:"words";a:2:{s:3:"fox";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}s:3:"dog";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:17:"fox PARAGRAPH dog";}i:6;a:12:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:5:"total";s:1:"0";s:11:"total_found";s:1:"0";s:4:"time";s:5:"0.000";s:5:"words";a:2:{s:8:"sentence";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}s:9:"paragraph";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:27:"sentence SENTENCE paragraph";}i:7;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:7:"matches";a:1:{i:101;a:2:{s:6:"weight";s:4:"1722";s:5:"attrs";a:1:{s:3:"gid";i:2;}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.001";s:5:"words";a:2:{s:8:"sentence";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}s:9:"paragraph";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:28:"sentence PARAGRAPH paragraph";}i:8;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:7:"matches";a:1:{i:200;a:2:{s:6:"weight";s:4:"1722";s:5:"attrs";a:1:{s:3:"gid";i:3;}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.001";s:5:"words";a:1:{s:6:"walrus";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:17:"ZONE:zoneA walrus";}i:9;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:7:"matches";a:1:{i:200;a:2:{s:6:"weight";s:4:"1722";s:5:"attrs";a:1:{s:3:"gid";i:3;}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:6:"walrus";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:17:"ZONE:zoneB walrus";}i:10;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:7:"matches";a:1:{i:200;a:2:{s:6:"weight";s:4:"1722";s:5:"attrs";a:1:{s:3:"gid";i:3;}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.001";s:5:"words";a:2:{s:6:"walrus";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}s:4:"time";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:22:"ZONE:zoneA walrus time";}i:11;a:12:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:5:"total";s:1:"0";s:11:"total_found";s:1:"0";s:4:"time";s:5:"0.001";s:5:"words";a:2:{s:6:"walrus";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}s:4:"time";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:22:"ZONE:zoneB walrus time";}i:12;a:12:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:5:"total";s:1:"0";s:11:"total_found";s:1:"0";s:4:"time";s:5:"0.001";s:5:"words";a:3:{s:8:"cabbages";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"2";}s:3:"and";a:2:{s:4:"docs";s:1:"5";s:4:"hits";s:2:"14";}s:5:"kings";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"2";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:29:"ZONE:zoneC cabbages and kings";}i:13;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:7:"matches";a:1:{i:201;a:2:{s:6:"weight";s:4:"2644";s:5:"attrs";a:1:{s:3:"gid";i:3;}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.001";s:5:"words";a:3:{s:5:"kings";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"2";}s:3:"and";a:2:{s:4:"docs";s:1:"5";s:4:"hits";s:2:"14";}s:5:"ships";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"2";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:26:"ZONE:zoneC kings and ships";}i:14;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:7:"matches";a:1:{i:202;a:2:{s:6:"weight";s:4:"1628";s:5:"attrs";a:1:{s:3:"gid";i:3;}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.001";s:5:"words";a:2:{s:5:"sweet";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:1:"4";}s:8:"disagree";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"2";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:33:"ZONE:(zoneA,zoneB) sweet disagree";}i:15;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:7:"matches";a:2:{i:202;a:2:{s:6:"weight";s:4:"3639";s:5:"attrs";a:1:{s:3:"gid";i:3;}}i:300;a:2:{s:6:"weight";s:4:"3639";s:5:"attrs";a:1:{s:3:"gid";i:4;}}}s:5:"total";s:1:"2";s:11:"total_found";s:1:"2";s:4:"time";s:5:"0.001";s:5:"words";a:3:{s:3:"who";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"2";}s:2:"am";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"2";}s:1:"i";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:1:"4";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:10:""Who am I"";}i:16;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:7:"matches";a:4:{i:310;a:2:{s:6:"weight";s:4:"2569";s:5:"attrs";a:1:{s:3:"gid";i:4;}}i:311;a:2:{s:6:"weight";s:4:"2569";s:5:"attrs";a:1:{s:3:"gid";i:4;}}i:202;a:2:{s:6:"weight";s:4:"2551";s:5:"attrs";a:1:{s:3:"gid";i:3;}}i:300;a:2:{s:6:"weight";s:4:"2551";s:5:"attrs";a:1:{s:3:"gid";i:4;}}}s:5:"total";s:1:"4";s:11:"total_found";s:1:"4";s:4:"time";s:5:"0.001";s:5:"words";a:2:{s:2:"of";a:2:{s:4:"docs";s:1:"8";s:4:"hits";s:2:"10";}s:4:"this";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:1:"6";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:9:""of this"";}i:17;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:7:"matches";a:2:{i:310;a:2:{s:6:"weight";s:4:"2626";s:5:"attrs";a:1:{s:3:"gid";i:4;}}i:311;a:2:{s:6:"weight";s:4:"2626";s:5:"attrs";a:1:{s:3:"gid";i:4;}}}s:5:"total";s:1:"2";s:11:"total_found";s:1:"2";s:4:"time";s:5:"0.001";s:5:"words";a:2:{s:4:"like";a:2:{s:4:"docs";s:1:"3";s:4:"hits";s:1:"5";}s:4:"this";a:2:{s:4:"docs";s:1:"4";s:4:"hits";s:1:"6";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:22:"ZONE:zoneA "like this"";}i:18;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:7:"matches";a:1:{i:400;a:2:{s:6:"weight";s:4:"1722";s:5:"attrs";a:1:{s:3:"gid";i:5;}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.001";s:5:"words";a:1:{s:7:"strikes";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:7:"strikes";}}} \ No newline at end of file diff -Nru sphinxsearch-0.9.9+2.0.2beta/test/test_133/test.xml sphinxsearch-2.0.4/test/test_133/test.xml --- sphinxsearch-0.9.9+2.0.2beta/test/test_133/test.xml 2011-03-14 01:46:16.000000000 +0000 +++ sphinxsearch-2.0.4/test/test_133/test.xml 2012-02-20 15:08:34.000000000 +0000 @@ -66,6 +66,7 @@ The time has come, the walrus said, to talk of many things.' );]]> and ships, and sealing wax, of cabbages, , and kings.' );]]> +, and kings.' );]]> Sweet dreams are made of this.Who am I to disagree?' );]]> diff -Nru sphinxsearch-0.9.9+2.0.2beta/test/test_134/test.xml sphinxsearch-2.0.4/test/test_134/test.xml --- sphinxsearch-0.9.9+2.0.2beta/test/test_134/test.xml 2011-07-12 15:43:45.000000000 +0000 +++ sphinxsearch-2.0.4/test/test_134/test.xml 2011-11-21 15:58:19.000000000 +0000 @@ -225,7 +225,6 @@ // last test - nothing found - HighlightStart path $refs[3]['opt']['limit'] = 150; -$refs[3]['opt']['allow_empty']=true; $results[] = $client->BuildExcerpts($refs[3]["doc"], 'test', "nothing found", $refs[3]["opt"] ); // 7 test diff -Nru sphinxsearch-0.9.9+2.0.2beta/test/test_137/model.bin sphinxsearch-2.0.4/test/test_137/model.bin --- sphinxsearch-0.9.9+2.0.2beta/test/test_137/model.bin 2010-08-12 10:18:36.000000000 +0000 +++ sphinxsearch-2.0.4/test/test_137/model.bin 2012-01-20 18:06:13.000000000 +0000 @@ -1 +1 @@ -a:1:{i:0;a:1:{i:0;a:1:{i:0;a:1:{i:0;s:57:"Was one rabiit. Now there are five rabbits.";}}}} \ No newline at end of file +a:1:{i:0;a:1:{i:0;a:3:{i:0;a:1:{i:0;s:57:"Was one rabiit. Now there are five rabbits.";}i:1;b:0;i:2;s:38:"searchd error: invalid entries count 0";}}} \ No newline at end of file diff -Nru sphinxsearch-0.9.9+2.0.2beta/test/test_137/test.xml sphinxsearch-2.0.4/test/test_137/test.xml --- sphinxsearch-0.9.9+2.0.2beta/test/test_137/test.xml 2010-08-12 10:18:36.000000000 +0000 +++ sphinxsearch-2.0.4/test/test_137/test.xml 2012-01-20 18:06:13.000000000 +0000 @@ -36,6 +36,10 @@ $results[] = $client->BuildExcerpts($docs, 'test', '(one) NEAR/35 ("five")', $opts ); +// regression crash on 0 docs snippet +$results[] = $client->BuildExcerpts(array(), 'test', '(one) NEAR/35 ("five")', $opts ); +$results[] = $client->GetLastError(); + ]]> diff -Nru sphinxsearch-0.9.9+2.0.2beta/test/test_142/model.bin sphinxsearch-2.0.4/test/test_142/model.bin --- sphinxsearch-0.9.9+2.0.2beta/test/test_142/model.bin 2010-10-14 06:03:18.000000000 +0000 +++ sphinxsearch-2.0.4/test/test_142/model.bin 2011-11-23 08:48:30.000000000 +0000 @@ -1 +1 @@ -a:2:{i:0;a:1:{i:0;a:5:{i:0;s:9:"inserting";i:1;s:7:"killing";i:2;s:16:"connecting again";i:3;s:8:"querying";i:4;s:13:"total found 0";}}i:1;a:1:{i:0;a:5:{i:0;s:9:"inserting";i:1;s:7:"killing";i:2;s:16:"connecting again";i:3;s:8:"querying";i:4;s:13:"total found 1";}}} \ No newline at end of file +a:2:{i:0;a:1:{i:0;a:21:{i:0;s:53:"query: DELETE FROM kw WHERE id=1000; total_affected:0";i:1;s:68:"query: INSERT INTO crc VALUES (1, 'test work', 11); total_affected:1";i:2;s:71:"query: INSERT INTO kw VALUES (100, 'test stuff', 111); total_affected:1";i:3;s:61:"query: SELECT * FROM crc,kw WHERE MATCH('test'); total_rows:2";i:4;s:7:"id => 1";i:5;s:14:"weight => 1500";i:6;s:9:"idd => 11";i:7;s:9:"id => 100";i:8;s:14:"weight => 1500";i:9;s:10:"idd => 111";i:10;s:41:"query: SELECT * FROM crc,kw; total_rows:2";i:11;s:7:"id => 1";i:12;s:11:"weight => 1";i:13;s:9:"idd => 11";i:14;s:9:"id => 100";i:15;s:11:"weight => 1";i:16;s:10:"idd => 111";i:17;s:7:"killing";i:18;s:16:"connecting again";i:19;s:61:"query: SELECT * FROM crc,kw WHERE MATCH('test'); total_rows:0";i:20;s:41:"query: SELECT * FROM crc,kw; total_rows:0";}}i:1;a:1:{i:0;a:33:{i:0;s:53:"query: DELETE FROM kw WHERE id=1000; total_affected:0";i:1;s:68:"query: INSERT INTO crc VALUES (1, 'test work', 11); total_affected:1";i:2;s:71:"query: INSERT INTO kw VALUES (100, 'test stuff', 111); total_affected:1";i:3;s:61:"query: SELECT * FROM crc,kw WHERE MATCH('test'); total_rows:2";i:4;s:7:"id => 1";i:5;s:14:"weight => 1500";i:6;s:9:"idd => 11";i:7;s:9:"id => 100";i:8;s:14:"weight => 1500";i:9;s:10:"idd => 111";i:10;s:41:"query: SELECT * FROM crc,kw; total_rows:2";i:11;s:7:"id => 1";i:12;s:11:"weight => 1";i:13;s:9:"idd => 11";i:14;s:9:"id => 100";i:15;s:11:"weight => 1";i:16;s:10:"idd => 111";i:17;s:7:"killing";i:18;s:16:"connecting again";i:19;s:61:"query: SELECT * FROM crc,kw WHERE MATCH('test'); total_rows:2";i:20;s:7:"id => 1";i:21;s:14:"weight => 1500";i:22;s:9:"idd => 11";i:23;s:9:"id => 100";i:24;s:14:"weight => 1500";i:25;s:10:"idd => 111";i:26;s:41:"query: SELECT * FROM crc,kw; total_rows:2";i:27;s:7:"id => 1";i:28;s:11:"weight => 1";i:29;s:9:"idd => 11";i:30;s:9:"id => 100";i:31;s:11:"weight => 1";i:32;s:10:"idd => 111";}}} \ No newline at end of file diff -Nru sphinxsearch-0.9.9+2.0.2beta/test/test_142/test.xml sphinxsearch-2.0.4/test/test_142/test.xml --- sphinxsearch-0.9.9+2.0.2beta/test/test_142/test.xml 2011-09-16 15:21:04.000000000 +0000 +++ sphinxsearch-2.0.4/test/test_142/test.xml 2011-11-23 08:48:30.000000000 +0000 @@ -24,55 +24,109 @@ } -index test +index crc { type = rt - path = data/test + path = data/crc + charset_type = utf-8 + rt_field = content + rt_attr_uint = idd + + dict = crc } +index kw +{ + type = rt + path = data/kw + charset_type = utf-8 + + rt_field = content + rt_attr_uint = idd + + dict = keywords + min_prefix_len = 1 +} + + $value) + { + $results[] = $key . " => " . $value; + } + } + } +'); + +$sock = $make_sock( $results ); if ( $sock === false ) { - $results[] = "error: can't connect to searchd: " . @mysql_errno ( $sock ) . " : " . @mysql_error ( $sock ); return; } -$results[] = "inserting"; -@mysql_query ( "INSERT INTO test VALUES (1,'test')",$sock); -//@mysql_close ($sock); +// regression +// binlog crashes on replayng commit with delete only statement +$query ( $results, "DELETE FROM kw WHERE id=1000", $sock); + +$query ( $results, "INSERT INTO crc VALUES (1, 'test work', 11)", $sock); +$query ( $results, "INSERT INTO kw VALUES (100, 'test stuff', 111)", $sock); + +$query ( $results, "SELECT * FROM crc,kw WHERE MATCH('test')", $sock ); +$query ( $results, "SELECT * FROM crc,kw", $sock ); $results[]= "killing"; KillSearchd ('config.conf', 'searchd.pid',9,false); StartSearchd ( "config.conf", "error.txt", 'searchd.pid', $error, true ); $results[] = "connecting again"; -$sock = @mysql_connect ($sockStr,'','', true ); +$sock = $make_sock( $results ); if ( $sock === false ) { - $results[] = "error: can't connect to searchd: " . @mysql_errno ( $sock ) . " : " . @mysql_error ( $sock ); return; } -$results[] = "querying"; -$res = mysql_query ( "SELECT * FROM test WHERE MATCH('test')",$sock ); -if ($res===true) - $results[] = "total affected ".mysql_affected_rows($sock); -else if ($res===false) - $results[] = "error ".@mysql_errno($sock)." : ".@mysql_error ($sock); -else - $results[] = "total found ".mysql_num_rows ($res); +$query ( $results, "SELECT * FROM crc,kw WHERE MATCH('test')", $sock ); +$query ( $results, "SELECT * FROM crc,kw", $sock ); ]]> diff -Nru sphinxsearch-0.9.9+2.0.2beta/test/test_145/model.bin sphinxsearch-2.0.4/test/test_145/model.bin --- sphinxsearch-0.9.9+2.0.2beta/test/test_145/model.bin 2011-11-15 14:01:21.000000000 +0000 +++ sphinxsearch-2.0.4/test/test_145/model.bin 2011-11-21 15:58:19.000000000 +0000 @@ -1 +1 @@ -a:1:{i:0;a:20:{i:0;a:3:{s:8:"sphinxql";s:90:"CALL SNIPPETS('click edit', 'test', '"click TO edit"', 1 AS query_mode, 1 as allow_empty )";s:10:"total_rows";i:1;s:4:"rows";a:1:{i:0;a:1:{s:7:"snippet";s:10:"click edit";}}}i:1;a:3:{s:8:"sphinxql";s:107:"CALL SNIPPETS('click word1 WITH edit', 'test', '"click TO word1 edit"', 1 AS query_mode, 1 as allow_empty )";s:10:"total_rows";i:1;s:4:"rows";a:1:{i:0;a:1:{s:7:"snippet";s:21:"click word1 WITH edit";}}}i:2;a:3:{s:8:"sphinxql";s:107:"CALL SNIPPETS('click WITH word1 edit', 'test', '"click TO word1 edit"', 1 AS query_mode, 1 as allow_empty )";s:10:"total_rows";i:1;s:4:"rows";a:1:{i:0;a:1:{s:7:"snippet";s:35:"click WITH word1 edit";}}}i:3;a:3:{s:8:"sphinxql";s:97:"CALL SNIPPETS('clicking ANY edit', 'test', '"click TO edit"', 1 AS query_mode, 1 as allow_empty )";s:10:"total_rows";i:1;s:4:"rows";a:1:{i:0;a:1:{s:7:"snippet";s:31:"clicking ANY edit";}}}i:4;a:3:{s:8:"sphinxql";s:94:"CALL SNIPPETS('click ANY edit', 'test', '"click TO edit"', 1 AS query_mode, 1 as allow_empty )";s:10:"total_rows";i:1;s:4:"rows";a:1:{i:0;a:1:{s:7:"snippet";s:28:"click ANY edit";}}}i:5;a:3:{s:8:"sphinxql";s:94:"CALL SNIPPETS('edit ANY click', 'test', '"click TO edit"', 1 AS query_mode, 1 as allow_empty )";s:10:"total_rows";i:1;s:4:"rows";a:1:{i:0;a:1:{s:7:"snippet";s:14:"edit ANY click";}}}i:6;a:3:{s:8:"sphinxql";s:113:"CALL SNIPPETS('clicking WITH ANY AND ALL TO edit', 'test', '"click TO edit"', 1 AS query_mode, 1 as allow_empty )";s:10:"total_rows";i:1;s:4:"rows";a:1:{i:0;a:1:{s:7:"snippet";s:33:"clicking WITH ANY AND ALL TO edit";}}}i:7;a:3:{s:8:"sphinxql";s:110:"CALL SNIPPETS('click WITH ANY AND ALL TO edit', 'test', '"click TO edit"', 1 AS query_mode, 1 as allow_empty )";s:10:"total_rows";i:1;s:4:"rows";a:1:{i:0;a:1:{s:7:"snippet";s:30:"click WITH ANY AND ALL TO edit";}}}i:8;a:3:{s:8:"sphinxql";s:98:"CALL SNIPPETS('either click, edit', 'test', '"click TO edit"', 1 AS query_mode, 1 as allow_empty )";s:10:"total_rows";i:1;s:4:"rows";a:1:{i:0;a:1:{s:7:"snippet";s:18:"either click, edit";}}}i:9;a:3:{s:8:"sphinxql";s:110:"CALL SNIPPETS('either click, edit', 'test', '"click TO ANY AND ALL edit"', 1 AS query_mode, 1 as allow_empty )";s:10:"total_rows";i:1;s:4:"rows";a:1:{i:0;a:1:{s:7:"snippet";s:32:"either click, edit";}}}i:10;a:3:{s:8:"sphinxql";s:90:"CALL SNIPPETS('click edit', 'test', 'click TO edit', 1 AS exact_phrase, 1 as allow_empty )";s:10:"total_rows";i:1;s:4:"rows";a:1:{i:0;a:1:{s:7:"snippet";s:10:"click edit";}}}i:11;a:3:{s:8:"sphinxql";s:107:"CALL SNIPPETS('click word1 WITH edit', 'test', 'click TO word1 edit', 1 AS exact_phrase, 1 as allow_empty )";s:10:"total_rows";i:1;s:4:"rows";a:1:{i:0;a:1:{s:7:"snippet";s:21:"click word1 WITH edit";}}}i:12;a:3:{s:8:"sphinxql";s:107:"CALL SNIPPETS('click WITH word1 edit', 'test', 'click TO word1 edit', 1 AS exact_phrase, 1 as allow_empty )";s:10:"total_rows";i:1;s:4:"rows";a:1:{i:0;a:1:{s:7:"snippet";s:28:"click WITH word1 edit";}}}i:13;a:3:{s:8:"sphinxql";s:97:"CALL SNIPPETS('clicking ANY edit', 'test', 'click TO edit', 1 AS exact_phrase, 1 as allow_empty )";s:10:"total_rows";i:1;s:4:"rows";a:1:{i:0;a:1:{s:7:"snippet";s:24:"clicking ANY edit";}}}i:14;a:3:{s:8:"sphinxql";s:94:"CALL SNIPPETS('click ANY edit', 'test', 'click TO edit', 1 AS exact_phrase, 1 as allow_empty )";s:10:"total_rows";i:1;s:4:"rows";a:1:{i:0;a:1:{s:7:"snippet";s:21:"click ANY edit";}}}i:15;a:3:{s:8:"sphinxql";s:94:"CALL SNIPPETS('edit ANY click', 'test', 'click TO edit', 1 AS exact_phrase, 1 as allow_empty )";s:10:"total_rows";i:1;s:4:"rows";a:1:{i:0;a:1:{s:7:"snippet";s:14:"edit ANY click";}}}i:16;a:3:{s:8:"sphinxql";s:113:"CALL SNIPPETS('clicking WITH ANY AND ALL TO edit', 'test', 'click TO edit', 1 AS exact_phrase, 1 as allow_empty )";s:10:"total_rows";i:1;s:4:"rows";a:1:{i:0;a:1:{s:7:"snippet";s:33:"clicking WITH ANY AND ALL TO edit";}}}i:17;a:3:{s:8:"sphinxql";s:110:"CALL SNIPPETS('click WITH ANY AND ALL TO edit', 'test', 'click TO edit', 1 AS exact_phrase, 1 as allow_empty )";s:10:"total_rows";i:1;s:4:"rows";a:1:{i:0;a:1:{s:7:"snippet";s:30:"click WITH ANY AND ALL TO edit";}}}i:18;a:3:{s:8:"sphinxql";s:98:"CALL SNIPPETS('either click, edit', 'test', 'click TO edit', 1 AS exact_phrase, 1 as allow_empty )";s:10:"total_rows";i:1;s:4:"rows";a:1:{i:0;a:1:{s:7:"snippet";s:18:"either click, edit";}}}i:19;a:3:{s:8:"sphinxql";s:110:"CALL SNIPPETS('either click, edit', 'test', 'click TO ANY AND ALL edit', 1 AS exact_phrase, 1 as allow_empty )";s:10:"total_rows";i:1;s:4:"rows";a:1:{i:0;a:1:{s:7:"snippet";s:25:"either click, edit";}}}}} \ No newline at end of file +a:1:{i:0;a:20:{i:0;a:3:{s:8:"sphinxql";s:72:"CALL SNIPPETS('click edit', 'test', '"click TO edit"', 1 AS query_mode )";s:10:"total_rows";i:1;s:4:"rows";a:1:{i:0;a:1:{s:7:"snippet";s:10:"click edit";}}}i:1;a:3:{s:8:"sphinxql";s:89:"CALL SNIPPETS('click word1 WITH edit', 'test', '"click TO word1 edit"', 1 AS query_mode )";s:10:"total_rows";i:1;s:4:"rows";a:1:{i:0;a:1:{s:7:"snippet";s:21:"click word1 WITH edit";}}}i:2;a:3:{s:8:"sphinxql";s:89:"CALL SNIPPETS('click WITH word1 edit', 'test', '"click TO word1 edit"', 1 AS query_mode )";s:10:"total_rows";i:1;s:4:"rows";a:1:{i:0;a:1:{s:7:"snippet";s:35:"click WITH word1 edit";}}}i:3;a:3:{s:8:"sphinxql";s:79:"CALL SNIPPETS('clicking ANY edit', 'test', '"click TO edit"', 1 AS query_mode )";s:10:"total_rows";i:1;s:4:"rows";a:1:{i:0;a:1:{s:7:"snippet";s:31:"clicking ANY edit";}}}i:4;a:3:{s:8:"sphinxql";s:76:"CALL SNIPPETS('click ANY edit', 'test', '"click TO edit"', 1 AS query_mode )";s:10:"total_rows";i:1;s:4:"rows";a:1:{i:0;a:1:{s:7:"snippet";s:28:"click ANY edit";}}}i:5;a:3:{s:8:"sphinxql";s:76:"CALL SNIPPETS('edit ANY click', 'test', '"click TO edit"', 1 AS query_mode )";s:10:"total_rows";i:1;s:4:"rows";a:1:{i:0;a:1:{s:7:"snippet";s:14:"edit ANY click";}}}i:6;a:3:{s:8:"sphinxql";s:95:"CALL SNIPPETS('clicking WITH ANY AND ALL TO edit', 'test', '"click TO edit"', 1 AS query_mode )";s:10:"total_rows";i:1;s:4:"rows";a:1:{i:0;a:1:{s:7:"snippet";s:33:"clicking WITH ANY AND ALL TO edit";}}}i:7;a:3:{s:8:"sphinxql";s:92:"CALL SNIPPETS('click WITH ANY AND ALL TO edit', 'test', '"click TO edit"', 1 AS query_mode )";s:10:"total_rows";i:1;s:4:"rows";a:1:{i:0;a:1:{s:7:"snippet";s:30:"click WITH ANY AND ALL TO edit";}}}i:8;a:3:{s:8:"sphinxql";s:80:"CALL SNIPPETS('either click, edit', 'test', '"click TO edit"', 1 AS query_mode )";s:10:"total_rows";i:1;s:4:"rows";a:1:{i:0;a:1:{s:7:"snippet";s:18:"either click, edit";}}}i:9;a:3:{s:8:"sphinxql";s:92:"CALL SNIPPETS('either click, edit', 'test', '"click TO ANY AND ALL edit"', 1 AS query_mode )";s:10:"total_rows";i:1;s:4:"rows";a:1:{i:0;a:1:{s:7:"snippet";s:32:"either click, edit";}}}i:10;a:3:{s:8:"sphinxql";s:72:"CALL SNIPPETS('click edit', 'test', 'click TO edit', 1 AS exact_phrase )";s:10:"total_rows";i:1;s:4:"rows";a:1:{i:0;a:1:{s:7:"snippet";s:10:"click edit";}}}i:11;a:3:{s:8:"sphinxql";s:89:"CALL SNIPPETS('click word1 WITH edit', 'test', 'click TO word1 edit', 1 AS exact_phrase )";s:10:"total_rows";i:1;s:4:"rows";a:1:{i:0;a:1:{s:7:"snippet";s:21:"click word1 WITH edit";}}}i:12;a:3:{s:8:"sphinxql";s:89:"CALL SNIPPETS('click WITH word1 edit', 'test', 'click TO word1 edit', 1 AS exact_phrase )";s:10:"total_rows";i:1;s:4:"rows";a:1:{i:0;a:1:{s:7:"snippet";s:28:"click WITH word1 edit";}}}i:13;a:3:{s:8:"sphinxql";s:79:"CALL SNIPPETS('clicking ANY edit', 'test', 'click TO edit', 1 AS exact_phrase )";s:10:"total_rows";i:1;s:4:"rows";a:1:{i:0;a:1:{s:7:"snippet";s:24:"clicking ANY edit";}}}i:14;a:3:{s:8:"sphinxql";s:76:"CALL SNIPPETS('click ANY edit', 'test', 'click TO edit', 1 AS exact_phrase )";s:10:"total_rows";i:1;s:4:"rows";a:1:{i:0;a:1:{s:7:"snippet";s:21:"click ANY edit";}}}i:15;a:3:{s:8:"sphinxql";s:76:"CALL SNIPPETS('edit ANY click', 'test', 'click TO edit', 1 AS exact_phrase )";s:10:"total_rows";i:1;s:4:"rows";a:1:{i:0;a:1:{s:7:"snippet";s:14:"edit ANY click";}}}i:16;a:3:{s:8:"sphinxql";s:95:"CALL SNIPPETS('clicking WITH ANY AND ALL TO edit', 'test', 'click TO edit', 1 AS exact_phrase )";s:10:"total_rows";i:1;s:4:"rows";a:1:{i:0;a:1:{s:7:"snippet";s:33:"clicking WITH ANY AND ALL TO edit";}}}i:17;a:3:{s:8:"sphinxql";s:92:"CALL SNIPPETS('click WITH ANY AND ALL TO edit', 'test', 'click TO edit', 1 AS exact_phrase )";s:10:"total_rows";i:1;s:4:"rows";a:1:{i:0;a:1:{s:7:"snippet";s:30:"click WITH ANY AND ALL TO edit";}}}i:18;a:3:{s:8:"sphinxql";s:80:"CALL SNIPPETS('either click, edit', 'test', 'click TO edit', 1 AS exact_phrase )";s:10:"total_rows";i:1;s:4:"rows";a:1:{i:0;a:1:{s:7:"snippet";s:18:"either click, edit";}}}i:19;a:3:{s:8:"sphinxql";s:92:"CALL SNIPPETS('either click, edit', 'test', 'click TO ANY AND ALL edit', 1 AS exact_phrase )";s:10:"total_rows";i:1;s:4:"rows";a:1:{i:0;a:1:{s:7:"snippet";s:25:"either click, edit";}}}}} \ No newline at end of file diff -Nru sphinxsearch-0.9.9+2.0.2beta/test/test_145/test.xml sphinxsearch-2.0.4/test/test_145/test.xml --- sphinxsearch-0.9.9+2.0.2beta/test/test_145/test.xml 2011-11-15 14:01:21.000000000 +0000 +++ sphinxsearch-2.0.4/test/test_145/test.xml 2011-11-21 15:58:19.000000000 +0000 @@ -34,32 +34,32 @@ -CALL SNIPPETS('click edit', 'test', '"click TO edit"', 1 AS query_mode, 1 as allow_empty ) -CALL SNIPPETS('click word1 WITH edit', 'test', '"click TO word1 edit"', 1 AS query_mode, 1 as allow_empty ) -CALL SNIPPETS('click WITH word1 edit', 'test', '"click TO word1 edit"', 1 AS query_mode, 1 as allow_empty ) - -CALL SNIPPETS('clicking ANY edit', 'test', '"click TO edit"', 1 AS query_mode, 1 as allow_empty ) -CALL SNIPPETS('click ANY edit', 'test', '"click TO edit"', 1 AS query_mode, 1 as allow_empty ) -CALL SNIPPETS('edit ANY click', 'test', '"click TO edit"', 1 AS query_mode, 1 as allow_empty ) -CALL SNIPPETS('clicking WITH ANY AND ALL TO edit', 'test', '"click TO edit"', 1 AS query_mode, 1 as allow_empty ) -CALL SNIPPETS('click WITH ANY AND ALL TO edit', 'test', '"click TO edit"', 1 AS query_mode, 1 as allow_empty ) +CALL SNIPPETS('click edit', 'test', '"click TO edit"', 1 AS query_mode ) +CALL SNIPPETS('click word1 WITH edit', 'test', '"click TO word1 edit"', 1 AS query_mode ) +CALL SNIPPETS('click WITH word1 edit', 'test', '"click TO word1 edit"', 1 AS query_mode ) + +CALL SNIPPETS('clicking ANY edit', 'test', '"click TO edit"', 1 AS query_mode ) +CALL SNIPPETS('click ANY edit', 'test', '"click TO edit"', 1 AS query_mode ) +CALL SNIPPETS('edit ANY click', 'test', '"click TO edit"', 1 AS query_mode ) +CALL SNIPPETS('clicking WITH ANY AND ALL TO edit', 'test', '"click TO edit"', 1 AS query_mode ) +CALL SNIPPETS('click WITH ANY AND ALL TO edit', 'test', '"click TO edit"', 1 AS query_mode ) -CALL SNIPPETS('either click, edit', 'test', '"click TO edit"', 1 AS query_mode, 1 as allow_empty ) -CALL SNIPPETS('either click, edit', 'test', '"click TO ANY AND ALL edit"', 1 AS query_mode, 1 as allow_empty ) +CALL SNIPPETS('either click, edit', 'test', '"click TO edit"', 1 AS query_mode ) +CALL SNIPPETS('either click, edit', 'test', '"click TO ANY AND ALL edit"', 1 AS query_mode ) -CALL SNIPPETS('click edit', 'test', 'click TO edit', 1 AS exact_phrase, 1 as allow_empty ) -CALL SNIPPETS('click word1 WITH edit', 'test', 'click TO word1 edit', 1 AS exact_phrase, 1 as allow_empty ) -CALL SNIPPETS('click WITH word1 edit', 'test', 'click TO word1 edit', 1 AS exact_phrase, 1 as allow_empty ) - -CALL SNIPPETS('clicking ANY edit', 'test', 'click TO edit', 1 AS exact_phrase, 1 as allow_empty ) -CALL SNIPPETS('click ANY edit', 'test', 'click TO edit', 1 AS exact_phrase, 1 as allow_empty ) -CALL SNIPPETS('edit ANY click', 'test', 'click TO edit', 1 AS exact_phrase, 1 as allow_empty ) -CALL SNIPPETS('clicking WITH ANY AND ALL TO edit', 'test', 'click TO edit', 1 AS exact_phrase, 1 as allow_empty ) -CALL SNIPPETS('click WITH ANY AND ALL TO edit', 'test', 'click TO edit', 1 AS exact_phrase, 1 as allow_empty ) +CALL SNIPPETS('click edit', 'test', 'click TO edit', 1 AS exact_phrase ) +CALL SNIPPETS('click word1 WITH edit', 'test', 'click TO word1 edit', 1 AS exact_phrase ) +CALL SNIPPETS('click WITH word1 edit', 'test', 'click TO word1 edit', 1 AS exact_phrase ) + +CALL SNIPPETS('clicking ANY edit', 'test', 'click TO edit', 1 AS exact_phrase ) +CALL SNIPPETS('click ANY edit', 'test', 'click TO edit', 1 AS exact_phrase ) +CALL SNIPPETS('edit ANY click', 'test', 'click TO edit', 1 AS exact_phrase ) +CALL SNIPPETS('clicking WITH ANY AND ALL TO edit', 'test', 'click TO edit', 1 AS exact_phrase ) +CALL SNIPPETS('click WITH ANY AND ALL TO edit', 'test', 'click TO edit', 1 AS exact_phrase ) -CALL SNIPPETS('either click, edit', 'test', 'click TO edit', 1 AS exact_phrase, 1 as allow_empty ) -CALL SNIPPETS('either click, edit', 'test', 'click TO ANY AND ALL edit', 1 AS exact_phrase, 1 as allow_empty ) +CALL SNIPPETS('either click, edit', 'test', 'click TO edit', 1 AS exact_phrase ) +CALL SNIPPETS('either click, edit', 'test', 'click TO ANY AND ALL edit', 1 AS exact_phrase ) diff -Nru sphinxsearch-0.9.9+2.0.2beta/test/test_160/model.bin sphinxsearch-2.0.4/test/test_160/model.bin --- sphinxsearch-0.9.9+2.0.2beta/test/test_160/model.bin 2011-06-25 08:19:41.000000000 +0000 +++ sphinxsearch-2.0.4/test/test_160/model.bin 2012-01-13 08:35:18.000000000 +0000 @@ -1 +1 @@ -a:1:{i:0;a:1:{i:0;a:47:{i:0;s:58:"[pass] (query/result=q/r) (fast path=1/0) (query_mode=1/0)";s:4:"[0]q";s:16:"ZONE:zoneA these";s:8:"[0]r 0 0";s:48:"these words and these to are cool ";s:8:"[0]r 1 0";s:48:"these words and these to are cool ";s:4:"[1]q";s:16:"ZONE:zoneB these";s:8:"[1]r 0 0";s:48:"these words and these to are cool ";s:8:"[1]r 1 0";s:48:"these words and these to are cool ";s:4:"[2]q";s:23:"ZONE:(zoneA, zoneB) th*";s:8:"[2]r 0 0";s:48:"these words and these to are cool ";s:8:"[2]r 1 0";s:48:"these words and these to are cool ";s:4:"[3]q";s:23:"ZONE:(zoneA, zoneB) are";s:8:"[3]r 0 0";s:41:"these words and these to are cool ";s:8:"[3]r 1 0";s:41:"these words and these to are cool ";s:4:"[4]q";s:20:"ZONE:zoneZZ a* cool$";s:8:"[4]r 0 0";s:55:"these words and these to are cool ";s:8:"[4]r 1 0";s:55:"these words and these to are cool ";s:4:"[5]q";s:18:"ZONE:zoneZZ to* a*";s:8:"[5]r 0 0";s:55:"these words and these to are cool ";s:8:"[5]r 1 0";s:55:"these words and these to are cool ";s:4:"[6]q";s:16:"ZONE:zoneA these";s:8:"[6]r 0 1";s:41:"these words and these to are cool ";s:8:"[6]r 1 1";s:41:"these words and these to are cool ";s:4:"[7]q";s:16:"ZONE:zoneB these";s:8:"[7]r 0 1";s:41:"these words and these to are cool ";s:8:"[7]r 1 1";s:41:"these words and these to are cool ";s:4:"[8]q";s:23:"ZONE:(zoneA, zoneB) th*";s:8:"[8]r 0 1";N;s:8:"[8]r 1 1";N;s:4:"[9]q";s:23:"ZONE:(zoneA, zoneB) are";s:8:"[9]r 0 1";N;s:8:"[9]r 1 1";N;s:5:"[10]q";s:20:"ZONE:zoneZZ a* cool$";s:9:"[10]r 0 1";s:55:"these words and these to are cool ";s:9:"[10]r 1 1";s:48:"these words and these to are cool ";s:5:"[11]q";s:18:"ZONE:zoneZZ to* a*";s:9:"[11]r 0 1";s:55:"these words and these to are cool ";s:9:"[11]r 1 1";s:55:"these words and these to are cool ";i:1;a:2:{i:0;s:16:"small doc";i:1;s:8:"one more";}i:2;a:2:{i:0;s:48:" ... words and these to are cool ";s:15:"html_strip_mode";s:5:"index";}i:3;a:2:{i:0;s:48:" ... words and these to are cool ";s:15:"html_strip_mode";s:5:"strip";}i:4;a:3:{i:0;s:75:" ... these words ... and these to ... are cool ... ";s:15:"html_strip_mode";s:5:"index";s:16:"passage_boundary";s:4:"zone";}i:5;a:3:{i:0;s:54:" ... these words ... and these to ... ";s:15:"html_strip_mode";s:5:"strip";s:16:"passage_boundary";s:4:"zone";}i:6;a:3:{i:0;s:98:" these words and these to are cool ";i:1;s:87:" these words and these to are cool ";s:4:"zone";s:6:"zoneZZ";}i:7;a:3:{i:0;s:91:" these words and these to are cool ";i:1;s:73:" these words and these to are cool ";s:4:"zone";s:5:"ZoneB";}i:8;a:3:{i:0;s:98:" these words and these to are cool ";i:1;s:73:" these words and these to are cool ";s:8:"boundary";s:9:"paragraph";}i:9;a:1:{i:0;s:35:"tokenizer filter crash at lc";}i:10;a:1:{i:0;s:59:"dog dummy! as the house nearby the dog";}}}} \ No newline at end of file +a:1:{i:0;a:1:{i:0;a:55:{i:0;s:58:"[pass] (query/result=q/r) (fast path=1/0) (query_mode=1/0)";s:4:"[0]q";s:16:"ZONE:zoneA these";s:8:"[0]r 0 0";s:48:"these words and these to are cool ";s:8:"[0]r 1 0";s:48:"these words and these to are cool ";s:4:"[1]q";s:16:"ZONE:zoneB these";s:8:"[1]r 0 0";s:48:"these words and these to are cool ";s:8:"[1]r 1 0";s:48:"these words and these to are cool ";s:4:"[2]q";s:23:"ZONE:(zoneA, zoneB) th*";s:8:"[2]r 0 0";s:48:"these words and these to are cool ";s:8:"[2]r 1 0";s:48:"these words and these to are cool ";s:4:"[3]q";s:23:"ZONE:(zoneA, zoneB) are";s:8:"[3]r 0 0";s:41:"these words and these to are cool ";s:8:"[3]r 1 0";s:41:"these words and these to are cool ";s:4:"[4]q";s:20:"ZONE:zoneZZ a* cool$";s:8:"[4]r 0 0";s:55:"these words and these to are cool ";s:8:"[4]r 1 0";s:55:"these words and these to are cool ";s:4:"[5]q";s:18:"ZONE:zoneZZ to* a*";s:8:"[5]r 0 0";s:55:"these words and these to are cool ";s:8:"[5]r 1 0";s:55:"these words and these to are cool ";s:4:"[6]q";s:16:"ZONE:zoneA these";s:8:"[6]r 0 1";s:41:"these words and these to are cool ";s:8:"[6]r 1 1";s:41:"these words and these to are cool ";s:4:"[7]q";s:16:"ZONE:zoneB these";s:8:"[7]r 0 1";s:41:"these words and these to are cool ";s:8:"[7]r 1 1";s:41:"these words and these to are cool ";s:4:"[8]q";s:23:"ZONE:(zoneA, zoneB) th*";s:8:"[8]r 0 1";N;s:8:"[8]r 1 1";N;s:4:"[9]q";s:23:"ZONE:(zoneA, zoneB) are";s:8:"[9]r 0 1";N;s:8:"[9]r 1 1";N;s:5:"[10]q";s:20:"ZONE:zoneZZ a* cool$";s:9:"[10]r 0 1";s:55:"these words and these to are cool ";s:9:"[10]r 1 1";s:48:"these words and these to are cool ";s:5:"[11]q";s:18:"ZONE:zoneZZ to* a*";s:9:"[11]r 0 1";s:55:"these words and these to are cool ";s:9:"[11]r 1 1";s:55:"these words and these to are cool ";i:1;a:2:{i:0;s:16:"small doc";i:1;s:8:"one more";}i:2;a:2:{i:0;s:48:" ... words and these to are cool ";s:15:"html_strip_mode";s:5:"index";}i:3;a:2:{i:0;s:48:" ... words and these to are cool ";s:15:"html_strip_mode";s:5:"strip";}i:4;a:3:{i:0;s:75:" ... these words ... and these to ... are cool ... ";s:15:"html_strip_mode";s:5:"index";s:16:"passage_boundary";s:4:"zone";}i:5;a:3:{i:0;s:54:" ... these words ... and these to ... ";s:15:"html_strip_mode";s:5:"strip";s:16:"passage_boundary";s:4:"zone";}i:6;a:3:{i:0;s:98:" these words and these to are cool ";i:1;s:87:" these words and these to are cool ";s:4:"zone";s:6:"zoneZZ";}i:7;a:3:{i:0;s:91:" these words and these to are cool ";i:1;s:73:" these words and these to are cool ";s:4:"zone";s:5:"ZoneB";}i:8;a:3:{i:0;s:98:" these words and these to are cool ";i:1;s:73:" these words and these to are cool ";s:8:"boundary";s:9:"paragraph";}i:9;a:1:{i:0;s:35:"tokenizer filter crash at lc";}i:10;a:1:{i:0;s:59:"dog dummy! as the house nearby the dog";}i:11;a:1:{i:0;s:104:" ... is going here then store sales, which were going before of store closes. ... ";}i:12;a:1:{i:0;s:200:"Ultra long stuff is going here then store sales, which were going before of store closes. Same store sales for the quarter increased as ultra long dust was here since univerce was born. ";}i:13;a:1:{i:0;s:140:" ... going here then store sales, which were going before of store closes ... store closes as usual ... ";}i:14;a:1:{i:0;s:239:"Ultra long stuff is going here then store sales, which were going before of store closes. Same store sales for the quarter increased as ultra long dust was here since univerce was born. And again store closes as usual ";}i:15;a:1:{i:0;s:239:"Ultra long stuff is going here then store sales, which were going before of store closes. Same store sales for the quarter increased as ultra long dust was here since univerce was born. And again store closes as usual ";}i:16;a:1:{i:0;s:246:"Ultra long stuff is going here then store sales, which were going before of store closes. Same store sales for the quarter increased as ultra long dust was here since univerce was born. And again store closes as usual ";}i:17;a:1:{i:0;s:247:"Ultra long stuff is going here then store sales, which were going before of store closes.

                                                                    Same store sales for the quarter increased as ultra long dust was here since univerce was born.

                                                                    And again store closes as usual ";}i:18;a:1:{i:0;s:247:"Ultra long stuff is going here then store sales, which were going before of store closes.

                                                                    Same store sales for the quarter increased as ultra long dust was here since univerce was born.

                                                                    And again store closes as usual ";}}}} \ No newline at end of file diff -Nru sphinxsearch-0.9.9+2.0.2beta/test/test_160/test.xml sphinxsearch-2.0.4/test/test_160/test.xml --- sphinxsearch-0.9.9+2.0.2beta/test/test_160/test.xml 2011-11-15 14:01:21.000000000 +0000 +++ sphinxsearch-2.0.4/test/test_160/test.xml 2012-01-13 08:35:18.000000000 +0000 @@ -1,7 +1,7 @@ -snippets vs zones +snippets vs SPZ @@ -59,7 +59,7 @@ $results = array(); -$opts = array ( 'passage_boundary'=>'zone', 'limit'=>0, 'allow_empty'=>1 ); +$opts = array ( 'passage_boundary'=>'zone', 'limit'=>0 ); $docs = array(' these words and these to are cool '); $pass = 0; @@ -81,10 +81,10 @@ } } -$results[] = $client->BuildExcerpts(array('small doc', 'one more'), 'multiform', 'crash on tokenizer from another doc', array ('query_mode'=>0, 'allow_empty'=>1 ) ); +$results[] = $client->BuildExcerpts(array('small doc', 'one more'), 'multiform', 'crash on tokenizer from another doc', array ('query_mode'=>0) ); // another regression - zone transformed by stripper in result set -$opts = array ( 'query_mode'=>1, 'limit_words'=>6, 'allow_empty'=>1 ); +$opts = array ( 'query_mode'=>1, 'limit_words'=>6 ); $opts['html_strip_mode'] = 'index'; $res = $client->BuildExcerpts($docs, 'test', 'these | are', $opts); @@ -114,7 +114,7 @@ ' these words and these to are cool ', ' these words and these to are cool ' ); -$opts = array ( 'limit'=>0, 'html_strip_mode'=>'retain', 'query_mode'=>1, 'allow_empty'=>1 ); +$opts = array ( 'limit'=>0, 'html_strip_mode'=>'retain', 'query_mode'=>1 ); $res = $client->BuildExcerpts($docs, 'test', 'ZONE:zoneZZ these', $opts); $res['zone'] = 'zoneZZ'; @@ -133,6 +133,26 @@ $results[] = $client->BuildExcerpts(array('dog dummy! as the house nearby the dog'), 'test', 'the. dog? as', array ('query_mode'=>1, 'html_strip_mode'=>'retain', 'limit'=>0) ); + +// regression head SPZ overgrow + non fast path SPZ + +$docs = array ( 'Ultra long stuff is going here then store sales, which were going before of store closes. Same store sales for the quarter increased as ultra long dust was here since univerce was born. ' ); +$results[] = $client->BuildExcerpts ( $docs, 'test', '(store SENTENCE closes)', array ( 'query_mode'=>1, 'passage_boundary'=>'sentence', 'limit'=>90 ) ); +$results[] = $client->BuildExcerpts ( $docs, 'test', '(store SENTENCE closes)', array ( 'query_mode'=>1, 'passage_boundary'=>'sentence', 'limit'=>0 ) ); + +$docs = array ( 'Ultra long stuff is going here then store sales, which were going before of store closes. Same store sales for the quarter increased as ultra long dust was here since univerce was born. And again store closes as usual ' ); +$results[] = $client->BuildExcerpts ( $docs, 'test', '(store SENTENCE closes)', array ( 'query_mode'=>1, 'passage_boundary'=>'sentence', 'limit'=>90 ) ); +$results[] = $client->BuildExcerpts ( $docs, 'test', '(store SENTENCE closes)', array ( 'query_mode'=>1, 'passage_boundary'=>'sentence', 'limit'=>0 ) ); + +// regression fast path SPZ vs html_strip_mode = retain +$docs = array ( 'Ultra long stuff is going here then store sales, which were going before of store closes. Same store sales for the quarter increased as ultra long dust was here since univerce was born. And again store closes as usual ' ); +$results[] = $client->BuildExcerpts ( $docs, 'test', '(store SENTENCE closes)', array ( 'query_mode'=>1, 'html_strip_mode'=>'retain', 'limit'=>0 ) ); +$results[] = $client->BuildExcerpts ( $docs, 'test', '(store PARAGRAPH closes)', array ( 'query_mode'=>1, 'html_strip_mode'=>'retain', 'limit'=>0 ) ); + +$docs = array ( 'Ultra long stuff is going here then store sales, which were going before of store closes.

                                                                    Same store sales for the quarter increased as ultra long dust was here since univerce was born.

                                                                    And again store closes as usual ' ); +$results[] = $client->BuildExcerpts ( $docs, 'test', '(store SENTENCE closes)', array ( 'query_mode'=>1, 'html_strip_mode'=>'retain', 'limit'=>0 ) ); +$results[] = $client->BuildExcerpts ( $docs, 'test', '(store PARAGRAPH closes)', array ( 'query_mode'=>1, 'html_strip_mode'=>'retain', 'limit'=>0 ) ); + ]]> diff -Nru sphinxsearch-0.9.9+2.0.2beta/test/test_164/model.bin sphinxsearch-2.0.4/test/test_164/model.bin --- sphinxsearch-0.9.9+2.0.2beta/test/test_164/model.bin 2011-01-18 22:01:17.000000000 +0000 +++ sphinxsearch-2.0.4/test/test_164/model.bin 2012-01-31 17:15:46.000000000 +0000 @@ -1 +1 @@ -a:8:{i:0;a:9:{i:0;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:1;a:2:{s:6:"weight";s:4:"1680";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:6:"simple";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:6:"simple";}i:1;a:12:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:5:"total";s:1:"0";s:11:"total_found";s:1:"0";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:7:"@simple";a:2:{s:4:"docs";s:1:"0";s:4:"hits";s:1:"0";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:8:"\@simple";}i:2;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:1;a:2:{s:6:"weight";s:4:"1680";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:8:"@simple!";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:10:"\@simple\!";}i:3;a:12:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:5:"total";s:1:"0";s:11:"total_found";s:1:"0";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:7:"simple!";a:2:{s:4:"docs";s:1:"0";s:4:"hits";s:1:"0";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:8:"simple\!";}i:4;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:2;a:2:{s:6:"weight";s:4:"2590";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.000";s:5:"words";a:2:{s:3:"hey";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"2";}s:6:"@dude!";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:14:""hey" "@dude!"";}i:5;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:2:{i:2;a:2:{s:6:"weight";s:4:"2500";s:5:"attrs";a:0:{}}i:3;a:2:{s:6:"weight";s:4:"2500";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"2";s:11:"total_found";s:1:"2";s:4:"time";s:5:"0.000";s:5:"words";a:2:{s:4:"dude";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"2";}s:6:"a-team";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"2";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:13:""dude a-team"";}i:6;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:2:{i:2;a:2:{s:6:"weight";s:4:"2500";s:5:"attrs";a:0:{}}i:3;a:2:{s:6:"weight";s:4:"2500";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"2";s:11:"total_found";s:1:"2";s:4:"time";s:5:"0.000";s:5:"words";a:2:{s:6:"a-team";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"2";}s:3:"was";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"2";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:12:""a-team was"";}i:7;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:3;a:2:{s:6:"weight";s:4:"1680";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:5:"@@!!!";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:7:""@@!!!"";}i:8;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:3;a:2:{s:6:"weight";s:4:"3560";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.001";s:5:"words";a:3:{s:3:"was";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"2";}s:5:"@@!!!";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}s:7:"awesome";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"2";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:19:""was @@!!! awesome"";}}i:1;a:9:{i:0;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:1;a:2:{s:6:"weight";s:4:"1680";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:6:"simple";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:6:"simple";}i:1;a:12:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:5:"total";s:1:"0";s:11:"total_found";s:1:"0";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:7:"@simple";a:2:{s:4:"docs";s:1:"0";s:4:"hits";s:1:"0";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:8:"\@simple";}i:2;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:1;a:2:{s:6:"weight";s:4:"1680";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:8:"@simple!";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:10:"\@simple\!";}i:3;a:12:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:5:"total";s:1:"0";s:11:"total_found";s:1:"0";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:7:"simple!";a:2:{s:4:"docs";s:1:"0";s:4:"hits";s:1:"0";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:8:"simple\!";}i:4;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:2;a:2:{s:6:"weight";s:4:"2590";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.000";s:5:"words";a:2:{s:3:"hey";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"2";}s:6:"@dude!";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:14:""hey" "@dude!"";}i:5;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:2:{i:2;a:2:{s:6:"weight";s:4:"2500";s:5:"attrs";a:0:{}}i:3;a:2:{s:6:"weight";s:4:"2500";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"2";s:11:"total_found";s:1:"2";s:4:"time";s:5:"0.000";s:5:"words";a:2:{s:4:"dude";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"2";}s:6:"a-team";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"2";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:13:""dude a-team"";}i:6;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:2:{i:2;a:2:{s:6:"weight";s:4:"2500";s:5:"attrs";a:0:{}}i:3;a:2:{s:6:"weight";s:4:"2500";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"2";s:11:"total_found";s:1:"2";s:4:"time";s:5:"0.000";s:5:"words";a:2:{s:6:"a-team";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"2";}s:3:"was";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"2";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:12:""a-team was"";}i:7;a:11:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:5:"total";s:1:"0";s:11:"total_found";s:1:"0";s:4:"time";s:5:"0.000";s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:7:""@@!!!"";}i:8;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:2:{i:2;a:2:{s:6:"weight";s:4:"2500";s:5:"attrs";a:0:{}}i:3;a:2:{s:6:"weight";s:4:"2500";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"2";s:11:"total_found";s:1:"2";s:4:"time";s:5:"0.000";s:5:"words";a:2:{s:3:"was";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"2";}s:7:"awesome";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"2";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:19:""was @@!!! awesome"";}}i:2;a:9:{i:0;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:1;a:2:{s:6:"weight";s:4:"1680";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:6:"simple";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:6:"simple";}i:1;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:1;a:2:{s:6:"weight";s:4:"1680";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:7:"@simple";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:8:"\@simple";}i:2;a:12:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:5:"total";s:1:"0";s:11:"total_found";s:1:"0";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:8:"@simple!";a:2:{s:4:"docs";s:1:"0";s:4:"hits";s:1:"0";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:10:"\@simple\!";}i:3;a:12:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:5:"total";s:1:"0";s:11:"total_found";s:1:"0";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:7:"simple!";a:2:{s:4:"docs";s:1:"0";s:4:"hits";s:1:"0";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:8:"simple\!";}i:4;a:12:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:5:"total";s:1:"0";s:11:"total_found";s:1:"0";s:4:"time";s:5:"0.000";s:5:"words";a:2:{s:3:"hey";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"2";}s:6:"@dude!";a:2:{s:4:"docs";s:1:"0";s:4:"hits";s:1:"0";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:14:""hey" "@dude!"";}i:5;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:2:{i:2;a:2:{s:6:"weight";s:4:"2500";s:5:"attrs";a:0:{}}i:3;a:2:{s:6:"weight";s:4:"2500";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"2";s:11:"total_found";s:1:"2";s:4:"time";s:5:"0.000";s:5:"words";a:2:{s:4:"dude";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"2";}s:6:"a-team";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"2";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:13:""dude a-team"";}i:6;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:2:{i:2;a:2:{s:6:"weight";s:4:"2500";s:5:"attrs";a:0:{}}i:3;a:2:{s:6:"weight";s:4:"2500";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"2";s:11:"total_found";s:1:"2";s:4:"time";s:5:"0.000";s:5:"words";a:2:{s:6:"a-team";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"2";}s:3:"was";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"2";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:12:""a-team was"";}i:7;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:3;a:2:{s:6:"weight";s:4:"1680";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:5:"@@!!!";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:7:""@@!!!"";}i:8;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:3;a:2:{s:6:"weight";s:4:"3560";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.000";s:5:"words";a:3:{s:3:"was";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"2";}s:5:"@@!!!";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}s:7:"awesome";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"3";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:19:""was @@!!! awesome"";}}i:3;a:9:{i:0;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:1;a:2:{s:6:"weight";s:4:"1680";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:6:"simple";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:6:"simple";}i:1;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:1;a:2:{s:6:"weight";s:4:"1680";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:7:"@simple";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:8:"\@simple";}i:2;a:12:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:5:"total";s:1:"0";s:11:"total_found";s:1:"0";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:8:"@simple!";a:2:{s:4:"docs";s:1:"0";s:4:"hits";s:1:"0";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:10:"\@simple\!";}i:3;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:1;a:2:{s:6:"weight";s:4:"1680";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:7:"simple!";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:8:"simple\!";}i:4;a:12:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:5:"total";s:1:"0";s:11:"total_found";s:1:"0";s:4:"time";s:5:"0.000";s:5:"words";a:2:{s:3:"hey";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"2";}s:6:"@dude!";a:2:{s:4:"docs";s:1:"0";s:4:"hits";s:1:"0";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:14:""hey" "@dude!"";}i:5;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:2:{i:2;a:2:{s:6:"weight";s:4:"2500";s:5:"attrs";a:0:{}}i:3;a:2:{s:6:"weight";s:4:"2500";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"2";s:11:"total_found";s:1:"2";s:4:"time";s:5:"0.000";s:5:"words";a:2:{s:4:"dude";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"2";}s:6:"a-team";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"2";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:13:""dude a-team"";}i:6;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:2:{i:2;a:2:{s:6:"weight";s:4:"2500";s:5:"attrs";a:0:{}}i:3;a:2:{s:6:"weight";s:4:"2500";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"2";s:11:"total_found";s:1:"2";s:4:"time";s:5:"0.000";s:5:"words";a:2:{s:6:"a-team";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"2";}s:3:"was";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"2";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:12:""a-team was"";}i:7;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:3;a:2:{s:6:"weight";s:4:"1680";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:5:"@@!!!";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:7:""@@!!!"";}i:8;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:3;a:2:{s:6:"weight";s:4:"3560";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.001";s:5:"words";a:3:{s:3:"was";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"2";}s:5:"@@!!!";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}s:7:"awesome";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"3";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:19:""was @@!!! awesome"";}}i:4;a:9:{i:0;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:1;a:2:{s:6:"weight";s:4:"1680";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:6:"simple";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:6:"simple";}i:1;a:12:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:5:"total";s:1:"0";s:11:"total_found";s:1:"0";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:7:"@simple";a:2:{s:4:"docs";s:1:"0";s:4:"hits";s:1:"0";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:8:"\@simple";}i:2;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:1;a:2:{s:6:"weight";s:4:"1680";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:8:"@simple!";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:10:"\@simple\!";}i:3;a:12:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:5:"total";s:1:"0";s:11:"total_found";s:1:"0";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:7:"simple!";a:2:{s:4:"docs";s:1:"0";s:4:"hits";s:1:"0";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:8:"simple\!";}i:4;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:2;a:2:{s:6:"weight";s:4:"2590";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.000";s:5:"words";a:2:{s:3:"hey";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"2";}s:6:"@dude!";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:14:""hey" "@dude!"";}i:5;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:2:{i:2;a:2:{s:6:"weight";s:4:"2500";s:5:"attrs";a:0:{}}i:3;a:2:{s:6:"weight";s:4:"2500";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"2";s:11:"total_found";s:1:"2";s:4:"time";s:5:"0.000";s:5:"words";a:2:{s:4:"dude";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"2";}s:6:"a-team";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"2";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:13:""dude a-team"";}i:6;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:2:{i:2;a:2:{s:6:"weight";s:4:"2500";s:5:"attrs";a:0:{}}i:3;a:2:{s:6:"weight";s:4:"2500";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"2";s:11:"total_found";s:1:"2";s:4:"time";s:5:"0.000";s:5:"words";a:2:{s:6:"a-team";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"2";}s:3:"was";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"2";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:12:""a-team was"";}i:7;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:3;a:2:{s:6:"weight";s:4:"1680";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:5:"@@!!!";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:7:""@@!!!"";}i:8;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:3;a:2:{s:6:"weight";s:4:"3560";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.000";s:5:"words";a:3:{s:3:"was";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"2";}s:5:"@@!!!";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}s:7:"awesome";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"2";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:19:""was @@!!! awesome"";}}i:5;a:9:{i:0;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:1;a:2:{s:6:"weight";s:4:"1680";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:6:"simple";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:6:"simple";}i:1;a:12:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:5:"total";s:1:"0";s:11:"total_found";s:1:"0";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:7:"@simple";a:2:{s:4:"docs";s:1:"0";s:4:"hits";s:1:"0";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:8:"\@simple";}i:2;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:1;a:2:{s:6:"weight";s:4:"1680";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:8:"@simple!";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:10:"\@simple\!";}i:3;a:12:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:5:"total";s:1:"0";s:11:"total_found";s:1:"0";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:7:"simple!";a:2:{s:4:"docs";s:1:"0";s:4:"hits";s:1:"0";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:8:"simple\!";}i:4;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:2;a:2:{s:6:"weight";s:4:"2590";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.000";s:5:"words";a:2:{s:3:"hey";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"2";}s:6:"@dude!";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:14:""hey" "@dude!"";}i:5;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:2:{i:2;a:2:{s:6:"weight";s:4:"2500";s:5:"attrs";a:0:{}}i:3;a:2:{s:6:"weight";s:4:"2500";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"2";s:11:"total_found";s:1:"2";s:4:"time";s:5:"0.000";s:5:"words";a:2:{s:4:"dude";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"2";}s:6:"a-team";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"2";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:13:""dude a-team"";}i:6;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:2:{i:2;a:2:{s:6:"weight";s:4:"2500";s:5:"attrs";a:0:{}}i:3;a:2:{s:6:"weight";s:4:"2500";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"2";s:11:"total_found";s:1:"2";s:4:"time";s:5:"0.000";s:5:"words";a:2:{s:6:"a-team";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"2";}s:3:"was";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"2";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:12:""a-team was"";}i:7;a:11:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:5:"total";s:1:"0";s:11:"total_found";s:1:"0";s:4:"time";s:5:"0.000";s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:7:""@@!!!"";}i:8;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:2:{i:2;a:2:{s:6:"weight";s:4:"2500";s:5:"attrs";a:0:{}}i:3;a:2:{s:6:"weight";s:4:"2500";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"2";s:11:"total_found";s:1:"2";s:4:"time";s:5:"0.000";s:5:"words";a:2:{s:3:"was";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"2";}s:7:"awesome";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"2";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:19:""was @@!!! awesome"";}}i:6;a:9:{i:0;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:1;a:2:{s:6:"weight";s:4:"1680";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:6:"simple";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:6:"simple";}i:1;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:1;a:2:{s:6:"weight";s:4:"1680";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:7:"@simple";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:8:"\@simple";}i:2;a:12:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:5:"total";s:1:"0";s:11:"total_found";s:1:"0";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:8:"@simple!";a:2:{s:4:"docs";s:1:"0";s:4:"hits";s:1:"0";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:10:"\@simple\!";}i:3;a:12:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:5:"total";s:1:"0";s:11:"total_found";s:1:"0";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:7:"simple!";a:2:{s:4:"docs";s:1:"0";s:4:"hits";s:1:"0";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:8:"simple\!";}i:4;a:12:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:5:"total";s:1:"0";s:11:"total_found";s:1:"0";s:4:"time";s:5:"0.000";s:5:"words";a:2:{s:3:"hey";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"2";}s:6:"@dude!";a:2:{s:4:"docs";s:1:"0";s:4:"hits";s:1:"0";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:14:""hey" "@dude!"";}i:5;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:2:{i:2;a:2:{s:6:"weight";s:4:"2500";s:5:"attrs";a:0:{}}i:3;a:2:{s:6:"weight";s:4:"2500";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"2";s:11:"total_found";s:1:"2";s:4:"time";s:5:"0.000";s:5:"words";a:2:{s:4:"dude";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"2";}s:6:"a-team";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"2";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:13:""dude a-team"";}i:6;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:2:{i:2;a:2:{s:6:"weight";s:4:"2500";s:5:"attrs";a:0:{}}i:3;a:2:{s:6:"weight";s:4:"2500";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"2";s:11:"total_found";s:1:"2";s:4:"time";s:5:"0.000";s:5:"words";a:2:{s:6:"a-team";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"2";}s:3:"was";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"2";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:12:""a-team was"";}i:7;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:3;a:2:{s:6:"weight";s:4:"1680";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:5:"@@!!!";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:7:""@@!!!"";}i:8;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:3;a:2:{s:6:"weight";s:4:"3560";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.000";s:5:"words";a:3:{s:3:"was";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"2";}s:5:"@@!!!";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}s:7:"awesome";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"3";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:19:""was @@!!! awesome"";}}i:7;a:9:{i:0;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:1;a:2:{s:6:"weight";s:4:"1680";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:6:"simple";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:6:"simple";}i:1;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:1;a:2:{s:6:"weight";s:4:"1680";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:7:"@simple";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:8:"\@simple";}i:2;a:12:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:5:"total";s:1:"0";s:11:"total_found";s:1:"0";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:8:"@simple!";a:2:{s:4:"docs";s:1:"0";s:4:"hits";s:1:"0";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:10:"\@simple\!";}i:3;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:1;a:2:{s:6:"weight";s:4:"1680";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:7:"simple!";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:8:"simple\!";}i:4;a:12:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:5:"total";s:1:"0";s:11:"total_found";s:1:"0";s:4:"time";s:5:"0.000";s:5:"words";a:2:{s:3:"hey";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"2";}s:6:"@dude!";a:2:{s:4:"docs";s:1:"0";s:4:"hits";s:1:"0";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:14:""hey" "@dude!"";}i:5;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:2:{i:2;a:2:{s:6:"weight";s:4:"2500";s:5:"attrs";a:0:{}}i:3;a:2:{s:6:"weight";s:4:"2500";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"2";s:11:"total_found";s:1:"2";s:4:"time";s:5:"0.000";s:5:"words";a:2:{s:4:"dude";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"2";}s:6:"a-team";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"2";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:13:""dude a-team"";}i:6;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:2:{i:2;a:2:{s:6:"weight";s:4:"2500";s:5:"attrs";a:0:{}}i:3;a:2:{s:6:"weight";s:4:"2500";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"2";s:11:"total_found";s:1:"2";s:4:"time";s:5:"0.000";s:5:"words";a:2:{s:6:"a-team";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"2";}s:3:"was";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"2";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:12:""a-team was"";}i:7;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:3;a:2:{s:6:"weight";s:4:"1680";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:5:"@@!!!";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:7:""@@!!!"";}i:8;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:3;a:2:{s:6:"weight";s:4:"3560";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.000";s:5:"words";a:3:{s:3:"was";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"2";}s:5:"@@!!!";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}s:7:"awesome";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"3";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:19:""was @@!!! awesome"";}}} \ No newline at end of file +a:8:{i:0;a:9:{i:0;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:1;a:2:{s:6:"weight";s:4:"1680";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:6:"simple";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:6:"simple";}i:1;a:12:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:5:"total";s:1:"0";s:11:"total_found";s:1:"0";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:7:"@simple";a:2:{s:4:"docs";s:1:"0";s:4:"hits";s:1:"0";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:8:"\@simple";}i:2;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:1;a:2:{s:6:"weight";s:4:"1680";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:8:"@simple!";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:10:"\@simple\!";}i:3;a:12:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:5:"total";s:1:"0";s:11:"total_found";s:1:"0";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:7:"simple!";a:2:{s:4:"docs";s:1:"0";s:4:"hits";s:1:"0";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:8:"simple\!";}i:4;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:2;a:2:{s:6:"weight";s:4:"2590";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.001";s:5:"words";a:2:{s:3:"hey";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"2";}s:6:"@dude!";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:14:""hey" "@dude!"";}i:5;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:2:{i:2;a:2:{s:6:"weight";s:4:"2500";s:5:"attrs";a:0:{}}i:3;a:2:{s:6:"weight";s:4:"2500";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"2";s:11:"total_found";s:1:"2";s:4:"time";s:5:"0.001";s:5:"words";a:2:{s:4:"dude";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"2";}s:6:"a-team";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"2";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:13:""dude a-team"";}i:6;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:2:{i:2;a:2:{s:6:"weight";s:4:"2500";s:5:"attrs";a:0:{}}i:3;a:2:{s:6:"weight";s:4:"2500";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"2";s:11:"total_found";s:1:"2";s:4:"time";s:5:"0.001";s:5:"words";a:2:{s:6:"a-team";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"2";}s:3:"was";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"2";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:12:""a-team was"";}i:7;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:3;a:2:{s:6:"weight";s:4:"1680";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:5:"@@!!!";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:7:""@@!!!"";}i:8;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:3;a:2:{s:6:"weight";s:4:"3560";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.001";s:5:"words";a:3:{s:3:"was";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"2";}s:5:"@@!!!";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}s:7:"awesome";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"2";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:19:""was @@!!! awesome"";}}i:1;a:9:{i:0;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:1;a:2:{s:6:"weight";s:4:"1680";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:6:"simple";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:6:"simple";}i:1;a:12:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:5:"total";s:1:"0";s:11:"total_found";s:1:"0";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:7:"@simple";a:2:{s:4:"docs";s:1:"0";s:4:"hits";s:1:"0";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:8:"\@simple";}i:2;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:1;a:2:{s:6:"weight";s:4:"1680";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:8:"@simple!";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:10:"\@simple\!";}i:3;a:12:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:5:"total";s:1:"0";s:11:"total_found";s:1:"0";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:7:"simple!";a:2:{s:4:"docs";s:1:"0";s:4:"hits";s:1:"0";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:8:"simple\!";}i:4;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:2;a:2:{s:6:"weight";s:4:"2590";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.001";s:5:"words";a:2:{s:3:"hey";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"2";}s:6:"@dude!";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:14:""hey" "@dude!"";}i:5;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:2:{i:2;a:2:{s:6:"weight";s:4:"2500";s:5:"attrs";a:0:{}}i:3;a:2:{s:6:"weight";s:4:"2500";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"2";s:11:"total_found";s:1:"2";s:4:"time";s:5:"0.001";s:5:"words";a:2:{s:4:"dude";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"2";}s:6:"a-team";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"2";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:13:""dude a-team"";}i:6;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:2:{i:2;a:2:{s:6:"weight";s:4:"2500";s:5:"attrs";a:0:{}}i:3;a:2:{s:6:"weight";s:4:"2500";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"2";s:11:"total_found";s:1:"2";s:4:"time";s:5:"0.001";s:5:"words";a:2:{s:6:"a-team";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"2";}s:3:"was";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"2";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:12:""a-team was"";}i:7;a:11:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:5:"total";s:1:"0";s:11:"total_found";s:1:"0";s:4:"time";s:5:"0.000";s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:7:""@@!!!"";}i:8;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:2:{i:2;a:2:{s:6:"weight";s:4:"2500";s:5:"attrs";a:0:{}}i:3;a:2:{s:6:"weight";s:4:"2500";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"2";s:11:"total_found";s:1:"2";s:4:"time";s:5:"0.001";s:5:"words";a:2:{s:3:"was";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"2";}s:7:"awesome";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"2";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:19:""was @@!!! awesome"";}}i:2;a:9:{i:0;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:1;a:2:{s:6:"weight";s:4:"1680";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:6:"simple";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:6:"simple";}i:1;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:1;a:2:{s:6:"weight";s:4:"1680";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.012";s:5:"words";a:1:{s:7:"@simple";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:8:"\@simple";}i:2;a:12:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:5:"total";s:1:"0";s:11:"total_found";s:1:"0";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:8:"@simple!";a:2:{s:4:"docs";s:1:"0";s:4:"hits";s:1:"0";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:10:"\@simple\!";}i:3;a:12:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:5:"total";s:1:"0";s:11:"total_found";s:1:"0";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:7:"simple!";a:2:{s:4:"docs";s:1:"0";s:4:"hits";s:1:"0";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:8:"simple\!";}i:4;a:12:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:5:"total";s:1:"0";s:11:"total_found";s:1:"0";s:4:"time";s:5:"0.000";s:5:"words";a:2:{s:3:"hey";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"2";}s:6:"@dude!";a:2:{s:4:"docs";s:1:"0";s:4:"hits";s:1:"0";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:14:""hey" "@dude!"";}i:5;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:2:{i:2;a:2:{s:6:"weight";s:4:"2500";s:5:"attrs";a:0:{}}i:3;a:2:{s:6:"weight";s:4:"2500";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"2";s:11:"total_found";s:1:"2";s:4:"time";s:5:"0.001";s:5:"words";a:2:{s:4:"dude";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"2";}s:6:"a-team";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"2";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:13:""dude a-team"";}i:6;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:2:{i:2;a:2:{s:6:"weight";s:4:"2500";s:5:"attrs";a:0:{}}i:3;a:2:{s:6:"weight";s:4:"2500";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"2";s:11:"total_found";s:1:"2";s:4:"time";s:5:"0.001";s:5:"words";a:2:{s:6:"a-team";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"2";}s:3:"was";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"2";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:12:""a-team was"";}i:7;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:3;a:2:{s:6:"weight";s:4:"1680";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:5:"@@!!!";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:7:""@@!!!"";}i:8;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:3;a:2:{s:6:"weight";s:4:"3560";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.001";s:5:"words";a:3:{s:3:"was";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"2";}s:5:"@@!!!";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}s:7:"awesome";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"2";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:19:""was @@!!! awesome"";}}i:3;a:9:{i:0;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:1;a:2:{s:6:"weight";s:4:"1680";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:6:"simple";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:6:"simple";}i:1;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:1;a:2:{s:6:"weight";s:4:"1680";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:7:"@simple";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:8:"\@simple";}i:2;a:12:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:5:"total";s:1:"0";s:11:"total_found";s:1:"0";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:8:"@simple!";a:2:{s:4:"docs";s:1:"0";s:4:"hits";s:1:"0";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:10:"\@simple\!";}i:3;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:1;a:2:{s:6:"weight";s:4:"1680";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:7:"simple!";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:8:"simple\!";}i:4;a:12:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:5:"total";s:1:"0";s:11:"total_found";s:1:"0";s:4:"time";s:5:"0.000";s:5:"words";a:2:{s:3:"hey";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"2";}s:6:"@dude!";a:2:{s:4:"docs";s:1:"0";s:4:"hits";s:1:"0";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:14:""hey" "@dude!"";}i:5;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:2:{i:2;a:2:{s:6:"weight";s:4:"2500";s:5:"attrs";a:0:{}}i:3;a:2:{s:6:"weight";s:4:"2500";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"2";s:11:"total_found";s:1:"2";s:4:"time";s:5:"0.001";s:5:"words";a:2:{s:4:"dude";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"2";}s:6:"a-team";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"2";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:13:""dude a-team"";}i:6;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:2:{i:2;a:2:{s:6:"weight";s:4:"2500";s:5:"attrs";a:0:{}}i:3;a:2:{s:6:"weight";s:4:"2500";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"2";s:11:"total_found";s:1:"2";s:4:"time";s:5:"0.001";s:5:"words";a:2:{s:6:"a-team";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"2";}s:3:"was";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"2";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:12:""a-team was"";}i:7;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:3;a:2:{s:6:"weight";s:4:"1680";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:5:"@@!!!";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:7:""@@!!!"";}i:8;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:3;a:2:{s:6:"weight";s:4:"3560";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.001";s:5:"words";a:3:{s:3:"was";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"2";}s:5:"@@!!!";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}s:7:"awesome";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"2";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:19:""was @@!!! awesome"";}}i:4;a:9:{i:0;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:1;a:2:{s:6:"weight";s:4:"1680";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:6:"simple";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:6:"simple";}i:1;a:12:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:5:"total";s:1:"0";s:11:"total_found";s:1:"0";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:7:"@simple";a:2:{s:4:"docs";s:1:"0";s:4:"hits";s:1:"0";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:8:"\@simple";}i:2;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:1;a:2:{s:6:"weight";s:4:"1680";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:8:"@simple!";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:10:"\@simple\!";}i:3;a:12:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:5:"total";s:1:"0";s:11:"total_found";s:1:"0";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:7:"simple!";a:2:{s:4:"docs";s:1:"0";s:4:"hits";s:1:"0";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:8:"simple\!";}i:4;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:2;a:2:{s:6:"weight";s:4:"2590";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.001";s:5:"words";a:2:{s:3:"hey";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"2";}s:6:"@dude!";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:14:""hey" "@dude!"";}i:5;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:2:{i:2;a:2:{s:6:"weight";s:4:"2500";s:5:"attrs";a:0:{}}i:3;a:2:{s:6:"weight";s:4:"2500";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"2";s:11:"total_found";s:1:"2";s:4:"time";s:5:"0.001";s:5:"words";a:2:{s:4:"dude";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"2";}s:6:"a-team";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"2";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:13:""dude a-team"";}i:6;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:2:{i:2;a:2:{s:6:"weight";s:4:"2500";s:5:"attrs";a:0:{}}i:3;a:2:{s:6:"weight";s:4:"2500";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"2";s:11:"total_found";s:1:"2";s:4:"time";s:5:"0.001";s:5:"words";a:2:{s:6:"a-team";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"2";}s:3:"was";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"2";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:12:""a-team was"";}i:7;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:3;a:2:{s:6:"weight";s:4:"1680";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:5:"@@!!!";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:7:""@@!!!"";}i:8;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:3;a:2:{s:6:"weight";s:4:"3560";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.001";s:5:"words";a:3:{s:3:"was";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"2";}s:5:"@@!!!";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}s:7:"awesome";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"2";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:19:""was @@!!! awesome"";}}i:5;a:9:{i:0;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:1;a:2:{s:6:"weight";s:4:"1680";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:6:"simple";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:6:"simple";}i:1;a:12:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:5:"total";s:1:"0";s:11:"total_found";s:1:"0";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:7:"@simple";a:2:{s:4:"docs";s:1:"0";s:4:"hits";s:1:"0";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:8:"\@simple";}i:2;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:1;a:2:{s:6:"weight";s:4:"1680";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:8:"@simple!";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:10:"\@simple\!";}i:3;a:12:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:5:"total";s:1:"0";s:11:"total_found";s:1:"0";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:7:"simple!";a:2:{s:4:"docs";s:1:"0";s:4:"hits";s:1:"0";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:8:"simple\!";}i:4;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:2;a:2:{s:6:"weight";s:4:"2590";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.001";s:5:"words";a:2:{s:3:"hey";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"2";}s:6:"@dude!";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:14:""hey" "@dude!"";}i:5;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:2:{i:2;a:2:{s:6:"weight";s:4:"2500";s:5:"attrs";a:0:{}}i:3;a:2:{s:6:"weight";s:4:"2500";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"2";s:11:"total_found";s:1:"2";s:4:"time";s:5:"0.001";s:5:"words";a:2:{s:4:"dude";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"2";}s:6:"a-team";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"2";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:13:""dude a-team"";}i:6;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:2:{i:2;a:2:{s:6:"weight";s:4:"2500";s:5:"attrs";a:0:{}}i:3;a:2:{s:6:"weight";s:4:"2500";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"2";s:11:"total_found";s:1:"2";s:4:"time";s:5:"0.001";s:5:"words";a:2:{s:6:"a-team";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"2";}s:3:"was";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"2";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:12:""a-team was"";}i:7;a:11:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:5:"total";s:1:"0";s:11:"total_found";s:1:"0";s:4:"time";s:5:"0.000";s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:7:""@@!!!"";}i:8;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:2:{i:2;a:2:{s:6:"weight";s:4:"2500";s:5:"attrs";a:0:{}}i:3;a:2:{s:6:"weight";s:4:"2500";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"2";s:11:"total_found";s:1:"2";s:4:"time";s:5:"0.001";s:5:"words";a:2:{s:3:"was";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"2";}s:7:"awesome";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"2";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:19:""was @@!!! awesome"";}}i:6;a:9:{i:0;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:1;a:2:{s:6:"weight";s:4:"1680";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:6:"simple";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:6:"simple";}i:1;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:1;a:2:{s:6:"weight";s:4:"1680";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:7:"@simple";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:8:"\@simple";}i:2;a:12:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:5:"total";s:1:"0";s:11:"total_found";s:1:"0";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:8:"@simple!";a:2:{s:4:"docs";s:1:"0";s:4:"hits";s:1:"0";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:10:"\@simple\!";}i:3;a:12:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:5:"total";s:1:"0";s:11:"total_found";s:1:"0";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:7:"simple!";a:2:{s:4:"docs";s:1:"0";s:4:"hits";s:1:"0";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:8:"simple\!";}i:4;a:12:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:5:"total";s:1:"0";s:11:"total_found";s:1:"0";s:4:"time";s:5:"0.000";s:5:"words";a:2:{s:3:"hey";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"2";}s:6:"@dude!";a:2:{s:4:"docs";s:1:"0";s:4:"hits";s:1:"0";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:14:""hey" "@dude!"";}i:5;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:2:{i:2;a:2:{s:6:"weight";s:4:"2500";s:5:"attrs";a:0:{}}i:3;a:2:{s:6:"weight";s:4:"2500";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"2";s:11:"total_found";s:1:"2";s:4:"time";s:5:"0.001";s:5:"words";a:2:{s:4:"dude";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"2";}s:6:"a-team";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"2";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:13:""dude a-team"";}i:6;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:2:{i:2;a:2:{s:6:"weight";s:4:"2500";s:5:"attrs";a:0:{}}i:3;a:2:{s:6:"weight";s:4:"2500";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"2";s:11:"total_found";s:1:"2";s:4:"time";s:5:"0.001";s:5:"words";a:2:{s:6:"a-team";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"2";}s:3:"was";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"2";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:12:""a-team was"";}i:7;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:3;a:2:{s:6:"weight";s:4:"1680";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:5:"@@!!!";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:7:""@@!!!"";}i:8;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:3;a:2:{s:6:"weight";s:4:"3560";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.001";s:5:"words";a:3:{s:3:"was";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"2";}s:5:"@@!!!";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}s:7:"awesome";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"2";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:19:""was @@!!! awesome"";}}i:7;a:9:{i:0;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:1;a:2:{s:6:"weight";s:4:"1680";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:6:"simple";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:6:"simple";}i:1;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:1;a:2:{s:6:"weight";s:4:"1680";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:7:"@simple";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:8:"\@simple";}i:2;a:12:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:5:"total";s:1:"0";s:11:"total_found";s:1:"0";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:8:"@simple!";a:2:{s:4:"docs";s:1:"0";s:4:"hits";s:1:"0";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:10:"\@simple\!";}i:3;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:1;a:2:{s:6:"weight";s:4:"1680";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:7:"simple!";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:8:"simple\!";}i:4;a:12:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:5:"total";s:1:"0";s:11:"total_found";s:1:"0";s:4:"time";s:5:"0.000";s:5:"words";a:2:{s:3:"hey";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"2";}s:6:"@dude!";a:2:{s:4:"docs";s:1:"0";s:4:"hits";s:1:"0";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:14:""hey" "@dude!"";}i:5;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:2:{i:2;a:2:{s:6:"weight";s:4:"2500";s:5:"attrs";a:0:{}}i:3;a:2:{s:6:"weight";s:4:"2500";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"2";s:11:"total_found";s:1:"2";s:4:"time";s:5:"0.001";s:5:"words";a:2:{s:4:"dude";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"2";}s:6:"a-team";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"2";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:13:""dude a-team"";}i:6;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:2:{i:2;a:2:{s:6:"weight";s:4:"2500";s:5:"attrs";a:0:{}}i:3;a:2:{s:6:"weight";s:4:"2500";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"2";s:11:"total_found";s:1:"2";s:4:"time";s:5:"0.001";s:5:"words";a:2:{s:6:"a-team";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"2";}s:3:"was";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"2";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:12:""a-team was"";}i:7;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:3;a:2:{s:6:"weight";s:4:"1680";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.000";s:5:"words";a:1:{s:5:"@@!!!";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:7:""@@!!!"";}i:8;a:13:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:4:"text";}s:5:"attrs";a:0:{}s:7:"matches";a:1:{i:3;a:2:{s:6:"weight";s:4:"3560";s:5:"attrs";a:0:{}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:4:"time";s:5:"0.001";s:5:"words";a:3:{s:3:"was";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"2";}s:5:"@@!!!";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}s:7:"awesome";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"2";}}s:8:"resarray";i:0;s:8:"roundoff";i:0;s:5:"query";s:19:""was @@!!! awesome"";}}} \ No newline at end of file diff -Nru sphinxsearch-0.9.9+2.0.2beta/test/test_175/model.bin sphinxsearch-2.0.4/test/test_175/model.bin --- sphinxsearch-0.9.9+2.0.2beta/test/test_175/model.bin 2011-09-05 16:01:00.000000000 +0000 +++ sphinxsearch-2.0.4/test/test_175/model.bin 2012-01-12 14:19:29.000000000 +0000 @@ -1 +1 @@ -a:1:{i:0;a:1:{i:0;a:5:{i:0;a:9:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:7:"matches";a:2:{i:11;a:2:{s:6:"weight";s:4:"2269";s:5:"attrs";a:1:{s:3:"gid";s:1:"1";}}i:10;a:2:{s:6:"weight";s:4:"1221";s:5:"attrs";a:1:{s:3:"gid";s:1:"1";}}}s:5:"total";s:1:"2";s:11:"total_found";s:1:"2";s:5:"words";a:2:{s:3:"aaa";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:3:"515";}s:3:"bbb";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"6";}}}i:1;a:9:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:7:"matches";a:1:{i:701;a:2:{s:6:"weight";s:4:"1500";s:5:"attrs";a:1:{s:3:"gid";s:1:"1";}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:5:"words";a:2:{s:3:"box";a:2:{s:4:"docs";s:3:"600";s:4:"hits";s:3:"600";}s:4:"good";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}}i:2;s:20:"common subtree crash";i:3;a:8:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:5:"total";s:1:"0";s:11:"total_found";s:1:"0";s:5:"words";a:2:{s:3:"aaa";a:2:{s:4:"docs";s:3:"600";s:4:"hits";s:3:"600";}s:3:"bbb";a:2:{s:4:"docs";s:3:"400";s:4:"hits";s:3:"400";}}}i:4;a:9:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:7:"matches";a:20:{i:402;a:2:{s:6:"weight";s:4:"1386";s:5:"attrs";a:1:{s:3:"gid";s:3:"402";}}i:403;a:2:{s:6:"weight";s:4:"1386";s:5:"attrs";a:1:{s:3:"gid";s:3:"403";}}i:404;a:2:{s:6:"weight";s:4:"1386";s:5:"attrs";a:1:{s:3:"gid";s:3:"404";}}i:405;a:2:{s:6:"weight";s:4:"1386";s:5:"attrs";a:1:{s:3:"gid";s:3:"405";}}i:406;a:2:{s:6:"weight";s:4:"1386";s:5:"attrs";a:1:{s:3:"gid";s:3:"406";}}i:407;a:2:{s:6:"weight";s:4:"1386";s:5:"attrs";a:1:{s:3:"gid";s:3:"407";}}i:408;a:2:{s:6:"weight";s:4:"1386";s:5:"attrs";a:1:{s:3:"gid";s:3:"408";}}i:409;a:2:{s:6:"weight";s:4:"1386";s:5:"attrs";a:1:{s:3:"gid";s:3:"409";}}i:410;a:2:{s:6:"weight";s:4:"1386";s:5:"attrs";a:1:{s:3:"gid";s:3:"410";}}i:411;a:2:{s:6:"weight";s:4:"1386";s:5:"attrs";a:1:{s:3:"gid";s:3:"411";}}i:412;a:2:{s:6:"weight";s:4:"1386";s:5:"attrs";a:1:{s:3:"gid";s:3:"412";}}i:413;a:2:{s:6:"weight";s:4:"1386";s:5:"attrs";a:1:{s:3:"gid";s:3:"413";}}i:414;a:2:{s:6:"weight";s:4:"1386";s:5:"attrs";a:1:{s:3:"gid";s:3:"414";}}i:415;a:2:{s:6:"weight";s:4:"1386";s:5:"attrs";a:1:{s:3:"gid";s:3:"415";}}i:416;a:2:{s:6:"weight";s:4:"1386";s:5:"attrs";a:1:{s:3:"gid";s:3:"416";}}i:417;a:2:{s:6:"weight";s:4:"1386";s:5:"attrs";a:1:{s:3:"gid";s:3:"417";}}i:418;a:2:{s:6:"weight";s:4:"1386";s:5:"attrs";a:1:{s:3:"gid";s:3:"418";}}i:419;a:2:{s:6:"weight";s:4:"1386";s:5:"attrs";a:1:{s:3:"gid";s:3:"419";}}i:420;a:2:{s:6:"weight";s:4:"1386";s:5:"attrs";a:1:{s:3:"gid";s:3:"420";}}i:421;a:2:{s:6:"weight";s:4:"1386";s:5:"attrs";a:1:{s:3:"gid";s:3:"421";}}}s:5:"total";s:3:"200";s:11:"total_found";s:3:"200";s:5:"words";a:2:{s:3:"aaa";a:2:{s:4:"docs";s:3:"600";s:4:"hits";s:3:"600";}s:3:"bbb";a:2:{s:4:"docs";s:3:"400";s:4:"hits";s:3:"400";}}}}}} \ No newline at end of file +a:1:{i:0;a:1:{i:0;a:19:{i:0;a:9:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:7:"matches";a:2:{i:11;a:2:{s:6:"weight";s:4:"2269";s:5:"attrs";a:1:{s:3:"gid";s:1:"1";}}i:10;a:2:{s:6:"weight";s:4:"1221";s:5:"attrs";a:1:{s:3:"gid";s:1:"1";}}}s:5:"total";s:1:"2";s:11:"total_found";s:1:"2";s:5:"words";a:2:{s:3:"aaa";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:3:"515";}s:3:"bbb";a:2:{s:4:"docs";s:1:"2";s:4:"hits";s:1:"6";}}}i:1;a:9:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:7:"matches";a:1:{i:701;a:2:{s:6:"weight";s:4:"1500";s:5:"attrs";a:1:{s:3:"gid";s:1:"1";}}}s:5:"total";s:1:"1";s:11:"total_found";s:1:"1";s:5:"words";a:2:{s:3:"box";a:2:{s:4:"docs";s:3:"600";s:4:"hits";s:3:"600";}s:4:"good";a:2:{s:4:"docs";s:1:"1";s:4:"hits";s:1:"1";}}}i:2;s:20:"common subtree crash";i:3;a:8:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:5:"total";s:1:"0";s:11:"total_found";s:1:"0";s:5:"words";a:2:{s:3:"aaa";a:2:{s:4:"docs";s:3:"600";s:4:"hits";s:3:"600";}s:3:"bbb";a:2:{s:4:"docs";s:3:"400";s:4:"hits";s:3:"400";}}}i:4;a:9:{s:5:"error";s:0:"";s:7:"warning";s:0:"";s:6:"status";i:0;s:6:"fields";a:1:{i:0;s:5:"title";}s:5:"attrs";a:1:{s:3:"gid";i:1;}s:7:"matches";a:20:{i:402;a:2:{s:6:"weight";s:4:"1386";s:5:"attrs";a:1:{s:3:"gid";s:3:"402";}}i:403;a:2:{s:6:"weight";s:4:"1386";s:5:"attrs";a:1:{s:3:"gid";s:3:"403";}}i:404;a:2:{s:6:"weight";s:4:"1386";s:5:"attrs";a:1:{s:3:"gid";s:3:"404";}}i:405;a:2:{s:6:"weight";s:4:"1386";s:5:"attrs";a:1:{s:3:"gid";s:3:"405";}}i:406;a:2:{s:6:"weight";s:4:"1386";s:5:"attrs";a:1:{s:3:"gid";s:3:"406";}}i:407;a:2:{s:6:"weight";s:4:"1386";s:5:"attrs";a:1:{s:3:"gid";s:3:"407";}}i:408;a:2:{s:6:"weight";s:4:"1386";s:5:"attrs";a:1:{s:3:"gid";s:3:"408";}}i:409;a:2:{s:6:"weight";s:4:"1386";s:5:"attrs";a:1:{s:3:"gid";s:3:"409";}}i:410;a:2:{s:6:"weight";s:4:"1386";s:5:"attrs";a:1:{s:3:"gid";s:3:"410";}}i:411;a:2:{s:6:"weight";s:4:"1386";s:5:"attrs";a:1:{s:3:"gid";s:3:"411";}}i:412;a:2:{s:6:"weight";s:4:"1386";s:5:"attrs";a:1:{s:3:"gid";s:3:"412";}}i:413;a:2:{s:6:"weight";s:4:"1386";s:5:"attrs";a:1:{s:3:"gid";s:3:"413";}}i:414;a:2:{s:6:"weight";s:4:"1386";s:5:"attrs";a:1:{s:3:"gid";s:3:"414";}}i:415;a:2:{s:6:"weight";s:4:"1386";s:5:"attrs";a:1:{s:3:"gid";s:3:"415";}}i:416;a:2:{s:6:"weight";s:4:"1386";s:5:"attrs";a:1:{s:3:"gid";s:3:"416";}}i:417;a:2:{s:6:"weight";s:4:"1386";s:5:"attrs";a:1:{s:3:"gid";s:3:"417";}}i:418;a:2:{s:6:"weight";s:4:"1386";s:5:"attrs";a:1:{s:3:"gid";s:3:"418";}}i:419;a:2:{s:6:"weight";s:4:"1386";s:5:"attrs";a:1:{s:3:"gid";s:3:"419";}}i:420;a:2:{s:6:"weight";s:4:"1386";s:5:"attrs";a:1:{s:3:"gid";s:3:"420";}}i:421;a:2:{s:6:"weight";s:4:"1386";s:5:"attrs";a:1:{s:3:"gid";s:3:"421";}}}s:5:"total";s:3:"200";s:11:"total_found";s:3:"200";s:5:"words";a:2:{s:3:"aaa";a:2:{s:4:"docs";s:3:"600";s:4:"hits";s:3:"600";}s:3:"bbb";a:2:{s:4:"docs";s:3:"400";s:4:"hits";s:3:"400";}}}i:5;s:26:"select * from rt limit 0,2";i:6;s:18:"id = 1 weight = 1 ";i:7;s:18:"id = 2 weight = 1 ";i:8;s:9:"show meta";i:9;s:11:"total = 120";i:10;s:17:"total_found = 120";i:11;s:45:"select * from rt where match ( 'basketball' )";i:12;s:23:"id = 100 weight = 1726 ";i:13;s:9:"show meta";i:14;s:9:"total = 1";i:15;s:15:"total_found = 1";i:16;s:23:"keyword[0] = basketball";i:17;s:11:"docs[0] = 1";i:18;s:11:"hits[0] = 1";}}} \ No newline at end of file diff -Nru sphinxsearch-0.9.9+2.0.2beta/test/test_175/test.xml sphinxsearch-2.0.4/test/test_175/test.xml --- sphinxsearch-0.9.9+2.0.2beta/test/test_175/test.xml 2011-09-05 16:01:00.000000000 +0000 +++ sphinxsearch-2.0.4/test/test_175/test.xml 2012-01-12 14:19:29.000000000 +0000 @@ -12,6 +12,8 @@ searchd { + workers = threads + binlog_path = # subtree_docs_cache = 128k subtree_hits_cache = 128k } @@ -60,6 +62,16 @@ path = /test3 docinfo = extern } + +index rt +{ + type = rt + charset_type = utf-8 + path = /rt + + rt_field = content + morphology = none +} @@ -147,6 +159,66 @@ unset ( $r["time"] ); $results[] = $r; } + +// regression RT dictionary lost words on merge with ID64 +$query = create_function ( '$q, $sock',' + + $results = array( $q ); + $res = @mysql_query ( $q, $sock ); + if ( $res===false ) + { + $results[] = mysql_errno( $sock ) . "; " . mysql_error ( $sock ); + } else + { + while ($row = @mysql_fetch_array($res, MYSQL_ASSOC)) + { + if ( array_key_exists ( "Variable_name", $row ) && $row["Variable_name"]=="time" ) + { + continue; + } + if ( !array_key_exists ( "Variable_name", $row ) || !array_key_exists ( "Value", $row ) ) + { + $line = ""; + foreach ( $row as $k=>$v ) + { + $line .= $k . " = " . $v . "\t"; + } + $results[] = $line; + } else + { + $results[] = $row["Variable_name"] . " = " . $row["Value"]; + } + } + @mysql_free_result ( $res ); + } + return $results; +'); + +global $sd_address, $sd_sphinxql_port; +$sockStr = "$sd_address:$sd_sphinxql_port"; +if ($sd_address == "localhost") + $sockStr = "127.0.0.1:$sd_sphinxql_port"; +$sock = @mysql_connect ($sockStr,"","", true ); + +for ( $doc=1; $doc<121; $doc++ ) +{ + $text = 'dummy text is going here'; + if ( $doc==31 ) + $text = 'ACT I.'; + else if ( $doc==100 ) + $text = 'And let us once again assail your ears, basketball'; + + $insert = " REPLACE INTO rt ( id, content ) VALUES ( $doc, '$text' ) "; + $query ( $insert, $sock ); +} + +$results = array_merge ( $results, $query ( "select * from rt limit 0,2", $sock ) ); +$results = array_merge ( $results, $query ( "show meta", $sock ) ); +$results = array_merge ( $results, $query ( "select * from rt where match ( 'basketball' )", $sock ) ); +$results = array_merge ( $results, $query ( "show meta", $sock ) ); + +@mysql_close ( $sock ); + ]]> diff -Nru sphinxsearch-0.9.9+2.0.2beta/test/test_178/model.bin sphinxsearch-2.0.4/test/test_178/model.bin --- sphinxsearch-0.9.9+2.0.2beta/test/test_178/model.bin 2011-11-15 14:01:21.000000000 +0000 +++ sphinxsearch-2.0.4/test/test_178/model.bin 2011-11-21 15:58:19.000000000 +0000 @@ -1 +1 @@ -a:1:{i:0;a:17:{i:0;a:3:{s:8:"sphinxql";s:69:"CALL SNIPPETS('Check vs Checking', 'test', 'check', 1 AS query_mode )";s:10:"total_rows";i:1;s:4:"rows";a:1:{i:0;a:1:{s:7:"snippet";s:31:"Check vs Checking";}}}i:1;a:3:{s:8:"sphinxql";s:70:"CALL SNIPPETS('Check vs Checking', 'test', '=check', 1 AS query_mode )";s:10:"total_rows";i:1;s:4:"rows";a:1:{i:0;a:1:{s:7:"snippet";s:24:"Check vs Checking";}}}i:2;a:3:{s:8:"sphinxql";s:72:"CALL SNIPPETS('Check vs Checking', 'test', 'checking', 1 AS query_mode )";s:10:"total_rows";i:1;s:4:"rows";a:1:{i:0;a:1:{s:7:"snippet";s:31:"Check vs Checking";}}}i:3;a:3:{s:8:"sphinxql";s:73:"CALL SNIPPETS('Check vs Checking', 'test', '=checking', 1 AS query_mode )";s:10:"total_rows";i:1;s:4:"rows";a:1:{i:0;a:1:{s:7:"snippet";s:24:"Check vs Checking";}}}i:4;a:3:{s:8:"sphinxql";s:190:"CALL SNIPPETS('the time has come, the walrus said, to handle many things, including Check vs Checking, but not quite limited to', 'test', 'check', 1 AS query_mode, 2 AS around, 50 AS limit )";s:10:"total_rows";i:1;s:4:"rows";a:1:{i:0;a:1:{s:7:"snippet";s:65:" ... things, including Check vs Checking, but ... ";}}}i:5;a:3:{s:8:"sphinxql";s:191:"CALL SNIPPETS('the time has come, the walrus said, to handle many things, including Check vs Checking, but not quite limited to', 'test', '=check', 1 AS query_mode, 2 AS around, 50 AS limit )";s:10:"total_rows";i:1;s:4:"rows";a:1:{i:0;a:1:{s:7:"snippet";s:53:" ... things, including Check vs Checking ... ";}}}i:6;a:3:{s:8:"sphinxql";s:193:"CALL SNIPPETS('the time has come, the walrus said, to handle many things, including Check vs Checking, but not quite limited to', 'test', 'checking', 1 AS query_mode, 2 AS around, 50 AS limit )";s:10:"total_rows";i:1;s:4:"rows";a:1:{i:0;a:1:{s:7:"snippet";s:65:" ... things, including Check vs Checking, but ... ";}}}i:7;a:3:{s:8:"sphinxql";s:194:"CALL SNIPPETS('the time has come, the walrus said, to handle many things, including Check vs Checking, but not quite limited to', 'test', '=checking', 1 AS query_mode, 2 AS around, 50 AS limit )";s:10:"total_rows";i:1;s:4:"rows";a:1:{i:0;a:1:{s:7:"snippet";s:44:" ... Check vs Checking, but not ... ";}}}i:8;a:3:{s:8:"sphinxql";s:94:"CALL SNIPPETS('check vs checking fast path', 'tstar', 'checki*', 1 AS query_mode, 0 AS limit )";s:10:"total_rows";i:1;s:4:"rows";a:1:{i:0;a:1:{s:7:"snippet";s:34:"check vs checking fast path";}}}i:9;a:3:{s:8:"sphinxql";s:118:"CALL SNIPPETS('check vs checking regular path', 'tstar', 'checki*', 1 AS query_mode, 0 AS limit, 1 AS limit_passages )";s:10:"total_rows";i:1;s:4:"rows";a:1:{i:0;a:1:{s:7:"snippet";s:37:"check vs checking regular path";}}}i:10;a:3:{s:8:"sphinxql";s:110:"CALL SNIPPETS('time is dying out like everething else here', 'stars', 'dying*', 1 AS query_mode, 20 AS limit )";s:10:"total_rows";i:1;s:4:"rows";a:1:{i:0;a:1:{s:7:"snippet";s:30:"time is dying out ... ";}}}i:11;a:3:{s:8:"sphinxql";s:110:"CALL SNIPPETS('time is dying out like everething else here', 'stars', '*dying', 1 AS query_mode, 20 AS limit )";s:10:"total_rows";i:1;s:4:"rows";a:1:{i:0;a:1:{s:7:"snippet";s:30:"time is dying out ... ";}}}i:12;a:3:{s:8:"sphinxql";s:111:"CALL SNIPPETS('time is dying out like everething else here', 'stars', '*dying*', 1 AS query_mode, 20 AS limit )";s:10:"total_rows";i:1;s:4:"rows";a:1:{i:0;a:1:{s:7:"snippet";s:30:"time is dying out ... ";}}}i:13;a:3:{s:8:"sphinxql";s:110:"CALL SNIPPETS('time is dying out like everething else here', 'test', 'nothing', 1 AS query_mode, 40 AS limit )";s:10:"total_rows";i:1;s:4:"rows";a:1:{i:0;a:1:{s:7:"snippet";s:0:"";}}}i:14;a:3:{s:8:"sphinxql";s:100:"CALL SNIPPETS('time is dying out like everething', 'test', 'nothing', 1 AS query_mode, 40 AS limit )";s:10:"total_rows";i:1;s:4:"rows";a:1:{i:0;a:1:{s:7:"snippet";s:0:"";}}}i:15;a:3:{s:8:"sphinxql";s:93:"CALL SNIPPETS('time is dying out like everething else here', 'test', 'nothing', 40 AS limit )";s:10:"total_rows";i:1;s:4:"rows";a:1:{i:0;a:1:{s:7:"snippet";s:0:"";}}}i:16;a:3:{s:8:"sphinxql";s:83:"CALL SNIPPETS('time is dying out like everething', 'test', 'nothing', 40 AS limit )";s:10:"total_rows";i:1;s:4:"rows";a:1:{i:0;a:1:{s:7:"snippet";s:0:"";}}}}} \ No newline at end of file +a:1:{i:0;a:17:{i:0;a:3:{s:8:"sphinxql";s:69:"CALL SNIPPETS('Check vs Checking', 'test', 'check', 1 AS query_mode )";s:10:"total_rows";i:1;s:4:"rows";a:1:{i:0;a:1:{s:7:"snippet";s:31:"Check vs Checking";}}}i:1;a:3:{s:8:"sphinxql";s:70:"CALL SNIPPETS('Check vs Checking', 'test', '=check', 1 AS query_mode )";s:10:"total_rows";i:1;s:4:"rows";a:1:{i:0;a:1:{s:7:"snippet";s:24:"Check vs Checking";}}}i:2;a:3:{s:8:"sphinxql";s:72:"CALL SNIPPETS('Check vs Checking', 'test', 'checking', 1 AS query_mode )";s:10:"total_rows";i:1;s:4:"rows";a:1:{i:0;a:1:{s:7:"snippet";s:31:"Check vs Checking";}}}i:3;a:3:{s:8:"sphinxql";s:73:"CALL SNIPPETS('Check vs Checking', 'test', '=checking', 1 AS query_mode )";s:10:"total_rows";i:1;s:4:"rows";a:1:{i:0;a:1:{s:7:"snippet";s:24:"Check vs Checking";}}}i:4;a:3:{s:8:"sphinxql";s:190:"CALL SNIPPETS('the time has come, the walrus said, to handle many things, including Check vs Checking, but not quite limited to', 'test', 'check', 1 AS query_mode, 2 AS around, 50 AS limit )";s:10:"total_rows";i:1;s:4:"rows";a:1:{i:0;a:1:{s:7:"snippet";s:65:" ... things, including Check vs Checking, but ... ";}}}i:5;a:3:{s:8:"sphinxql";s:191:"CALL SNIPPETS('the time has come, the walrus said, to handle many things, including Check vs Checking, but not quite limited to', 'test', '=check', 1 AS query_mode, 2 AS around, 50 AS limit )";s:10:"total_rows";i:1;s:4:"rows";a:1:{i:0;a:1:{s:7:"snippet";s:53:" ... things, including Check vs Checking ... ";}}}i:6;a:3:{s:8:"sphinxql";s:193:"CALL SNIPPETS('the time has come, the walrus said, to handle many things, including Check vs Checking, but not quite limited to', 'test', 'checking', 1 AS query_mode, 2 AS around, 50 AS limit )";s:10:"total_rows";i:1;s:4:"rows";a:1:{i:0;a:1:{s:7:"snippet";s:65:" ... things, including Check vs Checking, but ... ";}}}i:7;a:3:{s:8:"sphinxql";s:194:"CALL SNIPPETS('the time has come, the walrus said, to handle many things, including Check vs Checking, but not quite limited to', 'test', '=checking', 1 AS query_mode, 2 AS around, 50 AS limit )";s:10:"total_rows";i:1;s:4:"rows";a:1:{i:0;a:1:{s:7:"snippet";s:44:" ... Check vs Checking, but not ... ";}}}i:8;a:3:{s:8:"sphinxql";s:94:"CALL SNIPPETS('check vs checking fast path', 'tstar', 'checki*', 1 AS query_mode, 0 AS limit )";s:10:"total_rows";i:1;s:4:"rows";a:1:{i:0;a:1:{s:7:"snippet";s:34:"check vs checking fast path";}}}i:9;a:3:{s:8:"sphinxql";s:118:"CALL SNIPPETS('check vs checking regular path', 'tstar', 'checki*', 1 AS query_mode, 0 AS limit, 1 AS limit_passages )";s:10:"total_rows";i:1;s:4:"rows";a:1:{i:0;a:1:{s:7:"snippet";s:37:"check vs checking regular path";}}}i:10;a:3:{s:8:"sphinxql";s:110:"CALL SNIPPETS('time is dying out like everething else here', 'stars', 'dying*', 1 AS query_mode, 20 AS limit )";s:10:"total_rows";i:1;s:4:"rows";a:1:{i:0;a:1:{s:7:"snippet";s:30:"time is dying out ... ";}}}i:11;a:3:{s:8:"sphinxql";s:110:"CALL SNIPPETS('time is dying out like everething else here', 'stars', '*dying', 1 AS query_mode, 20 AS limit )";s:10:"total_rows";i:1;s:4:"rows";a:1:{i:0;a:1:{s:7:"snippet";s:30:"time is dying out ... ";}}}i:12;a:3:{s:8:"sphinxql";s:111:"CALL SNIPPETS('time is dying out like everething else here', 'stars', '*dying*', 1 AS query_mode, 20 AS limit )";s:10:"total_rows";i:1;s:4:"rows";a:1:{i:0;a:1:{s:7:"snippet";s:30:"time is dying out ... ";}}}i:13;a:3:{s:8:"sphinxql";s:128:"CALL SNIPPETS('time is dying out like everething else here', 'test', 'nothing', 1 AS query_mode, 40 AS limit, 1 as allow_empty )";s:10:"total_rows";i:1;s:4:"rows";a:1:{i:0;a:1:{s:7:"snippet";s:0:"";}}}i:14;a:3:{s:8:"sphinxql";s:119:"CALL SNIPPETS('time is dying out like everething', 'test', 'nothing', 1 AS query_mode, 40 AS limit, 1 as allow_empty )";s:10:"total_rows";i:1;s:4:"rows";a:1:{i:0;a:1:{s:7:"snippet";s:0:"";}}}i:15;a:3:{s:8:"sphinxql";s:112:"CALL SNIPPETS('time is dying out like everething else here', 'test', 'nothing', 40 AS limit, 1 as allow_empty )";s:10:"total_rows";i:1;s:4:"rows";a:1:{i:0;a:1:{s:7:"snippet";s:0:"";}}}i:16;a:3:{s:8:"sphinxql";s:102:"CALL SNIPPETS('time is dying out like everething', 'test', 'nothing', 40 AS limit, 1 as allow_empty )";s:10:"total_rows";i:1;s:4:"rows";a:1:{i:0;a:1:{s:7:"snippet";s:0:"";}}}}} \ No newline at end of file diff -Nru sphinxsearch-0.9.9+2.0.2beta/test/test_178/test.xml sphinxsearch-2.0.4/test/test_178/test.xml --- sphinxsearch-0.9.9+2.0.2beta/test/test_178/test.xml 2011-11-15 14:01:21.000000000 +0000 +++ sphinxsearch-2.0.4/test/test_178/test.xml 2011-11-21 15:58:19.000000000 +0000 @@ -63,10 +63,10 @@ CALL SNIPPETS('time is dying out like everething else here', 'stars', '*dying', 1 AS query_mode, 20 AS limit ) CALL SNIPPETS('time is dying out like everething else here', 'stars', '*dying*', 1 AS query_mode, 20 AS limit ) -CALL SNIPPETS('time is dying out like everething else here', 'test', 'nothing', 1 AS query_mode, 40 AS limit ) -CALL SNIPPETS('time is dying out like everething', 'test', 'nothing', 1 AS query_mode, 40 AS limit ) -CALL SNIPPETS('time is dying out like everething else here', 'test', 'nothing', 40 AS limit ) -CALL SNIPPETS('time is dying out like everething', 'test', 'nothing', 40 AS limit ) +CALL SNIPPETS('time is dying out like everething else here', 'test', 'nothing', 1 AS query_mode, 40 AS limit, 1 as allow_empty ) +CALL SNIPPETS('time is dying out like everething', 'test', 'nothing', 1 AS query_mode, 40 AS limit, 1 as allow_empty ) +CALL SNIPPETS('time is dying out like everething else here', 'test', 'nothing', 40 AS limit, 1 as allow_empty ) +CALL SNIPPETS('time is dying out like everething', 'test', 'nothing', 40 AS limit, 1 as allow_empty ) diff -Nru sphinxsearch-0.9.9+2.0.2beta/test/test_184/model.bin sphinxsearch-2.0.4/test/test_184/model.bin --- sphinxsearch-0.9.9+2.0.2beta/test/test_184/model.bin 2011-08-15 23:09:05.000000000 +0000 +++ sphinxsearch-2.0.4/test/test_184/model.bin 2012-01-16 19:58:05.000000000 +0000 @@ -1 +1 @@ -a:1:{i:0;a:8:{i:0;a:3:{s:8:"sphinxql";s:72:"select id, gid, weight(), title from test where match('seven') and gid=1";s:10:"total_rows";i:3;s:4:"rows";a:3:{i:0;a:4:{s:2:"id";s:3:"100";s:3:"gid";s:1:"1";s:8:"weight()";s:4:"1653";s:5:"title";s:30:"Seven lies multiplied by seven";}i:1;a:4:{s:2:"id";s:3:"102";s:3:"gid";s:1:"1";s:8:"weight()";s:4:"1653";s:5:"title";s:32:"Seven angels with seven trumpets";}i:2;a:4:{s:2:"id";s:3:"101";s:3:"gid";s:1:"1";s:8:"weight()";s:4:"1611";s:5:"title";s:25:"Multiplied by seven again";}}}i:1;a:3:{s:8:"sphinxql";s:113:"select id, gid, weight(), title from test where match('seven') and gid=1 option ranker=expr('sum(lcs)*1000+bm25')";s:10:"total_rows";i:3;s:4:"rows";a:3:{i:0;a:4:{s:2:"id";s:3:"100";s:3:"gid";s:1:"1";s:8:"weight()";s:4:"1653";s:5:"title";s:30:"Seven lies multiplied by seven";}i:1;a:4:{s:2:"id";s:3:"102";s:3:"gid";s:1:"1";s:8:"weight()";s:4:"1653";s:5:"title";s:32:"Seven angels with seven trumpets";}i:2;a:4:{s:2:"id";s:3:"101";s:3:"gid";s:1:"1";s:8:"weight()";s:4:"1611";s:5:"title";s:25:"Multiplied by seven again";}}}i:2;a:3:{s:8:"sphinxql";s:120:"select id, gid, weight(), title from test where match('seven') and gid=1 option ranker=expr('sum(300*lcs+700*lcs)+bm25')";s:10:"total_rows";i:3;s:4:"rows";a:3:{i:0;a:4:{s:2:"id";s:3:"100";s:3:"gid";s:1:"1";s:8:"weight()";s:4:"1653";s:5:"title";s:30:"Seven lies multiplied by seven";}i:1;a:4:{s:2:"id";s:3:"102";s:3:"gid";s:1:"1";s:8:"weight()";s:4:"1653";s:5:"title";s:32:"Seven angels with seven trumpets";}i:2;a:4:{s:2:"id";s:3:"101";s:3:"gid";s:1:"1";s:8:"weight()";s:4:"1611";s:5:"title";s:25:"Multiplied by seven again";}}}i:3;a:3:{s:8:"sphinxql";s:154:"select id, gid, weight(), title from test where match('seven|lies') and gid=1 option ranker=expr('query_word_count*100+sum(word_count)*10+sum(hit_count)')";s:10:"total_rows";i:3;s:4:"rows";a:3:{i:0;a:4:{s:2:"id";s:3:"100";s:3:"gid";s:1:"1";s:8:"weight()";s:3:"223";s:5:"title";s:30:"Seven lies multiplied by seven";}i:1;a:4:{s:2:"id";s:3:"102";s:3:"gid";s:1:"1";s:8:"weight()";s:3:"212";s:5:"title";s:32:"Seven angels with seven trumpets";}i:2;a:4:{s:2:"id";s:3:"101";s:3:"gid";s:1:"1";s:8:"weight()";s:3:"211";s:5:"title";s:25:"Multiplied by seven again";}}}i:4;a:3:{s:8:"sphinxql";s:167:"select id, gid, weight(), title from test where match('seven seven seven seven') and gid=1 option ranker=expr('query_word_count*100+sum(word_count)*10+sum(hit_count)')";s:10:"total_rows";i:3;s:4:"rows";a:3:{i:0;a:4:{s:2:"id";s:3:"100";s:3:"gid";s:1:"1";s:8:"weight()";s:3:"112";s:5:"title";s:30:"Seven lies multiplied by seven";}i:1;a:4:{s:2:"id";s:3:"102";s:3:"gid";s:1:"1";s:8:"weight()";s:3:"112";s:5:"title";s:32:"Seven angels with seven trumpets";}i:2;a:4:{s:2:"id";s:3:"101";s:3:"gid";s:1:"1";s:8:"weight()";s:3:"111";s:5:"title";s:25:"Multiplied by seven again";}}}i:5;a:3:{s:8:"sphinxql";s:156:"select id, gid, weight(), title from test where match('seven !se7en') and gid=1 option ranker=expr('query_word_count*100+sum(word_count)*10+sum(hit_count)')";s:10:"total_rows";i:3;s:4:"rows";a:3:{i:0;a:4:{s:2:"id";s:3:"100";s:3:"gid";s:1:"1";s:8:"weight()";s:3:"112";s:5:"title";s:30:"Seven lies multiplied by seven";}i:1;a:4:{s:2:"id";s:3:"102";s:3:"gid";s:1:"1";s:8:"weight()";s:3:"112";s:5:"title";s:32:"Seven angels with seven trumpets";}i:2;a:4:{s:2:"id";s:3:"101";s:3:"gid";s:1:"1";s:8:"weight()";s:3:"111";s:5:"title";s:25:"Multiplied by seven again";}}}i:6;a:3:{s:8:"sphinxql";s:163:"select id, gid, weight(), title from test where match('seven !(angels !by)') and gid=1 option ranker=expr('query_word_count*100+sum(word_count)*10+sum(hit_count)')";s:10:"total_rows";i:2;s:4:"rows";a:2:{i:0;a:4:{s:2:"id";s:3:"100";s:3:"gid";s:1:"1";s:8:"weight()";s:3:"212";s:5:"title";s:30:"Seven lies multiplied by seven";}i:1;a:4:{s:2:"id";s:3:"101";s:3:"gid";s:1:"1";s:8:"weight()";s:3:"211";s:5:"title";s:25:"Multiplied by seven again";}}}i:7;a:3:{s:8:"sphinxql";s:129:"select id, gid, weight(), title from test where match('lamb') and gid=2 option ranker=expr('doc_word_count*1000+sum(word_count)')";s:10:"total_rows";i:3;s:4:"rows";a:3:{i:0;a:4:{s:2:"id";s:3:"110";s:3:"gid";s:1:"2";s:8:"weight()";s:4:"1002";s:5:"title";s:12:"Mary vs Lamb";}i:1;a:4:{s:2:"id";s:3:"111";s:3:"gid";s:1:"2";s:8:"weight()";s:4:"1001";s:5:"title";s:34:"Mary vs Lamb 2: Return of The Lamb";}i:2;a:4:{s:2:"id";s:3:"112";s:3:"gid";s:1:"2";s:8:"weight()";s:4:"1001";s:5:"title";s:32:"Mary vs Lamb 3: The Resurrection";}}}}} \ No newline at end of file +a:1:{i:0;a:11:{i:0;a:3:{s:8:"sphinxql";s:72:"select id, gid, weight(), title from test where match('seven') and gid=1";s:10:"total_rows";i:3;s:4:"rows";a:3:{i:0;a:4:{s:2:"id";s:3:"100";s:3:"gid";s:1:"1";s:8:"weight()";s:4:"1653";s:5:"title";s:30:"Seven lies multiplied by seven";}i:1;a:4:{s:2:"id";s:3:"102";s:3:"gid";s:1:"1";s:8:"weight()";s:4:"1653";s:5:"title";s:32:"Seven angels with seven trumpets";}i:2;a:4:{s:2:"id";s:3:"101";s:3:"gid";s:1:"1";s:8:"weight()";s:4:"1611";s:5:"title";s:25:"Multiplied by seven again";}}}i:1;a:3:{s:8:"sphinxql";s:113:"select id, gid, weight(), title from test where match('seven') and gid=1 option ranker=expr('sum(lcs)*1000+bm25')";s:10:"total_rows";i:3;s:4:"rows";a:3:{i:0;a:4:{s:2:"id";s:3:"100";s:3:"gid";s:1:"1";s:8:"weight()";s:4:"1653";s:5:"title";s:30:"Seven lies multiplied by seven";}i:1;a:4:{s:2:"id";s:3:"102";s:3:"gid";s:1:"1";s:8:"weight()";s:4:"1653";s:5:"title";s:32:"Seven angels with seven trumpets";}i:2;a:4:{s:2:"id";s:3:"101";s:3:"gid";s:1:"1";s:8:"weight()";s:4:"1611";s:5:"title";s:25:"Multiplied by seven again";}}}i:2;a:3:{s:8:"sphinxql";s:120:"select id, gid, weight(), title from test where match('seven') and gid=1 option ranker=expr('sum(300*lcs+700*lcs)+bm25')";s:10:"total_rows";i:3;s:4:"rows";a:3:{i:0;a:4:{s:2:"id";s:3:"100";s:3:"gid";s:1:"1";s:8:"weight()";s:4:"1653";s:5:"title";s:30:"Seven lies multiplied by seven";}i:1;a:4:{s:2:"id";s:3:"102";s:3:"gid";s:1:"1";s:8:"weight()";s:4:"1653";s:5:"title";s:32:"Seven angels with seven trumpets";}i:2;a:4:{s:2:"id";s:3:"101";s:3:"gid";s:1:"1";s:8:"weight()";s:4:"1611";s:5:"title";s:25:"Multiplied by seven again";}}}i:3;a:3:{s:8:"sphinxql";s:154:"select id, gid, weight(), title from test where match('seven|lies') and gid=1 option ranker=expr('query_word_count*100+sum(word_count)*10+sum(hit_count)')";s:10:"total_rows";i:3;s:4:"rows";a:3:{i:0;a:4:{s:2:"id";s:3:"100";s:3:"gid";s:1:"1";s:8:"weight()";s:3:"223";s:5:"title";s:30:"Seven lies multiplied by seven";}i:1;a:4:{s:2:"id";s:3:"102";s:3:"gid";s:1:"1";s:8:"weight()";s:3:"212";s:5:"title";s:32:"Seven angels with seven trumpets";}i:2;a:4:{s:2:"id";s:3:"101";s:3:"gid";s:1:"1";s:8:"weight()";s:3:"211";s:5:"title";s:25:"Multiplied by seven again";}}}i:4;a:3:{s:8:"sphinxql";s:167:"select id, gid, weight(), title from test where match('seven seven seven seven') and gid=1 option ranker=expr('query_word_count*100+sum(word_count)*10+sum(hit_count)')";s:10:"total_rows";i:3;s:4:"rows";a:3:{i:0;a:4:{s:2:"id";s:3:"100";s:3:"gid";s:1:"1";s:8:"weight()";s:3:"112";s:5:"title";s:30:"Seven lies multiplied by seven";}i:1;a:4:{s:2:"id";s:3:"102";s:3:"gid";s:1:"1";s:8:"weight()";s:3:"112";s:5:"title";s:32:"Seven angels with seven trumpets";}i:2;a:4:{s:2:"id";s:3:"101";s:3:"gid";s:1:"1";s:8:"weight()";s:3:"111";s:5:"title";s:25:"Multiplied by seven again";}}}i:5;a:3:{s:8:"sphinxql";s:156:"select id, gid, weight(), title from test where match('seven !se7en') and gid=1 option ranker=expr('query_word_count*100+sum(word_count)*10+sum(hit_count)')";s:10:"total_rows";i:3;s:4:"rows";a:3:{i:0;a:4:{s:2:"id";s:3:"100";s:3:"gid";s:1:"1";s:8:"weight()";s:3:"112";s:5:"title";s:30:"Seven lies multiplied by seven";}i:1;a:4:{s:2:"id";s:3:"102";s:3:"gid";s:1:"1";s:8:"weight()";s:3:"112";s:5:"title";s:32:"Seven angels with seven trumpets";}i:2;a:4:{s:2:"id";s:3:"101";s:3:"gid";s:1:"1";s:8:"weight()";s:3:"111";s:5:"title";s:25:"Multiplied by seven again";}}}i:6;a:3:{s:8:"sphinxql";s:163:"select id, gid, weight(), title from test where match('seven !(angels !by)') and gid=1 option ranker=expr('query_word_count*100+sum(word_count)*10+sum(hit_count)')";s:10:"total_rows";i:2;s:4:"rows";a:2:{i:0;a:4:{s:2:"id";s:3:"100";s:3:"gid";s:1:"1";s:8:"weight()";s:3:"212";s:5:"title";s:30:"Seven lies multiplied by seven";}i:1;a:4:{s:2:"id";s:3:"101";s:3:"gid";s:1:"1";s:8:"weight()";s:3:"211";s:5:"title";s:25:"Multiplied by seven again";}}}i:7;a:3:{s:8:"sphinxql";s:129:"select id, gid, weight(), title from test where match('lamb') and gid=2 option ranker=expr('doc_word_count*1000+sum(word_count)')";s:10:"total_rows";i:3;s:4:"rows";a:3:{i:0;a:4:{s:2:"id";s:3:"110";s:3:"gid";s:1:"2";s:8:"weight()";s:4:"1002";s:5:"title";s:12:"Mary vs Lamb";}i:1;a:4:{s:2:"id";s:3:"111";s:3:"gid";s:1:"2";s:8:"weight()";s:4:"1001";s:5:"title";s:34:"Mary vs Lamb 2: Return of The Lamb";}i:2;a:4:{s:2:"id";s:3:"112";s:3:"gid";s:1:"2";s:8:"weight()";s:4:"1001";s:5:"title";s:32:"Mary vs Lamb 3: The Resurrection";}}}i:8;a:3:{s:8:"sphinxql";s:154:"select id, gid, weight(), title from dist where match('seven|lies') and gid=1 option ranker=expr('query_word_count*100+sum(word_count)*10+sum(hit_count)')";s:10:"total_rows";i:3;s:4:"rows";a:3:{i:0;a:4:{s:2:"id";s:3:"100";s:3:"gid";s:1:"1";s:8:"weight()";s:3:"223";s:5:"title";s:30:"Seven lies multiplied by seven";}i:1;a:4:{s:2:"id";s:3:"102";s:3:"gid";s:1:"1";s:8:"weight()";s:3:"212";s:5:"title";s:32:"Seven angels with seven trumpets";}i:2;a:4:{s:2:"id";s:3:"101";s:3:"gid";s:1:"1";s:8:"weight()";s:3:"211";s:5:"title";s:25:"Multiplied by seven again";}}}i:9;a:3:{s:8:"sphinxql";s:163:"select id, gid, weight(), title from dist where match('seven !(angels !by)') and gid=1 option ranker=expr('query_word_count*100+sum(word_count)*10+sum(hit_count)')";s:10:"total_rows";i:2;s:4:"rows";a:2:{i:0;a:4:{s:2:"id";s:3:"100";s:3:"gid";s:1:"1";s:8:"weight()";s:3:"212";s:5:"title";s:30:"Seven lies multiplied by seven";}i:1;a:4:{s:2:"id";s:3:"101";s:3:"gid";s:1:"1";s:8:"weight()";s:3:"211";s:5:"title";s:25:"Multiplied by seven again";}}}i:10;a:3:{s:8:"sphinxql";s:129:"select id, gid, weight(), title from dist where match('lamb') and gid=2 option ranker=expr('doc_word_count*1000+sum(word_count)')";s:10:"total_rows";i:3;s:4:"rows";a:3:{i:0;a:4:{s:2:"id";s:3:"110";s:3:"gid";s:1:"2";s:8:"weight()";s:4:"1002";s:5:"title";s:12:"Mary vs Lamb";}i:1;a:4:{s:2:"id";s:3:"111";s:3:"gid";s:1:"2";s:8:"weight()";s:4:"1001";s:5:"title";s:34:"Mary vs Lamb 2: Return of The Lamb";}i:2;a:4:{s:2:"id";s:3:"112";s:3:"gid";s:1:"2";s:8:"weight()";s:4:"1001";s:5:"title";s:32:"Mary vs Lamb 3: The Resurrection";}}}}} \ No newline at end of file diff -Nru sphinxsearch-0.9.9+2.0.2beta/test/test_184/test.xml sphinxsearch-2.0.4/test/test_184/test.xml --- sphinxsearch-0.9.9+2.0.2beta/test/test_184/test.xml 2011-08-15 23:09:05.000000000 +0000 +++ sphinxsearch-2.0.4/test/test_184/test.xml 2012-01-16 19:58:05.000000000 +0000 @@ -13,6 +13,8 @@ { compat_sphinxql_magics = 0 + workers = threads + binlog_path = # } source test @@ -29,6 +31,14 @@ source = test path = /test } + +index dist +{ + type = distributed + agent = :test + agent_connect_timeout = 1000 + agent_query_timeout = 3000 +} @@ -73,6 +83,12 @@ select id, gid, weight(), title from test where match('lamb') and gid=2 option ranker=expr('doc_word_count*1000+sum(word_count)') + + +select id, gid, weight(), title from dist where match('seven|lies') and gid=1 option ranker=expr('query_word_count*100+sum(word_count)*10+sum(hit_count)') +select id, gid, weight(), title from dist where match('seven !(angels !by)') and gid=1 option ranker=expr('query_word_count*100+sum(word_count)*10+sum(hit_count)') +select id, gid, weight(), title from dist where match('lamb') and gid=2 option ranker=expr('doc_word_count*1000+sum(word_count)') + diff -Nru sphinxsearch-0.9.9+2.0.2beta/test/test_185/model.bin sphinxsearch-2.0.4/test/test_185/model.bin --- sphinxsearch-0.9.9+2.0.2beta/test/test_185/model.bin 2011-08-26 15:09:39.000000000 +0000 +++ sphinxsearch-2.0.4/test/test_185/model.bin 2011-11-30 13:27:24.000000000 +0000 @@ -1 +1 @@ -a:2:{i:0;a:17:{i:0;a:2:{s:8:"sphinxql";s:111:"insert into rt (id, gid, mva1, mva2, body) values (1, 11, (1, 1), (2), 'dummy'), (3, 33, (3, 3), (3), 'dummy1')";s:14:"total_affected";i:2;}i:1;a:2:{s:8:"sphinxql";s:83:"update dist_no set mva1=(3,2, 1, 2), mva1=(1, 2), section=111 where match ('test1')";s:14:"total_affected";i:1;}i:2;a:3:{s:8:"sphinxql";s:21:"select * from dist_no";s:10:"total_rows";i:3;s:4:"rows";a:3:{i:0;a:4:{s:2:"id";s:1:"1";s:6:"weight";s:1:"1";s:7:"section";s:3:"111";s:4:"mva1";s:3:"1,2";}i:1;a:4:{s:2:"id";s:1:"2";s:6:"weight";s:1:"1";s:7:"section";s:3:"102";s:4:"mva1";s:14:"1002,1023,4456";}i:2;a:4:{s:2:"id";s:1:"3";s:6:"weight";s:1:"1";s:7:"section";s:3:"103";s:4:"mva1";s:14:"1003,1008,1010";}}}i:3;a:2:{s:8:"sphinxql";s:81:"update dist0 set mva1=(4,5, 1, 2), mva1=(8, 7), section=112 where match ('test1')";s:14:"total_affected";i:1;}i:4;a:3:{s:8:"sphinxql";s:19:"select * from dist0";s:10:"total_rows";i:3;s:4:"rows";a:3:{i:0;a:4:{s:2:"id";s:1:"1";s:6:"weight";s:1:"1";s:7:"section";s:3:"112";s:4:"mva1";s:3:"7,8";}i:1;a:4:{s:2:"id";s:1:"2";s:6:"weight";s:1:"1";s:7:"section";s:3:"102";s:4:"mva1";s:14:"1002,1023,4456";}i:2;a:4:{s:2:"id";s:1:"3";s:6:"weight";s:1:"1";s:7:"section";s:3:"103";s:4:"mva1";s:14:"1003,1008,1010";}}}i:5;a:2:{s:8:"sphinxql";s:92:"update dist1 set mva1=(3,2, 1, 2), mva1=(9, 10), section=113 where match ('testt') and id>=2";s:14:"total_affected";i:1;}i:6;a:3:{s:8:"sphinxql";s:19:"select * from dist1";s:10:"total_rows";i:3;s:4:"rows";a:3:{i:0;a:4:{s:2:"id";s:1:"1";s:6:"weight";s:1:"1";s:7:"section";s:3:"101";s:4:"mva1";s:4:"1001";}i:1;a:4:{s:2:"id";s:1:"2";s:6:"weight";s:1:"1";s:7:"section";s:3:"113";s:4:"mva1";s:4:"9,10";}i:2;a:4:{s:2:"id";s:1:"3";s:6:"weight";s:1:"1";s:7:"section";s:3:"103";s:4:"mva1";s:14:"1003,1008,1010";}}}i:7;a:2:{s:8:"sphinxql";s:93:"update dist2 set mva1=(3,2, 1, 2), mva1=(11, 12), section=114 where match ('testt') and id>=2";s:14:"total_affected";i:1;}i:8;a:3:{s:8:"sphinxql";s:19:"select * from dist2";s:10:"total_rows";i:3;s:4:"rows";a:3:{i:0;a:4:{s:2:"id";s:1:"1";s:6:"weight";s:1:"1";s:7:"section";s:3:"101";s:4:"mva1";s:4:"1001";}i:1;a:4:{s:2:"id";s:1:"2";s:6:"weight";s:1:"1";s:7:"section";s:3:"114";s:4:"mva1";s:5:"11,12";}i:2;a:4:{s:2:"id";s:1:"3";s:6:"weight";s:1:"1";s:7:"section";s:3:"103";s:4:"mva1";s:14:"1003,1008,1010";}}}i:9;a:3:{s:8:"sphinxql";s:97:"update dist3 set mva1=(3,2, 1, 2), mva1=(13, 14), section=115 where gid match ('testt') and id>=2";s:5:"error";s:112:"sphinxql: syntax error, unexpected MATCH, expecting BETWEEN (or 8 other tokens) near 'match ('testt') and id>=2'";s:5:"errno";i:1064;}i:10;a:3:{s:8:"sphinxql";s:19:"select * from dist3";s:10:"total_rows";i:3;s:4:"rows";a:3:{i:0;a:4:{s:2:"id";s:1:"1";s:6:"weight";s:1:"1";s:7:"section";s:3:"101";s:4:"mva1";s:4:"1001";}i:1;a:4:{s:2:"id";s:1:"2";s:6:"weight";s:1:"1";s:7:"section";s:3:"114";s:4:"mva1";s:5:"11,12";}i:2;a:4:{s:2:"id";s:1:"3";s:6:"weight";s:1:"1";s:7:"section";s:3:"103";s:4:"mva1";s:14:"1003,1008,1010";}}}i:11;a:2:{s:8:"sphinxql";s:93:"update dist4 set mva1=(3,2, 1, 2), mva1=(15, 16), section=116 where match ('testt') and id>=2";s:14:"total_affected";i:1;}i:12;a:3:{s:8:"sphinxql";s:19:"select * from dist4";s:10:"total_rows";i:3;s:4:"rows";a:3:{i:0;a:4:{s:2:"id";s:1:"1";s:6:"weight";s:1:"1";s:7:"section";s:3:"101";s:4:"mva1";s:4:"1001";}i:1;a:4:{s:2:"id";s:1:"2";s:6:"weight";s:1:"1";s:7:"section";s:3:"116";s:4:"mva1";s:5:"15,16";}i:2;a:4:{s:2:"id";s:1:"3";s:6:"weight";s:1:"1";s:7:"section";s:3:"103";s:4:"mva1";s:14:"1003,1008,1010";}}}i:13;a:2:{s:8:"sphinxql";s:93:"update dist5 set mva1=(3,2, 1, 2), mva1=(17, 18), section=117 where match ('testt') and id>=2";s:14:"total_affected";i:1;}i:14;a:3:{s:8:"sphinxql";s:19:"select * from dist5";s:10:"total_rows";i:3;s:4:"rows";a:3:{i:0;a:4:{s:2:"id";s:1:"1";s:6:"weight";s:1:"1";s:7:"section";s:3:"112";s:4:"mva1";s:3:"7,8";}i:1;a:4:{s:2:"id";s:1:"2";s:6:"weight";s:1:"1";s:7:"section";s:3:"117";s:4:"mva1";s:5:"17,18";}i:2;a:4:{s:2:"id";s:1:"3";s:6:"weight";s:1:"1";s:7:"section";s:3:"103";s:4:"mva1";s:14:"1003,1008,1010";}}}i:15;a:2:{s:8:"sphinxql";s:90:"update rt set mva1=(3,2, 1, 2), gid=3212, mva2=(1, 2, 3, 4, 5, 6), mva2=(3,4,5) where id=1";s:14:"total_affected";i:1;}i:16;a:3:{s:8:"sphinxql";s:16:"select * from rt";s:10:"total_rows";i:2;s:4:"rows";a:2:{i:0;a:5:{s:2:"id";s:1:"1";s:6:"weight";s:1:"1";s:3:"gid";s:4:"3212";s:4:"mva1";s:5:"1,2,3";s:4:"mva2";s:5:"3,4,5";}i:1;a:5:{s:2:"id";s:1:"3";s:6:"weight";s:1:"1";s:3:"gid";s:2:"33";s:4:"mva1";s:1:"3";s:4:"mva2";s:1:"3";}}}}i:1;a:17:{i:0;a:2:{s:8:"sphinxql";s:111:"insert into rt (id, gid, mva1, mva2, body) values (1, 11, (1, 1), (2), 'dummy'), (3, 33, (3, 3), (3), 'dummy1')";s:14:"total_affected";i:2;}i:1;a:2:{s:8:"sphinxql";s:83:"update dist_no set mva1=(3,2, 1, 2), mva1=(1, 2), section=111 where match ('test1')";s:14:"total_affected";i:1;}i:2;a:3:{s:8:"sphinxql";s:21:"select * from dist_no";s:10:"total_rows";i:3;s:4:"rows";a:3:{i:0;a:4:{s:2:"id";s:1:"1";s:6:"weight";s:1:"1";s:7:"section";s:3:"111";s:4:"mva1";s:3:"1,2";}i:1;a:4:{s:2:"id";s:1:"2";s:6:"weight";s:1:"1";s:7:"section";s:3:"102";s:4:"mva1";s:14:"1002,1023,4456";}i:2;a:4:{s:2:"id";s:1:"3";s:6:"weight";s:1:"1";s:7:"section";s:3:"103";s:4:"mva1";s:14:"1003,1008,1010";}}}i:3;a:2:{s:8:"sphinxql";s:81:"update dist0 set mva1=(4,5, 1, 2), mva1=(8, 7), section=112 where match ('test1')";s:14:"total_affected";i:1;}i:4;a:3:{s:8:"sphinxql";s:19:"select * from dist0";s:10:"total_rows";i:3;s:4:"rows";a:3:{i:0;a:4:{s:2:"id";s:1:"1";s:6:"weight";s:1:"1";s:7:"section";s:3:"112";s:4:"mva1";s:3:"7,8";}i:1;a:4:{s:2:"id";s:1:"2";s:6:"weight";s:1:"1";s:7:"section";s:3:"102";s:4:"mva1";s:14:"1002,1023,4456";}i:2;a:4:{s:2:"id";s:1:"3";s:6:"weight";s:1:"1";s:7:"section";s:3:"103";s:4:"mva1";s:14:"1003,1008,1010";}}}i:5;a:2:{s:8:"sphinxql";s:92:"update dist1 set mva1=(3,2, 1, 2), mva1=(9, 10), section=113 where match ('testt') and id>=2";s:14:"total_affected";i:1;}i:6;a:3:{s:8:"sphinxql";s:19:"select * from dist1";s:10:"total_rows";i:3;s:4:"rows";a:3:{i:0;a:4:{s:2:"id";s:1:"1";s:6:"weight";s:1:"1";s:7:"section";s:3:"101";s:4:"mva1";s:4:"1001";}i:1;a:4:{s:2:"id";s:1:"2";s:6:"weight";s:1:"1";s:7:"section";s:3:"113";s:4:"mva1";s:4:"9,10";}i:2;a:4:{s:2:"id";s:1:"3";s:6:"weight";s:1:"1";s:7:"section";s:3:"103";s:4:"mva1";s:14:"1003,1008,1010";}}}i:7;a:2:{s:8:"sphinxql";s:93:"update dist2 set mva1=(3,2, 1, 2), mva1=(11, 12), section=114 where match ('testt') and id>=2";s:14:"total_affected";i:1;}i:8;a:3:{s:8:"sphinxql";s:19:"select * from dist2";s:10:"total_rows";i:3;s:4:"rows";a:3:{i:0;a:4:{s:2:"id";s:1:"1";s:6:"weight";s:1:"1";s:7:"section";s:3:"101";s:4:"mva1";s:4:"1001";}i:1;a:4:{s:2:"id";s:1:"2";s:6:"weight";s:1:"1";s:7:"section";s:3:"114";s:4:"mva1";s:5:"11,12";}i:2;a:4:{s:2:"id";s:1:"3";s:6:"weight";s:1:"1";s:7:"section";s:3:"103";s:4:"mva1";s:14:"1003,1008,1010";}}}i:9;a:3:{s:8:"sphinxql";s:97:"update dist3 set mva1=(3,2, 1, 2), mva1=(13, 14), section=115 where gid match ('testt') and id>=2";s:5:"error";s:112:"sphinxql: syntax error, unexpected MATCH, expecting BETWEEN (or 8 other tokens) near 'match ('testt') and id>=2'";s:5:"errno";i:1064;}i:10;a:3:{s:8:"sphinxql";s:19:"select * from dist3";s:10:"total_rows";i:3;s:4:"rows";a:3:{i:0;a:4:{s:2:"id";s:1:"1";s:6:"weight";s:1:"1";s:7:"section";s:3:"101";s:4:"mva1";s:4:"1001";}i:1;a:4:{s:2:"id";s:1:"2";s:6:"weight";s:1:"1";s:7:"section";s:3:"114";s:4:"mva1";s:5:"11,12";}i:2;a:4:{s:2:"id";s:1:"3";s:6:"weight";s:1:"1";s:7:"section";s:3:"103";s:4:"mva1";s:14:"1003,1008,1010";}}}i:11;a:2:{s:8:"sphinxql";s:93:"update dist4 set mva1=(3,2, 1, 2), mva1=(15, 16), section=116 where match ('testt') and id>=2";s:14:"total_affected";i:1;}i:12;a:3:{s:8:"sphinxql";s:19:"select * from dist4";s:10:"total_rows";i:3;s:4:"rows";a:3:{i:0;a:4:{s:2:"id";s:1:"1";s:6:"weight";s:1:"1";s:7:"section";s:3:"101";s:4:"mva1";s:4:"1001";}i:1;a:4:{s:2:"id";s:1:"2";s:6:"weight";s:1:"1";s:7:"section";s:3:"116";s:4:"mva1";s:5:"15,16";}i:2;a:4:{s:2:"id";s:1:"3";s:6:"weight";s:1:"1";s:7:"section";s:3:"103";s:4:"mva1";s:14:"1003,1008,1010";}}}i:13;a:2:{s:8:"sphinxql";s:93:"update dist5 set mva1=(3,2, 1, 2), mva1=(17, 18), section=117 where match ('testt') and id>=2";s:14:"total_affected";i:1;}i:14;a:3:{s:8:"sphinxql";s:19:"select * from dist5";s:10:"total_rows";i:3;s:4:"rows";a:3:{i:0;a:4:{s:2:"id";s:1:"1";s:6:"weight";s:1:"1";s:7:"section";s:3:"112";s:4:"mva1";s:3:"7,8";}i:1;a:4:{s:2:"id";s:1:"2";s:6:"weight";s:1:"1";s:7:"section";s:3:"117";s:4:"mva1";s:5:"17,18";}i:2;a:4:{s:2:"id";s:1:"3";s:6:"weight";s:1:"1";s:7:"section";s:3:"103";s:4:"mva1";s:14:"1003,1008,1010";}}}i:15;a:2:{s:8:"sphinxql";s:90:"update rt set mva1=(3,2, 1, 2), gid=3212, mva2=(1, 2, 3, 4, 5, 6), mva2=(3,4,5) where id=1";s:14:"total_affected";i:1;}i:16;a:3:{s:8:"sphinxql";s:16:"select * from rt";s:10:"total_rows";i:2;s:4:"rows";a:2:{i:0;a:5:{s:2:"id";s:1:"1";s:6:"weight";s:1:"1";s:3:"gid";s:4:"3212";s:4:"mva1";s:5:"1,2,3";s:4:"mva2";s:5:"3,4,5";}i:1;a:5:{s:2:"id";s:1:"3";s:6:"weight";s:1:"1";s:3:"gid";s:2:"33";s:4:"mva1";s:1:"3";s:4:"mva2";s:1:"3";}}}}} \ No newline at end of file +a:2:{i:0;a:19:{i:0;a:2:{s:8:"sphinxql";s:111:"insert into rt (id, gid, mva1, mva2, body) values (1, 11, (1, 1), (2), 'dummy'), (3, 33, (3, 3), (3), 'dummy1')";s:14:"total_affected";i:2;}i:1;a:2:{s:8:"sphinxql";s:83:"update dist_no set mva1=(3,2, 1, 2), mva1=(1, 2), section=111 where match ('test1')";s:14:"total_affected";i:1;}i:2;a:3:{s:8:"sphinxql";s:21:"select * from dist_no";s:10:"total_rows";i:3;s:4:"rows";a:3:{i:0;a:4:{s:2:"id";s:1:"1";s:6:"weight";s:1:"1";s:7:"section";s:3:"111";s:4:"mva1";s:3:"1,2";}i:1;a:4:{s:2:"id";s:1:"2";s:6:"weight";s:1:"1";s:7:"section";s:3:"102";s:4:"mva1";s:14:"1002,1023,4456";}i:2;a:4:{s:2:"id";s:1:"3";s:6:"weight";s:1:"1";s:7:"section";s:3:"103";s:4:"mva1";s:14:"1003,1008,1010";}}}i:3;a:2:{s:8:"sphinxql";s:81:"update dist0 set mva1=(4,5, 1, 2), mva1=(8, 7), section=112 where match ('test1')";s:14:"total_affected";i:1;}i:4;a:3:{s:8:"sphinxql";s:19:"select * from dist0";s:10:"total_rows";i:3;s:4:"rows";a:3:{i:0;a:4:{s:2:"id";s:1:"1";s:6:"weight";s:1:"1";s:7:"section";s:3:"112";s:4:"mva1";s:3:"7,8";}i:1;a:4:{s:2:"id";s:1:"2";s:6:"weight";s:1:"1";s:7:"section";s:3:"102";s:4:"mva1";s:14:"1002,1023,4456";}i:2;a:4:{s:2:"id";s:1:"3";s:6:"weight";s:1:"1";s:7:"section";s:3:"103";s:4:"mva1";s:14:"1003,1008,1010";}}}i:5;a:2:{s:8:"sphinxql";s:92:"update dist1 set mva1=(3,2, 1, 2), mva1=(9, 10), section=113 where match ('testt') and id>=2";s:14:"total_affected";i:1;}i:6;a:3:{s:8:"sphinxql";s:19:"select * from dist1";s:10:"total_rows";i:3;s:4:"rows";a:3:{i:0;a:4:{s:2:"id";s:1:"1";s:6:"weight";s:1:"1";s:7:"section";s:3:"101";s:4:"mva1";s:4:"1001";}i:1;a:4:{s:2:"id";s:1:"2";s:6:"weight";s:1:"1";s:7:"section";s:3:"113";s:4:"mva1";s:4:"9,10";}i:2;a:4:{s:2:"id";s:1:"3";s:6:"weight";s:1:"1";s:7:"section";s:3:"103";s:4:"mva1";s:14:"1003,1008,1010";}}}i:7;a:2:{s:8:"sphinxql";s:93:"update dist2 set mva1=(3,2, 1, 2), mva1=(11, 12), section=114 where match ('testt') and id>=2";s:14:"total_affected";i:1;}i:8;a:3:{s:8:"sphinxql";s:19:"select * from dist2";s:10:"total_rows";i:3;s:4:"rows";a:3:{i:0;a:4:{s:2:"id";s:1:"1";s:6:"weight";s:1:"1";s:7:"section";s:3:"101";s:4:"mva1";s:4:"1001";}i:1;a:4:{s:2:"id";s:1:"2";s:6:"weight";s:1:"1";s:7:"section";s:3:"114";s:4:"mva1";s:5:"11,12";}i:2;a:4:{s:2:"id";s:1:"3";s:6:"weight";s:1:"1";s:7:"section";s:3:"103";s:4:"mva1";s:14:"1003,1008,1010";}}}i:9;a:3:{s:8:"sphinxql";s:97:"update dist3 set mva1=(3,2, 1, 2), mva1=(13, 14), section=115 where gid match ('testt') and id>=2";s:5:"error";s:112:"sphinxql: syntax error, unexpected MATCH, expecting BETWEEN (or 8 other tokens) near 'match ('testt') and id>=2'";s:5:"errno";i:1064;}i:10;a:3:{s:8:"sphinxql";s:19:"select * from dist3";s:10:"total_rows";i:3;s:4:"rows";a:3:{i:0;a:4:{s:2:"id";s:1:"1";s:6:"weight";s:1:"1";s:7:"section";s:3:"101";s:4:"mva1";s:4:"1001";}i:1;a:4:{s:2:"id";s:1:"2";s:6:"weight";s:1:"1";s:7:"section";s:3:"114";s:4:"mva1";s:5:"11,12";}i:2;a:4:{s:2:"id";s:1:"3";s:6:"weight";s:1:"1";s:7:"section";s:3:"103";s:4:"mva1";s:14:"1003,1008,1010";}}}i:11;a:2:{s:8:"sphinxql";s:93:"update dist4 set mva1=(3,2, 1, 2), mva1=(15, 16), section=116 where match ('testt') and id>=2";s:14:"total_affected";i:1;}i:12;a:3:{s:8:"sphinxql";s:19:"select * from dist4";s:10:"total_rows";i:3;s:4:"rows";a:3:{i:0;a:4:{s:2:"id";s:1:"1";s:6:"weight";s:1:"1";s:7:"section";s:3:"101";s:4:"mva1";s:4:"1001";}i:1;a:4:{s:2:"id";s:1:"2";s:6:"weight";s:1:"1";s:7:"section";s:3:"116";s:4:"mva1";s:5:"15,16";}i:2;a:4:{s:2:"id";s:1:"3";s:6:"weight";s:1:"1";s:7:"section";s:3:"103";s:4:"mva1";s:14:"1003,1008,1010";}}}i:13;a:2:{s:8:"sphinxql";s:93:"update dist5 set mva1=(3,2, 1, 2), mva1=(17, 18), section=117 where match ('testt') and id>=2";s:14:"total_affected";i:1;}i:14;a:3:{s:8:"sphinxql";s:19:"select * from dist5";s:10:"total_rows";i:3;s:4:"rows";a:3:{i:0;a:4:{s:2:"id";s:1:"1";s:6:"weight";s:1:"1";s:7:"section";s:3:"112";s:4:"mva1";s:3:"7,8";}i:1;a:4:{s:2:"id";s:1:"2";s:6:"weight";s:1:"1";s:7:"section";s:3:"117";s:4:"mva1";s:5:"17,18";}i:2;a:4:{s:2:"id";s:1:"3";s:6:"weight";s:1:"1";s:7:"section";s:3:"103";s:4:"mva1";s:14:"1003,1008,1010";}}}i:15;a:2:{s:8:"sphinxql";s:90:"update rt set mva1=(3,2, 1, 2), gid=3212, mva2=(1, 2, 3, 4, 5, 6), mva2=(3,4,5) where id=1";s:14:"total_affected";i:1;}i:16;a:3:{s:8:"sphinxql";s:16:"select * from rt";s:10:"total_rows";i:2;s:4:"rows";a:2:{i:0;a:5:{s:2:"id";s:1:"1";s:6:"weight";s:1:"1";s:3:"gid";s:4:"3212";s:4:"mva1";s:5:"1,2,3";s:4:"mva2";s:5:"3,4,5";}i:1;a:5:{s:2:"id";s:1:"3";s:6:"weight";s:1:"1";s:3:"gid";s:2:"33";s:4:"mva1";s:1:"3";s:4:"mva2";s:1:"3";}}}i:17;a:2:{s:8:"sphinxql";s:32:"update rt set mva1=() where id=3";s:14:"total_affected";i:1;}i:18;a:3:{s:8:"sphinxql";s:16:"select * from rt";s:10:"total_rows";i:2;s:4:"rows";a:2:{i:0;a:5:{s:2:"id";s:1:"1";s:6:"weight";s:1:"1";s:3:"gid";s:4:"3212";s:4:"mva1";s:5:"1,2,3";s:4:"mva2";s:5:"3,4,5";}i:1;a:5:{s:2:"id";s:1:"3";s:6:"weight";s:1:"1";s:3:"gid";s:2:"33";s:4:"mva1";s:0:"";s:4:"mva2";s:1:"3";}}}}i:1;a:19:{i:0;a:2:{s:8:"sphinxql";s:111:"insert into rt (id, gid, mva1, mva2, body) values (1, 11, (1, 1), (2), 'dummy'), (3, 33, (3, 3), (3), 'dummy1')";s:14:"total_affected";i:2;}i:1;a:2:{s:8:"sphinxql";s:83:"update dist_no set mva1=(3,2, 1, 2), mva1=(1, 2), section=111 where match ('test1')";s:14:"total_affected";i:1;}i:2;a:3:{s:8:"sphinxql";s:21:"select * from dist_no";s:10:"total_rows";i:3;s:4:"rows";a:3:{i:0;a:4:{s:2:"id";s:1:"1";s:6:"weight";s:1:"1";s:7:"section";s:3:"111";s:4:"mva1";s:3:"1,2";}i:1;a:4:{s:2:"id";s:1:"2";s:6:"weight";s:1:"1";s:7:"section";s:3:"102";s:4:"mva1";s:14:"1002,1023,4456";}i:2;a:4:{s:2:"id";s:1:"3";s:6:"weight";s:1:"1";s:7:"section";s:3:"103";s:4:"mva1";s:14:"1003,1008,1010";}}}i:3;a:2:{s:8:"sphinxql";s:81:"update dist0 set mva1=(4,5, 1, 2), mva1=(8, 7), section=112 where match ('test1')";s:14:"total_affected";i:1;}i:4;a:3:{s:8:"sphinxql";s:19:"select * from dist0";s:10:"total_rows";i:3;s:4:"rows";a:3:{i:0;a:4:{s:2:"id";s:1:"1";s:6:"weight";s:1:"1";s:7:"section";s:3:"112";s:4:"mva1";s:3:"7,8";}i:1;a:4:{s:2:"id";s:1:"2";s:6:"weight";s:1:"1";s:7:"section";s:3:"102";s:4:"mva1";s:14:"1002,1023,4456";}i:2;a:4:{s:2:"id";s:1:"3";s:6:"weight";s:1:"1";s:7:"section";s:3:"103";s:4:"mva1";s:14:"1003,1008,1010";}}}i:5;a:2:{s:8:"sphinxql";s:92:"update dist1 set mva1=(3,2, 1, 2), mva1=(9, 10), section=113 where match ('testt') and id>=2";s:14:"total_affected";i:1;}i:6;a:3:{s:8:"sphinxql";s:19:"select * from dist1";s:10:"total_rows";i:3;s:4:"rows";a:3:{i:0;a:4:{s:2:"id";s:1:"1";s:6:"weight";s:1:"1";s:7:"section";s:3:"101";s:4:"mva1";s:4:"1001";}i:1;a:4:{s:2:"id";s:1:"2";s:6:"weight";s:1:"1";s:7:"section";s:3:"113";s:4:"mva1";s:4:"9,10";}i:2;a:4:{s:2:"id";s:1:"3";s:6:"weight";s:1:"1";s:7:"section";s:3:"103";s:4:"mva1";s:14:"1003,1008,1010";}}}i:7;a:2:{s:8:"sphinxql";s:93:"update dist2 set mva1=(3,2, 1, 2), mva1=(11, 12), section=114 where match ('testt') and id>=2";s:14:"total_affected";i:1;}i:8;a:3:{s:8:"sphinxql";s:19:"select * from dist2";s:10:"total_rows";i:3;s:4:"rows";a:3:{i:0;a:4:{s:2:"id";s:1:"1";s:6:"weight";s:1:"1";s:7:"section";s:3:"101";s:4:"mva1";s:4:"1001";}i:1;a:4:{s:2:"id";s:1:"2";s:6:"weight";s:1:"1";s:7:"section";s:3:"114";s:4:"mva1";s:5:"11,12";}i:2;a:4:{s:2:"id";s:1:"3";s:6:"weight";s:1:"1";s:7:"section";s:3:"103";s:4:"mva1";s:14:"1003,1008,1010";}}}i:9;a:3:{s:8:"sphinxql";s:97:"update dist3 set mva1=(3,2, 1, 2), mva1=(13, 14), section=115 where gid match ('testt') and id>=2";s:5:"error";s:112:"sphinxql: syntax error, unexpected MATCH, expecting BETWEEN (or 8 other tokens) near 'match ('testt') and id>=2'";s:5:"errno";i:1064;}i:10;a:3:{s:8:"sphinxql";s:19:"select * from dist3";s:10:"total_rows";i:3;s:4:"rows";a:3:{i:0;a:4:{s:2:"id";s:1:"1";s:6:"weight";s:1:"1";s:7:"section";s:3:"101";s:4:"mva1";s:4:"1001";}i:1;a:4:{s:2:"id";s:1:"2";s:6:"weight";s:1:"1";s:7:"section";s:3:"114";s:4:"mva1";s:5:"11,12";}i:2;a:4:{s:2:"id";s:1:"3";s:6:"weight";s:1:"1";s:7:"section";s:3:"103";s:4:"mva1";s:14:"1003,1008,1010";}}}i:11;a:2:{s:8:"sphinxql";s:93:"update dist4 set mva1=(3,2, 1, 2), mva1=(15, 16), section=116 where match ('testt') and id>=2";s:14:"total_affected";i:1;}i:12;a:3:{s:8:"sphinxql";s:19:"select * from dist4";s:10:"total_rows";i:3;s:4:"rows";a:3:{i:0;a:4:{s:2:"id";s:1:"1";s:6:"weight";s:1:"1";s:7:"section";s:3:"101";s:4:"mva1";s:4:"1001";}i:1;a:4:{s:2:"id";s:1:"2";s:6:"weight";s:1:"1";s:7:"section";s:3:"116";s:4:"mva1";s:5:"15,16";}i:2;a:4:{s:2:"id";s:1:"3";s:6:"weight";s:1:"1";s:7:"section";s:3:"103";s:4:"mva1";s:14:"1003,1008,1010";}}}i:13;a:2:{s:8:"sphinxql";s:93:"update dist5 set mva1=(3,2, 1, 2), mva1=(17, 18), section=117 where match ('testt') and id>=2";s:14:"total_affected";i:1;}i:14;a:3:{s:8:"sphinxql";s:19:"select * from dist5";s:10:"total_rows";i:3;s:4:"rows";a:3:{i:0;a:4:{s:2:"id";s:1:"1";s:6:"weight";s:1:"1";s:7:"section";s:3:"112";s:4:"mva1";s:3:"7,8";}i:1;a:4:{s:2:"id";s:1:"2";s:6:"weight";s:1:"1";s:7:"section";s:3:"117";s:4:"mva1";s:5:"17,18";}i:2;a:4:{s:2:"id";s:1:"3";s:6:"weight";s:1:"1";s:7:"section";s:3:"103";s:4:"mva1";s:14:"1003,1008,1010";}}}i:15;a:2:{s:8:"sphinxql";s:90:"update rt set mva1=(3,2, 1, 2), gid=3212, mva2=(1, 2, 3, 4, 5, 6), mva2=(3,4,5) where id=1";s:14:"total_affected";i:1;}i:16;a:3:{s:8:"sphinxql";s:16:"select * from rt";s:10:"total_rows";i:2;s:4:"rows";a:2:{i:0;a:5:{s:2:"id";s:1:"1";s:6:"weight";s:1:"1";s:3:"gid";s:4:"3212";s:4:"mva1";s:5:"1,2,3";s:4:"mva2";s:5:"3,4,5";}i:1;a:5:{s:2:"id";s:1:"3";s:6:"weight";s:1:"1";s:3:"gid";s:2:"33";s:4:"mva1";s:1:"3";s:4:"mva2";s:1:"3";}}}i:17;a:2:{s:8:"sphinxql";s:32:"update rt set mva1=() where id=3";s:14:"total_affected";i:1;}i:18;a:3:{s:8:"sphinxql";s:16:"select * from rt";s:10:"total_rows";i:2;s:4:"rows";a:2:{i:0;a:5:{s:2:"id";s:1:"1";s:6:"weight";s:1:"1";s:3:"gid";s:4:"3212";s:4:"mva1";s:5:"1,2,3";s:4:"mva2";s:5:"3,4,5";}i:1;a:5:{s:2:"id";s:1:"3";s:6:"weight";s:1:"1";s:3:"gid";s:2:"33";s:4:"mva1";s:0:"";s:4:"mva2";s:1:"3";}}}}} \ No newline at end of file diff -Nru sphinxsearch-0.9.9+2.0.2beta/test/test_185/test.xml sphinxsearch-2.0.4/test/test_185/test.xml --- sphinxsearch-0.9.9+2.0.2beta/test/test_185/test.xml 2011-08-26 15:09:39.000000000 +0000 +++ sphinxsearch-2.0.4/test/test_185/test.xml 2011-11-30 13:27:24.000000000 +0000 @@ -146,6 +146,8 @@ select * from dist5 update rt set mva1=(3,2, 1, 2), gid=3212, mva2=(1, 2, 3, 4, 5, 6), mva2=(3,4,5) where id=1 select * from rt +update rt set mva1=() where id=3 +select * from rt diff -Nru sphinxsearch-0.9.9+2.0.2beta/test/test_187/model.bin sphinxsearch-2.0.4/test/test_187/model.bin --- sphinxsearch-0.9.9+2.0.2beta/test/test_187/model.bin 2011-08-29 22:32:46.000000000 +0000 +++ sphinxsearch-2.0.4/test/test_187/model.bin 2012-02-22 20:30:36.000000000 +0000 @@ -1 +1 @@ -a:1:{i:0;a:13:{i:0;a:2:{s:8:"sphinxql";s:16:"SELECT * FROM rt";s:10:"total_rows";i:0;}i:1;a:3:{s:8:"sphinxql";s:18:"SELECT * FROM disk";s:10:"total_rows";i:4;s:4:"rows";a:4:{i:0;a:3:{s:2:"id";s:1:"1";s:6:"weight";s:1:"1";s:3:"gid";s:2:"11";}i:1;a:3:{s:2:"id";s:1:"2";s:6:"weight";s:1:"1";s:3:"gid";s:2:"11";}i:2;a:3:{s:2:"id";s:1:"3";s:6:"weight";s:1:"1";s:3:"gid";s:2:"11";}i:3;a:3:{s:2:"id";s:1:"4";s:6:"weight";s:1:"1";s:3:"gid";s:2:"11";}}}i:2;a:3:{s:8:"sphinxql";s:38:"SELECT * FROM disk WHERE MATCH('thee')";s:10:"total_rows";i:2;s:4:"rows";a:2:{i:0;a:3:{s:2:"id";s:1:"1";s:6:"weight";s:4:"1557";s:3:"gid";s:2:"11";}i:1;a:3:{s:2:"id";s:1:"3";s:6:"weight";s:4:"1557";s:3:"gid";s:2:"11";}}}i:3;a:3:{s:8:"sphinxql";s:39:"SELECT * FROM disk WHERE MATCH('under')";s:10:"total_rows";i:1;s:4:"rows";a:1:{i:0;a:3:{s:2:"id";s:1:"4";s:6:"weight";s:4:"1695";s:3:"gid";s:2:"11";}}}i:4;a:2:{s:8:"sphinxql";s:31:"ATTACH INDEX disk TO RTINDEX rt";s:14:"total_affected";i:0;}i:5;a:3:{s:8:"sphinxql";s:16:"SELECT * FROM rt";s:10:"total_rows";i:4;s:4:"rows";a:4:{i:0;a:3:{s:2:"id";s:1:"1";s:6:"weight";s:1:"1";s:3:"gid";s:2:"11";}i:1;a:3:{s:2:"id";s:1:"2";s:6:"weight";s:1:"1";s:3:"gid";s:2:"11";}i:2;a:3:{s:2:"id";s:1:"3";s:6:"weight";s:1:"1";s:3:"gid";s:2:"11";}i:3;a:3:{s:2:"id";s:1:"4";s:6:"weight";s:1:"1";s:3:"gid";s:2:"11";}}}i:6;a:3:{s:8:"sphinxql";s:18:"SELECT * FROM disk";s:5:"error";s:34:"no enabled local indexes to search";s:5:"errno";i:1064;}i:7;a:3:{s:8:"sphinxql";s:36:"SELECT * FROM rt WHERE MATCH('thee')";s:10:"total_rows";i:2;s:4:"rows";a:2:{i:0;a:3:{s:2:"id";s:1:"1";s:6:"weight";s:4:"1557";s:3:"gid";s:2:"11";}i:1;a:3:{s:2:"id";s:1:"3";s:6:"weight";s:4:"1557";s:3:"gid";s:2:"11";}}}i:8;a:3:{s:8:"sphinxql";s:7:"DESC rt";s:10:"total_rows";i:3;s:4:"rows";a:3:{i:0;a:2:{s:5:"Field";s:2:"id";s:4:"Type";s:7:"integer";}i:1;a:2:{s:5:"Field";s:5:"title";s:4:"Type";s:5:"field";}i:2;a:2:{s:5:"Field";s:3:"gid";s:4:"Type";s:4:"uint";}}}i:9;a:2:{s:8:"sphinxql";s:76:"INSERT INTO rt ( id, gid, title ) VALUES ( 10, 22, 'I dub thee unforgiven' )";s:14:"total_affected";i:1;}i:10;a:3:{s:8:"sphinxql";s:36:"SELECT * FROM rt WHERE MATCH('thee')";s:10:"total_rows";i:3;s:4:"rows";a:3:{i:0;a:3:{s:2:"id";s:2:"10";s:6:"weight";s:4:"1704";s:3:"gid";s:2:"22";}i:1;a:3:{s:2:"id";s:1:"1";s:6:"weight";s:4:"1557";s:3:"gid";s:2:"11";}i:2;a:3:{s:2:"id";s:1:"3";s:6:"weight";s:4:"1557";s:3:"gid";s:2:"11";}}}i:11;a:2:{s:8:"sphinxql";s:72:"INSERT INTO rt ( id, gid, title ) VALUES ( 11, 22, 'under_score_again' )";s:14:"total_affected";i:1;}i:12;a:3:{s:8:"sphinxql";s:37:"SELECT * FROM rt WHERE MATCH('under')";s:10:"total_rows";i:2;s:4:"rows";a:2:{i:0;a:3:{s:2:"id";s:2:"11";s:6:"weight";s:4:"1709";s:3:"gid";s:2:"22";}i:1;a:3:{s:2:"id";s:1:"4";s:6:"weight";s:4:"1695";s:3:"gid";s:2:"11";}}}}} \ No newline at end of file +a:1:{i:0;a:18:{i:0;a:2:{s:8:"sphinxql";s:16:"SELECT * FROM rt";s:10:"total_rows";i:0;}i:1;a:3:{s:8:"sphinxql";s:18:"SELECT * FROM disk";s:10:"total_rows";i:4;s:4:"rows";a:4:{i:0;a:3:{s:2:"id";s:1:"1";s:6:"weight";s:1:"1";s:3:"gid";s:2:"11";}i:1;a:3:{s:2:"id";s:1:"2";s:6:"weight";s:1:"1";s:3:"gid";s:2:"11";}i:2;a:3:{s:2:"id";s:1:"3";s:6:"weight";s:1:"1";s:3:"gid";s:2:"11";}i:3;a:3:{s:2:"id";s:1:"4";s:6:"weight";s:1:"1";s:3:"gid";s:2:"11";}}}i:2;a:3:{s:8:"sphinxql";s:38:"SELECT * FROM disk WHERE MATCH('thee')";s:10:"total_rows";i:2;s:4:"rows";a:2:{i:0;a:3:{s:2:"id";s:1:"1";s:6:"weight";s:4:"1557";s:3:"gid";s:2:"11";}i:1;a:3:{s:2:"id";s:1:"3";s:6:"weight";s:4:"1557";s:3:"gid";s:2:"11";}}}i:3;a:3:{s:8:"sphinxql";s:39:"SELECT * FROM disk WHERE MATCH('under')";s:10:"total_rows";i:1;s:4:"rows";a:1:{i:0;a:3:{s:2:"id";s:1:"4";s:6:"weight";s:4:"1695";s:3:"gid";s:2:"11";}}}i:4;a:2:{s:8:"sphinxql";s:31:"ATTACH INDEX disk TO RTINDEX rt";s:14:"total_affected";i:0;}i:5;a:3:{s:8:"sphinxql";s:16:"SELECT * FROM rt";s:10:"total_rows";i:4;s:4:"rows";a:4:{i:0;a:3:{s:2:"id";s:1:"1";s:6:"weight";s:1:"1";s:3:"gid";s:2:"11";}i:1;a:3:{s:2:"id";s:1:"2";s:6:"weight";s:1:"1";s:3:"gid";s:2:"11";}i:2;a:3:{s:2:"id";s:1:"3";s:6:"weight";s:1:"1";s:3:"gid";s:2:"11";}i:3;a:3:{s:2:"id";s:1:"4";s:6:"weight";s:1:"1";s:3:"gid";s:2:"11";}}}i:6;a:3:{s:8:"sphinxql";s:18:"SELECT * FROM disk";s:5:"error";s:34:"no enabled local indexes to search";s:5:"errno";i:1064;}i:7;a:3:{s:8:"sphinxql";s:36:"SELECT * FROM rt WHERE MATCH('thee')";s:10:"total_rows";i:2;s:4:"rows";a:2:{i:0;a:3:{s:2:"id";s:1:"1";s:6:"weight";s:4:"1557";s:3:"gid";s:2:"11";}i:1;a:3:{s:2:"id";s:1:"3";s:6:"weight";s:4:"1557";s:3:"gid";s:2:"11";}}}i:8;a:3:{s:8:"sphinxql";s:7:"DESC rt";s:10:"total_rows";i:3;s:4:"rows";a:3:{i:0;a:2:{s:5:"Field";s:2:"id";s:4:"Type";s:7:"integer";}i:1;a:2:{s:5:"Field";s:5:"title";s:4:"Type";s:5:"field";}i:2;a:2:{s:5:"Field";s:3:"gid";s:4:"Type";s:4:"uint";}}}i:9;a:2:{s:8:"sphinxql";s:76:"INSERT INTO rt ( id, gid, title ) VALUES ( 10, 22, 'I dub thee unforgiven' )";s:14:"total_affected";i:1;}i:10;a:3:{s:8:"sphinxql";s:36:"SELECT * FROM rt WHERE MATCH('thee')";s:10:"total_rows";i:3;s:4:"rows";a:3:{i:0;a:3:{s:2:"id";s:2:"10";s:6:"weight";s:4:"1704";s:3:"gid";s:2:"22";}i:1;a:3:{s:2:"id";s:1:"1";s:6:"weight";s:4:"1557";s:3:"gid";s:2:"11";}i:2;a:3:{s:2:"id";s:1:"3";s:6:"weight";s:4:"1557";s:3:"gid";s:2:"11";}}}i:11;a:2:{s:8:"sphinxql";s:72:"INSERT INTO rt ( id, gid, title ) VALUES ( 11, 22, 'under_score_again' )";s:14:"total_affected";i:1;}i:12;a:3:{s:8:"sphinxql";s:37:"SELECT * FROM rt WHERE MATCH('under')";s:10:"total_rows";i:2;s:4:"rows";a:2:{i:0;a:3:{s:2:"id";s:2:"11";s:6:"weight";s:4:"1709";s:3:"gid";s:2:"22";}i:1;a:3:{s:2:"id";s:1:"4";s:6:"weight";s:4:"1695";s:3:"gid";s:2:"11";}}}i:13;a:2:{s:8:"sphinxql";s:22:"SELECT * FROM rt_arena";s:10:"total_rows";i:0;}i:14;a:2:{s:8:"sphinxql";s:38:"ATTACH INDEX plain TO RTINDEX rt_arena";s:14:"total_affected";i:0;}i:15;a:3:{s:8:"sphinxql";s:52:"SELECT * FROM rt_arena where mva1=15 order by id asc";s:10:"total_rows";i:4;s:4:"rows";a:4:{i:0;a:5:{s:2:"id";s:1:"1";s:6:"weight";s:1:"1";s:3:"gid";s:2:"11";s:4:"str1";s:9:"dummy for";s:4:"mva1";s:8:"15,20,55";}i:1;a:5:{s:2:"id";s:1:"2";s:6:"weight";s:1:"1";s:3:"gid";s:2:"11";s:4:"str1";s:9:"dummy for";s:4:"mva1";s:8:"15,20,55";}i:2;a:5:{s:2:"id";s:1:"3";s:6:"weight";s:1:"1";s:3:"gid";s:2:"11";s:4:"str1";s:9:"dummy for";s:4:"mva1";s:8:"15,20,55";}i:3;a:5:{s:2:"id";s:1:"4";s:6:"weight";s:1:"1";s:3:"gid";s:2:"11";s:4:"str1";s:9:"dummy for";s:4:"mva1";s:8:"15,20,55";}}}i:16;a:3:{s:8:"sphinxql";s:53:"SELECT * FROM rt_arena where mva1=55 order by id desc";s:10:"total_rows";i:4;s:4:"rows";a:4:{i:0;a:5:{s:2:"id";s:1:"4";s:6:"weight";s:1:"1";s:3:"gid";s:2:"11";s:4:"str1";s:9:"dummy for";s:4:"mva1";s:8:"15,20,55";}i:1;a:5:{s:2:"id";s:1:"3";s:6:"weight";s:1:"1";s:3:"gid";s:2:"11";s:4:"str1";s:9:"dummy for";s:4:"mva1";s:8:"15,20,55";}i:2;a:5:{s:2:"id";s:1:"2";s:6:"weight";s:1:"1";s:3:"gid";s:2:"11";s:4:"str1";s:9:"dummy for";s:4:"mva1";s:8:"15,20,55";}i:3;a:5:{s:2:"id";s:1:"1";s:6:"weight";s:1:"1";s:3:"gid";s:2:"11";s:4:"str1";s:9:"dummy for";s:4:"mva1";s:8:"15,20,55";}}}i:17;a:3:{s:8:"sphinxql";s:22:"SELECT * FROM rt_arena";s:10:"total_rows";i:4;s:4:"rows";a:4:{i:0;a:5:{s:2:"id";s:1:"1";s:6:"weight";s:1:"1";s:3:"gid";s:2:"11";s:4:"str1";s:9:"dummy for";s:4:"mva1";s:8:"15,20,55";}i:1;a:5:{s:2:"id";s:1:"2";s:6:"weight";s:1:"1";s:3:"gid";s:2:"11";s:4:"str1";s:9:"dummy for";s:4:"mva1";s:8:"15,20,55";}i:2;a:5:{s:2:"id";s:1:"3";s:6:"weight";s:1:"1";s:3:"gid";s:2:"11";s:4:"str1";s:9:"dummy for";s:4:"mva1";s:8:"15,20,55";}i:3;a:5:{s:2:"id";s:1:"4";s:6:"weight";s:1:"1";s:3:"gid";s:2:"11";s:4:"str1";s:9:"dummy for";s:4:"mva1";s:8:"15,20,55";}}}}} \ No newline at end of file diff -Nru sphinxsearch-0.9.9+2.0.2beta/test/test_187/test.xml sphinxsearch-2.0.4/test/test_187/test.xml --- sphinxsearch-0.9.9+2.0.2beta/test/test_187/test.xml 2011-08-30 01:22:29.000000000 +0000 +++ sphinxsearch-2.0.4/test/test_187/test.xml 2012-02-22 20:30:36.000000000 +0000 @@ -44,6 +44,37 @@ rt_field = content charset_table = a..z, A..Z->a..z, _ } + +source src_plain +{ + type = mysql + + sql_query = select id, title, 'dummy for' as str1, '55, 15, 20' as mva1, gid from test_table + sql_attr_string = str1 + sql_attr_multi = uint mva1 from field + sql_attr_uint = gid +} + +index plain +{ + source = src_plain + path = /plain + charset_type = utf-8 +} + +index rt_arena +{ + type = rt + path = data/rt_arena + + rt_field = title + rt_attr_string = str1 + rt_attr_multi = mva1 + rt_attr_uint = gid + + charset_type = utf-8 +} + @@ -76,6 +107,11 @@ SELECT * FROM rt WHERE MATCH('thee') INSERT INTO rt ( id, gid, title ) VALUES ( 11, 22, 'under_score_again' ) SELECT * FROM rt WHERE MATCH('under') +SELECT * FROM rt_arena +ATTACH INDEX plain TO RTINDEX rt_arena +SELECT * FROM rt_arena where mva1=15 order by id asc +SELECT * FROM rt_arena where mva1=55 order by id desc +SELECT * FROM rt_arena diff -Nru sphinxsearch-0.9.9+2.0.2beta/test/test_189/model.bin sphinxsearch-2.0.4/test/test_189/model.bin --- sphinxsearch-0.9.9+2.0.2beta/test/test_189/model.bin 1970-01-01 00:00:00.000000000 +0000 +++ sphinxsearch-2.0.4/test/test_189/model.bin 2012-01-11 14:54:24.000000000 +0000 @@ -0,0 +1 @@ +a:1:{i:0;a:5:{i:0;a:3:{s:8:"sphinxql";s:18:"select * from dist";s:10:"total_rows";i:9;s:4:"rows";a:9:{i:0;a:3:{s:2:"id";s:1:"1";s:3:"idd";s:1:"1";s:5:"agent";s:1:"1";}i:1;a:3:{s:2:"id";s:1:"2";s:3:"idd";s:2:"10";s:5:"agent";s:1:"1";}i:2;a:3:{s:2:"id";s:1:"3";s:3:"idd";s:1:"2";s:5:"agent";s:1:"1";}i:3;a:3:{s:2:"id";s:1:"4";s:3:"idd";s:2:"11";s:5:"agent";s:1:"1";}i:4;a:3:{s:2:"id";s:1:"5";s:3:"idd";s:1:"3";s:5:"agent";s:1:"2";}i:5;a:3:{s:2:"id";s:1:"6";s:3:"idd";s:2:"12";s:5:"agent";s:1:"2";}i:6;a:3:{s:2:"id";s:1:"7";s:3:"idd";s:1:"4";s:5:"agent";s:1:"2";}i:7;a:3:{s:2:"id";s:1:"8";s:3:"idd";s:1:"5";s:5:"agent";s:1:"2";}i:8;a:3:{s:2:"id";s:1:"9";s:3:"idd";s:2:"13";s:5:"agent";s:1:"2";}}}i:1;a:3:{s:8:"sphinxql";s:40:"select idd, agent from dist group by idd";s:10:"total_rows";i:9;s:4:"rows";a:9:{i:0;a:2:{s:3:"idd";s:1:"1";s:5:"agent";s:1:"1";}i:1;a:2:{s:3:"idd";s:2:"10";s:5:"agent";s:1:"1";}i:2;a:2:{s:3:"idd";s:1:"2";s:5:"agent";s:1:"1";}i:3;a:2:{s:3:"idd";s:2:"11";s:5:"agent";s:1:"1";}i:4;a:2:{s:3:"idd";s:1:"3";s:5:"agent";s:1:"1";}i:5;a:2:{s:3:"idd";s:2:"12";s:5:"agent";s:1:"2";}i:6;a:2:{s:3:"idd";s:1:"4";s:5:"agent";s:1:"2";}i:7;a:2:{s:3:"idd";s:1:"5";s:5:"agent";s:1:"2";}i:8;a:2:{s:3:"idd";s:2:"13";s:5:"agent";s:1:"2";}}}i:2;a:3:{s:8:"sphinxql";s:43:"select *, idd, agent from dist group by idd";s:10:"total_rows";i:9;s:4:"rows";a:9:{i:0;a:3:{s:2:"id";s:1:"1";s:3:"idd";s:1:"1";s:5:"agent";s:1:"1";}i:1;a:3:{s:2:"id";s:1:"2";s:3:"idd";s:2:"10";s:5:"agent";s:1:"1";}i:2;a:3:{s:2:"id";s:1:"3";s:3:"idd";s:1:"2";s:5:"agent";s:1:"1";}i:3;a:3:{s:2:"id";s:1:"4";s:3:"idd";s:2:"11";s:5:"agent";s:1:"1";}i:4;a:3:{s:2:"id";s:1:"5";s:3:"idd";s:1:"3";s:5:"agent";s:1:"1";}i:5;a:3:{s:2:"id";s:1:"6";s:3:"idd";s:2:"12";s:5:"agent";s:1:"2";}i:6;a:3:{s:2:"id";s:1:"7";s:3:"idd";s:1:"4";s:5:"agent";s:1:"2";}i:7;a:3:{s:2:"id";s:1:"8";s:3:"idd";s:1:"5";s:5:"agent";s:1:"2";}i:8;a:3:{s:2:"id";s:1:"9";s:3:"idd";s:2:"13";s:5:"agent";s:1:"2";}}}i:3;a:3:{s:8:"sphinxql";s:48:"select idd, @count, agent from dist group by idd";s:10:"total_rows";i:9;s:4:"rows";a:9:{i:0;a:3:{s:3:"idd";s:1:"1";s:6:"@count";s:1:"1";s:5:"agent";s:1:"1";}i:1;a:3:{s:3:"idd";s:2:"10";s:6:"@count";s:1:"1";s:5:"agent";s:1:"1";}i:2;a:3:{s:3:"idd";s:1:"2";s:6:"@count";s:1:"1";s:5:"agent";s:1:"1";}i:3;a:3:{s:3:"idd";s:2:"11";s:6:"@count";s:1:"1";s:5:"agent";s:1:"1";}i:4;a:3:{s:3:"idd";s:1:"3";s:6:"@count";s:1:"2";s:5:"agent";s:1:"1";}i:5;a:3:{s:3:"idd";s:2:"12";s:6:"@count";s:1:"1";s:5:"agent";s:1:"2";}i:6;a:3:{s:3:"idd";s:1:"4";s:6:"@count";s:1:"1";s:5:"agent";s:1:"2";}i:7;a:3:{s:3:"idd";s:1:"5";s:6:"@count";s:1:"1";s:5:"agent";s:1:"2";}i:8;a:3:{s:3:"idd";s:2:"13";s:6:"@count";s:1:"1";s:5:"agent";s:1:"2";}}}i:4;a:3:{s:8:"sphinxql";s:50:"select idd, count(*), agent from dist group by idd";s:10:"total_rows";i:9;s:4:"rows";a:9:{i:0;a:3:{s:3:"idd";s:1:"1";s:8:"count(*)";s:1:"1";s:5:"agent";s:1:"1";}i:1;a:3:{s:3:"idd";s:2:"10";s:8:"count(*)";s:1:"1";s:5:"agent";s:1:"1";}i:2;a:3:{s:3:"idd";s:1:"2";s:8:"count(*)";s:1:"1";s:5:"agent";s:1:"1";}i:3;a:3:{s:3:"idd";s:2:"11";s:8:"count(*)";s:1:"1";s:5:"agent";s:1:"1";}i:4;a:3:{s:3:"idd";s:1:"3";s:8:"count(*)";s:1:"2";s:5:"agent";s:1:"1";}i:5;a:3:{s:3:"idd";s:2:"12";s:8:"count(*)";s:1:"1";s:5:"agent";s:1:"2";}i:6;a:3:{s:3:"idd";s:1:"4";s:8:"count(*)";s:1:"1";s:5:"agent";s:1:"2";}i:7;a:3:{s:3:"idd";s:1:"5";s:8:"count(*)";s:1:"1";s:5:"agent";s:1:"2";}i:8;a:3:{s:3:"idd";s:2:"13";s:8:"count(*)";s:1:"1";s:5:"agent";s:1:"2";}}}}} \ No newline at end of file diff -Nru sphinxsearch-0.9.9+2.0.2beta/test/test_189/test.xml sphinxsearch-2.0.4/test/test_189/test.xml --- sphinxsearch-0.9.9+2.0.2beta/test/test_189/test.xml 1970-01-01 00:00:00.000000000 +0000 +++ sphinxsearch-2.0.4/test/test_189/test.xml 2012-01-11 14:54:24.000000000 +0000 @@ -0,0 +1,110 @@ + + + +master vs agent compat mode + +3 + + +searchd +{ + + compat_sphinxql_magics = 0 + + + compat_sphinxql_magics = 1 + + + compat_sphinxql_magics = 1 + + + + workers = threads +} + + +index dist +{ + type = distributed + agent = :loc1 + agent = :loc2 +} + + + +source src_a1 +{ + type = mysql + + + sql_query = SELECT id, idd, 1 as agent, body FROM test_table where id in ( 1,2,3,4,5 ) + sql_attr_uint = agent + sql_attr_uint = idd +} + +index loc1 +{ + source = src_a1 + docinfo = extern + charset_type = utf-8 + path = /a1 +} + + + +source src_a2 +{ + type = mysql + + + sql_query = SELECT id, idd, 2 as agent, body FROM test_table where id in ( 5,6,7, 8, 9 ) + sql_attr_uint = agent + sql_attr_uint = idd +} + +index loc2 +{ + source = src_a2 + docinfo = extern + charset_type = utf-8 + path = /a2 +} + + + + + +CREATE TABLE `test_table` +( + `id` int(11) NOT NULL default '0', + `idd` int(11) NOT NULL default '0', + `body` varchar(1024) NOT NULL default '' +) + + + +DROP TABLE IF EXISTS `test_table` + + + +INSERT INTO `test_table` VALUES +( 1, 1, 'the dog' ), +( 2, 10, 'the cat' ), +( 3, 2, 'the bird' ), +( 4, 11, 'cat eats bird' ), +( 5, 3, 'dog eats cat' ), +( 6, 12, 'bird' ), +( 7, 4, 'the cat' ), +( 8, 5, 'eats' ), +( 9, 13, 'the' ) + + + +select * from dist +select idd, agent from dist group by idd +select *, idd, agent from dist group by idd +select idd, @count, agent from dist group by idd +select idd, count(*), agent from dist group by idd + + + diff -Nru sphinxsearch-0.9.9+2.0.2beta/win/searchd05.vcproj sphinxsearch-2.0.4/win/searchd05.vcproj --- sphinxsearch-0.9.9+2.0.2beta/win/searchd05.vcproj 2011-06-25 20:56:05.000000000 +0000 +++ sphinxsearch-2.0.4/win/searchd05.vcproj 2012-02-28 15:39:55.000000000 +0000 @@ -70,6 +70,7 @@ GenerateDebugInformation="true" ProgramDatabaseFile="$(OutDir)/searchd.pdb" SubSystem="1" + LargeAddressAware="2" TargetMachine="1" />