在学说实体中实施易于使用的搜索引擎。
为了基本用途,您要做的就是定义搜索实体及其属性的地图,搜索引擎将安排正确加载它们,并根据所找到的候选者自动对搜索结果进行分类。
包装的目的是为学说实体中的高级全文搜索提供简单的API。在请求开始时,建立了搜索方案,该软件包自动确保根据相关性找到并返回最佳结果。
手动安装软件包调用作曲家并执行以下命令:
$ composer require baraja-core/doctrine-fulltext-search然后在配置霓虹灯中注册DoctrineFulltextSearchExtension :
extensions :
doctrineFulltextSearch : BarajaSearchDoctrineFulltextSearchExtension或者,您可以手动创建BarajaSearchSearch的实例。
搜索是通过构建查询(映射实体和列)来执行的:
$ results = $ this -> search -> search ( $ query , [
Article ::class => [ ' :title ' ],
User ::class => ' :username ' , // it can also be an ordinary string for a single column
UserLogin ::class => [ ' :ip ' , ' hostname ' , ' userAgent ' ],
]);
echo $ results ; // Uses the default HTML renderer或者,您可以使用具有完整类型验证和提示方法的SelectorBuilder来构建查询:
$ results = $ this -> search -> selectorBuilder ( $ query )
-> addEntity ( Article ::class)
-> addColumnTitle ( ' title ' )
-> addEntity ( User ::class)
-> addColumnTitle ( ' username ' )
-> addEntity ( UserLogin ::class)
-> addColumnTitle ( ' ip ' )
-> addColumn ( ' hostname ' )
-> addColumnSearchOnly ( ' userAgent ' )
-> search ();
echo $ results ;无需逃脱输出,所有逻辑都是由引擎自动解决的。
:username - 该列将用作标题
!slug该列将用于搜索,但在Perex输出中被忽略。
_durationTime该列将加载到实体中,但在计算相关性时不会考虑,并且不会包含在perex中。
content.versions.haystack实体之间的关系会自动创建一个联接并加载最后一个属性。
versions(content) - 自定义getter(自动加入versions列,但请致电getContent()获取数据)。
如果我们在列名的开头(例如':username' )使用结肠,则将自动用作标题。
即使不包含搜索词,标题也将显示。
标题可能是空的,可能不存在(可能为null )。
如果标题不存在,则引擎可以根据发现的文本中的最佳出现自动对其进行计算。
搜索查询将自动归一化并删除停止词,为此搜索没有意义。
通过实现IQueryNormalizer界面并将其覆盖DIC容器中的算法可以在特定项目中覆盖该算法。
search()方法的输出是SearchResult类型的实体,它实现了Iterator界面的实现,以便容易循环循环结果。
提示:如果您只需要快速打印搜索结果并且外观要求不是很高,则
SearchResult实体直接实现__toString()方法,以简化结果直接作为HTML。
搜索结果总结了所有实体中所有搜索的所有结果。所有结果均通过getItems()方法获得 - 输出将是SearchItem[]类型实体的数组。
但是,我们通常需要批量编译查询,然后单独列表,例如类别和产品。为此,请使用助手方法getItemsOfType(string $type) ,该horter返回type SearchItem[]的截断阵列[]仅根据传递的参数来返回实体。
我们使用getItems()或getItemsOfType()方法来获取我们经历的搜索结果。但是如何处理特定结果呢?
重要的是要注意,在这一点上,我们不再拥有可用的__toString()方法,并且必须自己渲染结果(理想情况下是模板中)。
对于大多数情况,现成的助手就足够了:
getTitle()将发现实体的标题返回为字符串或null。getTitleHighlighted()呼叫内部呼叫getTitle() ,如果结果是有效的字符串,则用<i class="highlight">和</i>染色每个单词的出现。getSnippet()返回找到的实体的摘要,该片段总结了原始实体中最佳的区域(例如,在发生搜索单词的地方片段)。可以返回更多的片段(单个出现由结肠划分)。始终返回字符串(可以为空)。getTitleHighlighted()内部调用getSnippet() ,并用<i class="highlight">和</i>为每个单词的出现着色。getScore()返回相对(根据搜索查询和每个项目中的可用数据在上下文上不同)结果评估(根据此参数,结果将自动排序)。getEntity()返回原则在内部产生的原始发现的实体。搜索是使用部分选择执行的,因此并非所有属性都可以始终可用。entityToArray()作为数组返回自己。字符串自动归一化。 这两种方法都获得结果( getItems()和getItemsOfType() )接受参数$limit (默认为10 )和$offset (默认为0 )。
最好使用Nette分页来实施分页本身。
结果总数是通过SearchResult实体上方的getCountResults()方法获得的。
搜索引擎使用PARTIAL来加载数据库实体并将结果实体包装到搜索结果中,因此您可以随时通过在特定的搜索结果上调用->getEntity()来加载它们。
如果找不到结果,或者它们的数字为“小”(根据特定项目的分析,定义由算法本身确定),则可以(并且可能无法)提供最佳校正查询的提示。
为了帮助您,请通过SearchResult来调用getDidYouMean()方法。输出是字符串(更好的搜索查询)或NULL。
最佳的搜索查询校正是通过搜索引擎本身基于每个项目中的高级搜索分析来获得的,该搜索引擎使用机器学习方法分别在每个项目中。每次搜索,有关搜索查询的统计信息,结果和其他信号的数量在必要时会自动保存和回顾性分析。
获得帮助是自然的,不能容易受到影响。搜索引擎努力提高客观性,并为用户提供搜索他人的单词,并根据当前上下文返回尽可能多的相关结果。在内部,使用了复杂的数学功能,我们会根据所有项目的经验不断改进。
搜索时,首先汇编了搜索结果的候选人列表。这些结果分别通过评估算法512 0内执行自动“相对”评估(基于诸如搜索查询,最近的用户历史记录,语言,物理位置,实体内容和类型的各种信号(结果始终是int )。
根据点评估,结果会自动分类。
可以通过实现IScoreCalculator接口并在DIC容器中覆盖评分算法。
baraja-core/doctrine-fulltext-search已获得MIT许可证的许可。有关更多详细信息,请参见许可证文件。