【问题标题】:Zend Search Lucene - Searching specific fieldZend Search Lucene - 搜索特定字段
【发布时间】:2012-05-03 12:52:43
【问题描述】:

我目前已将 Zend_Search_Lucene 设置为我正在从事的项目的搜索引擎。

它在默认级别上运行良好(即搜索所有字段),但是我现在需要搜索特定字段。

这样做的原因是因为我正在尝试编写能够处理拼写错误的代码。因此,我在文档标题中添加了每个单词的 soundex。

例如:

$productArray['title'] = 'June Monthly Meat Box';  
$doc = new Zend_Search_Lucene_Document();  
$doc->addField(Zend_Search_Lucene_Field::text('product_title', $productArray['title']));  
$soundex = implode(' ',  array_map('soundex', array_map('trim', preg_split('/ /', $productArray['title'], NULL, PREG_SPLIT_NO_EMPTY))));  
$doc->addField(Zend_Search_Lucene_Field::keyword('soundex', $soundex));  
$index->addDocument($doc);

这会将“J500 M534 M300 B200”添加为 soundex 字段。

这是执行搜索的方式:

$queryString = trim(urldecode($this->_request->getParam('q')));  
$words = array_map('trim', preg_split('/ /', $queryString, NULL, PREG_SPLIT_NO_EMPTY));    

$query = new Zend_Search_Lucene_Search_Query_Boolean();  
$subquery1 = new Zend_Search_Lucene_Search_Query_MultiTerm();  
foreach($words as $word) 
{  
    $subquery1->addTerm(new Zend_Search_Lucene_Index_Term($word));  
}  

$subquery2 = new Zend_Search_Lucene_Search_Query_MultiTerm();  
foreach($words as $word)
{  
        $subquery2->addTerm(new Zend_Search_Lucene_Index_Term(strtolower(soundex($word)), 'soundex'));  
}  
$query->addSubquery($subquery1);  
$query->addSubquery($subquery2);  

变量$subquery1 存储原始查询的每个单词(这可以单独使用)
变量$subquery2 存储每个单词的音译。计划是在该字段中搜索 soundex 以及每个单词的其他字段。因此,如果有人将 'meat' 拼错为 'ma​​et',它会返回结果,因为 soundex 在 'M300' 处是相同的。

我正在使用 Luke 查看数据集并看到正确的术语。当我使用 Luke 搜索 soundex(即soundex:M300)时,它不会返回任何结果,但是如果我搜索整个字段(即soundex:"J500 M534 M300 B200"),它会返回正确的文档。

阻止它在字段中搜索的问题是什么?

【问题讨论】:

    标签: php zend-framework zend-search-lucene


    【解决方案1】:

    如果我正确理解 Zend_Search_Lucene_Field::keyword(您在上面用于“soundex”的内容),它旨在一次存储一个值(如单个日期或单个 URL)。

    我认为对于“soundex”字段,您希望改为使用诸如 Zend_Search_Lucene_Field::text 之类的标记化存储方法,因为听起来您想在“soundex”字段中搜索单个标记,而不仅仅是整个字段值.

    【讨论】:

    • 嗨,马克,感谢您的信息。我最初将它作为文本字段但更改了它。更改的原因是 Luke 将 soundex 字段的排名靠前的术语显示为一个字母(例如:b、s、r 等)。因此,如果我搜索 soundex:m 确实会显示所有存在 soundex MXXX 的结果。令我感到奇怪的是,条款中没有数字。标记化字段是否忽略数字?
    • 排序后,我不得不更改默认分析器,因为我了解到它不会将数字视为术语的一部分。我在创建索引之前和搜索索引之前添加了Zend_Search_Lucene_Analysis_Analyzer::setDefault( new Zend_Search_Lucene_Analysis_Analyzer_Common_TextNum_CaseInsensitive() );
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-06
    • 1970-01-01
    • 2015-08-04
    • 1970-01-01
    • 2012-02-26
    相关资源
    最近更新 更多