diff --git a/src/http_front/sphinx_search.erl b/src/http_front/sphinx_search.erl index 1062234..5949045 100644 --- a/src/http_front/sphinx_search.erl +++ b/src/http_front/sphinx_search.erl @@ -8,6 +8,7 @@ -export([search/4, search_hash/3, highlight_title/2, highlight_files/2]). -define(PORT, 9312). -define(INDEX, "xml"). +-compile(export_all). search(Conn, Key, Offset, Count) -> Rets = search_hash(Key, Offset, Count), @@ -61,7 +62,7 @@ highlight_title(Key, Name) when is_list(Name) -> highlight_files(Key, Files) when is_list(Files) -> {Names, Lens} = lists:unzip(Files), BNames = [list_to_binary(Name) || Name <- Names], - case catch build_file_excerpts(list_to_binary(Key), BNames, 800) of + case catch build_file_excerpts(list_to_binary(?INDEX), list_to_binary(Key), BNames, 800) of {'EXIT', Reason} -> ?E(?FMT("highlight_files ~p", [Reason])), Files; @@ -77,12 +78,23 @@ highlight_files(Key, Files) when is_list(Files) -> L1 ++ L2 end. -% too many files in one batch will cause error -build_file_excerpts(BKey, BNames, Batch) -> - BIndex = list_to_binary(?INDEX), - Cnt = length(BNames) div Batch + 1, - SubNamesList = [lists:sublist(BNames, 1 + I * Batch, Batch) || - I <- lists:seq(0, Cnt - 1)], - lists:flatten([sphinx_excerpt:build_excerpt(BKey, BName, BIndex) || - BName <- SubNamesList]). - +build_file_excerpts(_BIndex, _BKey, [], _Batch)-> + []; +build_file_excerpts(BIndex, BKey, BNames, Batch) when length(BNames) < Batch -> + sphinx_excerpt:build_excerpt(BKey, BNames, BIndex); +build_file_excerpts(BIndex, BKey, BNames, Batch)-> + {SubNames, Rest} = lists:split(Batch, BNames), + Rets = sphinx_excerpt:build_excerpt(BKey, SubNames, BIndex), + Rets ++ case got_excerpt(Rets) of + true -> + [<<>> || _ <- Rest]; + false -> + build_file_excerpts(BIndex, BKey, Rest, Batch) + end. + +got_excerpt([]) -> + false; +got_excerpt([S|_]) when byte_size(S) > 0 -> + true; +got_excerpt([_S|R]) -> + got_excerpt(R).