萬盛學電腦網

 萬盛學電腦網 >> 服務器教程 >> sphinx無法啟動的解決

sphinx無法啟動的解決

   sphinx無法啟動的解決

  索引或者查詢時提示:ERROR: invalid token in 配置文件 line 1 col 1.:

  該提示表示當前的配置文件的編碼不是UTF-8(無BOM頭)格式,無法正確解析,請使用編輯軟件打開配置文件,另存為UTF-8(無BOM頭)格式;

  錯誤的編碼格式包括:Unicode、Unicode BOM、Unicode big endian、Unicode 低位在前、UTF-8 + BOM、UTF-8 Signature、UTF-8 包含簽名等;

  特別注意:Windows自帶的記事本(Notepad)或者寫字板(WordPad)無法正確保存為所需格式,請勿使用其編輯配置文件;

  在sphinx中處理使用特殊字符時所引起錯誤的辦法

  用sphinx搜索引擎時,有時會遇到一些特殊字符,這些特殊字符可能會是sphinx致命性錯誤來源:

  如 “$”、“^”,在sphinx搜索關鍵字的最前或最尾出現這樣的字符時(單獨使用也一樣),就會導致sphinx致命的錯誤。例如用“$筆記本”或“筆記本^”作為關鍵字搜索時,就會引起類似'Query failed: index product: syntax error, unexpected '"'。

  在搜索關鍵字的前面和後面自動加上半角的空格符“ ”可以解決此問題,且不會影響搜索結果。

  ERROR: index ‘product’: raw_hits: write error: 122070 of 262017 bytes written

  A:此類問題是索引寫入磁盤錯誤導致,有多個原因。注意查看磁盤空間是否已滿。另外,還可能是因為是否有多個indexer進程在進行,寫入索引失敗!還有個解決方法是:減少 indexer配置中 max_iosize的大小。max_iosize是sphinx最大允許的I/O操作大小,以字節為單位,用於I/O節流。比如可以設置為 524288(512KB)

  1、增量索引,注意刪除的問題 2、對大數據,一定要給sphinx數據目錄留出大量空間,因為臨時文件會占據非常大的空間

  Q、編譯安裝時出現這個問題….sphinx.cpp; then mv -f “.deps/sphinx.Tpo” “.deps/sphinx.Po”; else rm -f “.deps/sphinx.Tpo”; exit 1; fi In file included from sphinx.cpp:14:sphinx.h:54:19: error: mysql.h: No such file or directory….

  A:缺少libmysqlclient15.so,安裝mysql-devel.如果已經存在。請使用ldconfig加載一下這個動態鏈接庫(linux)

  Q: sphinx在rotate時出現以下問題。(searchd.log) WARNING: rotating index ‘sphinx’: prealloc: mmap() failed: Cannot allocate memory (length=431854320); using old index,同時,在索引數據目錄中會出現sphinx.spl sphinx.new.spl的情況,導致原來的索引不能正確的檢索到

  sphinx indexer有2個進程同時在運行,sphinx 的indexer不能同時使用,導致無法分配內存。並使indexer使用舊的索引文件

  先了解一下sphinx的 –rotate機制:

  indexer完成索引->發送SIGHUP 給searchd(同時在終端輸出索引已經完成)->searchd接到中斷信號->等待所有子進程退出->重命名 當前索引為舊索引為 .old

  ->重命名 .new 索引文件作為當前索引->嘗試加載當前索引文件->如果加載失敗,searchd會把.old文件回滾為當前文件,並把剛建立的新索引重命名 為 .new ->加載成的話:完成無縫銜接

  執行 rotate開關情況下,indexer在完成索引後會首先會發送一個中斷信號給searchd(並且會輸出已經索引完成)。

  接著 searchd會做以下事情:

  1)等待所有子進程退出

  2)重命名 當前索引為舊索引為 .old

  3)重命名 .new 索引文件作為當前索引

  4)嘗試加載當前索引文件

  5)如果加載失敗,searchd會把.old文件回滾為當前文件,並把剛建立的新索引重命名為 .new

  鑒於以上情況,很可能是開啟了2個檢測目錄訪問權限的進程。用戶同時使用2個indexer且 searchd運行其下 等等

  sphinx的searchd在啟動時會創建一個 .spl 鎖文件,並在關閉時會刪除它。在indexer創建索引時如果發現有 .spl文件,則不會創建新索引,除非使用 –rotate

  所以,出現這樣的問題可能是 鎖文件不知咋的就丟失啦,或者重建索引時沒有使用 –rotate開關

  原文:

  http://www.sphinxsearch.com/forum/view.html?id=274

  It seems that

  a) the lock files were lost somehow, and

  b) you ran indexer without –rotate switch.

  Normally, searchd would create .spl lock files on startup (and kill them on shutdown),

  and indexer would then refuse to reindex without –rotate switch.

  indexers sends SIGHUP to searchd when completed (and it should print that out). searchd

  then does the following:

  1) waits for all children to exit

  2) renames current index files to .old

  3) renames .new index files to current

  4) tries to load current index files

  5) if something failed, it rollbacks current files from .old and new to .new

  In your case I would start with double checking directory access rights, users which both

  indexer and searchd run under, etc.

  具體操作:

  killall searchd 然後重啟。重啟後會自動加載重命名 sphinx.new.sp*為 sphinx.sp*

  另外,出現這樣的問題時,最好注意 –rotate的使用,在應用許可 的情況下,不妨直接采用 關閉searchd 再索引,然後再開啟 searchd

  Q:關於updateAttribute更新索引的問題

  sphinx使用api不能馬上真正的更新索引,但更新後api能顯示索引已經是更新了。不過使用cli端的search就不能搜索到。只有在searchd重啟後才會寫入磁盤文件中。切記!

  Q、sphinx安裝make時,碰到libiconv的問題。

  查了半天,改Makefile,configure都不可靠。最後在官站上查到:

  ./configure –without-iconv,就好了。NND,那干嘛還要這個iconv嘛。

  看出錯代碼裡,是在xmlunknowencode時才用到。我們都用utf-8,很多時候可能壓根用不著這個功能!如若需要的話,可以加上這個lib

  Q、檢索出來後結果id排序問題

  SELECT * FROM documents WHERE id IN (3,5,7) ORDER BY FIELD(id,3,5,7);

  或

  SELECT * FROM documents WHERE id IN (3,5,7) ORDER BY substring_index((id,3,5,7),id,1)

  Q、WARNING: sort_hits: merge_block_size=248 kb too low, increasing mem_limit may improve performance

  A、增大mem_limit的值

  Q:sphinx排序問題

  $sphinx->SetSortMode(SPH_SORT_EXTENDED,’status DESC,is_deleted DESC’); //組內排序 setGroupBy排序的話,分成組間排序和組內排序,比如:(317,1,hello),(317,0,world)。如果組內排序的話,需先使用SetSortMode(),進行自然排序,然後 使用group排序,這樣在組間排序和組內排序都成自然狀態了!

  Q、WARNING: maxed out, dismissing client

  這是sphinx 客戶端找不到searchd守護進程。具體可能是索引的鎖文件了 (***.spl)丟失, 這個文件通常是用來標識searchd是否開啟。

  通常客戶端也會返回“zero-sized searchd response”。 解決辦法: 重啟searchd即可 作者的話: It seems that a) the lock files were lost somehow, and b) you ran indexer without --rotate switch. http://www.sphinxsearch.com/forum/view.html?id=247

  Q、CentOS5.4 安裝coreseek-3.2.13的mmseg 時,./configure 出現錯誤:config.status: error: cannot find input file: src/Makefile.in

  coreseek安裝需要預裝的軟件:# yum install gcc gcc-c++ libtool autoconf automake imake mysql-devel libxml2-devel expat-devel#aclocal#libtoolize --force#automake --add-missing#autoconf#autoheader

  重新configure即可!原文請參考:http://www.coreseek.cn/news/6/100/

  Q:coreseek 在安裝 make 時候出現 undefined reference to `libiconv’

  A:編輯:

  ./src/MakeFile文件

  將

  LIBS = -lm -lexpat -L/usr/local/lib

  改成

  LIBS = -lm -lexpat -liconv -L/usr/local/lib

  Q:在分布式搜索中api調用出現 search Error: unknown local index ‘allindex’ in search request

  具體配置是index allindex

  {

  type = distributed

  local =usertest1stemmed

  local =testidx

  agent = localhost:3306:agentdata1,agentdata2

  agent_connect_timeout = 1000

  agent_query_timeout = 3000

  }

  A:這裡是sphinx在解析localhost的時候不能正確指向127.0.0.1 ,所以更改一下配置中的localhost即可。即:

  agent = 127.0.0.1:3306:agentdata1,agentdata2

copyright © 萬盛學電腦網 all rights reserved