当前位置: 首页 > 知识库问答 >
问题:

使用Zend Search Lucene索引和搜索特殊字符

乜烨霖
2023-03-14

当我搜索“#”等特殊字符时,没有结果出现。

请注意,我已经转义了查询字符串。

然而,当与“c#”这样的字母组合时,Lucene找到了这个词。

有没有办法搜索单个特殊字符?

这是我的片段:

Zend_Search_Lucene_Search_Query_Wildcard::setMinPrefix长度(1);

Zend_Search_Lucene_Analysis_Analyzer::setDefault(
    new \Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8Num_CaseInsensitive());            

$index = Zend_Search_Lucene::create('/tmp/index');       
$doc = new Zend_Search_Lucene_Document;
$doc->addField(Zend_Search_Lucene_Field::Text('title', 'Some Title Here', 'UTF-8'))
    ->addField(Zend_Search_Lucene_Field::Text('content-01', '+ @ #', 'UTF-8'))
    ->addField(Zend_Search_Lucene_Field::Text('content-02', 'C+ C#', 'UTF-8'));        

$index->addDocument($doc);
$index->commit();

/* returns 0 results */
$r = $index->find("/#");
echo count($r) . "\n";

/* returns 1 results */
$r = $index->find('C#');
echo count($r) . "\n";

/* returns 1 results */
$r = $index->find('C+');
echo count($r) . "\n";

共有1个答案

燕翔飞
2023-03-14

根据本页特殊字符列表如下:

+ - && || ! ( ) { } [ ] ^ " ~ * ? : \

所以你不应该逃避#。但即使不使用转义“斜杠”,仍然会得到0个结果。即使将文本字段类型更改为关键字,也无法修复此行为。

所以我开始研究它并运行这段代码:

echo('<pre>');
var_dump(Zend_Search_Lucene_Search_QueryParser::parse("#"));
echo('</pre>');
die();

它返回Zend\u Search\u Lucene\u Search\u Query\u Boolean对象,其中一个子查询为Zend\u Search\u Lucene\u Search\u Query\u Preprocessing\u Term类型。根据文件记载,有趣的是:

它是一个内部抽象类,旨在在查询解析后完成查询处理。

这种类型的查询实际上并不涉及查询执行。

所以我唯一的想法是:不要再使用默认解析器了!

所以我认为你的问题的解决方案很简单——使用查询构造应用编程html" target="_blank">接口手动创建查询:

$term  = new Zend_Search_Lucene_Index_Term("#");
$query = new Zend_Search_Lucene_Search_Query_Term($term);

/* still returns 0 results!! */
$r = $index->find($query);
echo('<pre>');
var_dump(count($r));
echo('</pre>');

但它又不起作用了!

我让它工作的唯一方法(也使用查询解析器)是添加这一行:

->addField(Zend_Search_Lucene_Field::keyword('content-03', '#'))

所以假设:特殊字符只能作为关键字搜索,因为这些字段没有标记。但是关键词被视为一个完整的短语(即使里面有短语),这是一个巨大的限制。

 类似资料:
  • 我有一个问题与搜索的特殊字符在solr。我的文档有一个字段标题,有时它可以像泰坦尼克号-1999(它有字符-)。当我试图搜索索尔与"-"我收到一个400错误。我试图逃避这个角色,所以我尝试了像“-”和“\-”这样的东西。有了这些变化,solr不会用错误来回应我,但它会返回0个结果。 如何在solr admin中搜索具有该特殊字符(如“-”或“”?)的内容??? 问候 在这里更新您可以看到我当前的s

  • 问题内容: 我无法在Elasticsearch中以特殊字符结尾/开头的字符进行搜索。就像“ 123456!” 我的映射是 它给我错误,我可以在搜索查询(或映射)中做什么,以便特殊字符将被视为搜索字符串的一部分? 问题答案: 由于您的字段是(好!),请尝试用双引号引起来进行完全匹配: 这样做的另一种方法是在查询中设置分析器(但请务必转义,因为它是保留字符(对于操作员)

  • 我刚开始使用hibernate lucene搜索。从几天以来,我一直致力于搜索关键字与特殊字符。我正在使用MultiFieldQueryParser进行精确短语匹配以及布尔搜索。但在这个过程中,我无法得到搜索关键字的结果,如“有1年以上的经验”,如果我没有在搜索关键字周围添加任何引号,那么我就得到了结果。所以我在执行lucene查询时观察到的是,它正在转义特殊符号(+)。我正在使用Standard

  • 要转义这些字符,请在字符前面使用\。例如,要搜索(1+1):2,请使用以下查询: 为此,我使用方法: 我使用经典分析器是因为我注意到标准分析器在转义特殊字符方面存在一些问题。 null

  • 是否可以通过fullTextQuery找到带有特殊字符的单词?luke的搜索很好地处理了查询,但是from fullTextQuery没有返回任何结果。 不带通配符搜索“C”,不带特殊字符。 如何解决这个问题?

  • 问题内容: 我正在支持一个Java应用程序,该应用程序具有一个与关键字匹配的搜索栏,并从缓存中获取结果。 该应用程序在Tomcat中运行,并且也具有Apache Web服务器。 搜索 aaa时 出现问题, “ 特殊字符 ” 导致了问题,我进入 禁止您无权访问/xx/xx/xxxx.jsp 由于没有Web服务器,因此可以在本地设置中进行搜索。如我所见,一些帖子暗示该问题可能是由Web服务器配置引起的