1

주제: 검색 키워드문제

안녕하세요...

텍스트큐브 1.7에는 기사검색창이 있습니다.
그 검색창에 "홍길동 영화"라고 입력하고 검색을 하면 기사제목과 기사본문에서 "홍길동 영화"가 들어간것만 찾아냅니다.
"홍길동"도 들어가고 "영화"도 들어간 기사는 찾지 못하죠.

나름대로 소스를 분석해보고 고쳐보았습니다.
lib\model\blog.entry.php파일이예요.

우선. 파일에 다음의 두개 함수를 추가하고요..

function GetFractionWord($text)
{
    $ret = array();

    if (strlen($text) == 0)
        return $ret;

    $start = 0;
    $cur = -1;
    $idx = 0;
    $idx1= 0;
    $idx2 = 0;

    $text = str_replace("\\\\", "\\", $text);
    $text = str_replace("\\\"", "\"", $text);
    $text = str_replace("\\'", "'", $text);

    $text = " " . $text . " ";

    while($start < strlen($text) - 1)
    {
        $idx = strpos($text, " \"", $start);

        if ($idx === false)
        {
            AddArrayStringItem($ret, substr($text, $start));
            break;
        }
        else
        {
            // pre text
            if ($idx > $start)
                AddArrayStringItem($ret, substr($text, $start, $idx - $start + 1));
           
            $start = $idx;
            $idx = strpos($text, "\" ", $start + 3);

            if ($idx === false)
            {
                AddArrayStringItem($ret, substr($text, $start));
                break;
            }
            else
            {
                $ret[] = substr($text, $start + 2, $idx - ($start + 2));
                $start = $idx + 2;
            }
        }

    }

    return $ret;
}

function AddArrayStringItem(&$arrlist, $text)
{
    $n = strpos($text, " ");

    while(!($n === false))
    {
        if ($n > 0)
            $arrlist[] = substr($text, 0, $n);
        $text = substr($text, $n+1);
       
        $n = strpos($text, " ");
    }

    if (strlen($text) > 0)
        $arrlist[] = $text;
}

다음으로. getEntryListWithPagingBySearch함수와 getEntriesWithPagingBySearch함수에 있는 SQL검색조건을 다음과 같이 변경시킵니다.
      원래소스:
             $cond = strlen($search) == 0 ? 'AND 0' : "AND (e.title LIKE '%$search%' OR e.content LIKE '%$search%')";

      수정한 소스:
    $arrSearch = GetFractionWord($search);
    if (count($arrSearch) == 0)
    {
        $cond = 'AND 0';
    }
    else
    {
        $cond = '';
        foreach ($arrSearch as $s)
        {
            $cond .= " AND (e.title LIKE '%$s%' OR e.content LIKE '%$s%')";
        }
    }

우와 같이 수정하면 검색창에
     홍길동 영화 "멋있는 사람" 싸이트
라고 입력하면
     홍길동, 영화, 멋있는 사람, 싸이트
가 들어있는 모든 기사가 검색됩니다.

공백으로 구분만 해주면 되니 정말 쓸모있겠죠.
텍스트큐브의 다음 버젼에서 갱신되기를 바라면서...

화이팅!!!

2

답글: 검색 키워드문제

얘는 쪼금 고려를 해서 반영을 해야 할 것 같습니다.^^

한국어의 특징 중 하나가 조합어가 많다는 점인데, 그러한 단어들에 대한 띄어쓰기가 항상 일정하지가 않습니다. 그래서 실질적으로는 하나의 단어로 쓰이지만 띄어쓰는 경우가 많으므로 띄어쓰기를 단어 구분으로 인식하면 검색범위가 너무 넓어지는 문제가 자주 발생하게 됩니다.

AND 등의 검색어 명령 도입을 생각해 보는 방법도 있을 것 같네요. 관심 있으신 분들께서는 이 글의 댓글들을 통해서 함께 의견을 나누어 보았으면 합니다.^^

"Everything looks different on the other side."

-Ian Malcomm, from Michael Crichton's 'The Jurassic Park'

3

답글: 검색 키워드문제

안녕하세요.

댓글에 감사드리구요.
한국어의 특징 중 하나가 조합어라고 말씀하셨는데 옳은 말씀입니다.
그래서 저도 기사에 썼듯이 검색어 입력을 다음과 같이 하였습니다.
      홍길동 영화 "멋있는 사람" 싸이트
"멋있는 사람"은 인용부호로 막아주었기때문에 그 안의 공백은 구분기호로 인식안하거든요.
인용부호안의 단어는 그냥 조합어로 찾는거죠.

구글검색싸이트에서도 다 그렇게 하잖아요.
꼭 되리라 기대하면서..
화이팅!!!