一个简单的跨数据库商店全文搜索语言,用于Java 8+
全文搜索是现代应用程序的关键功能。但是,不同的数据存储揭示了不同的语法进行全文搜索,并且其中许多语法都不易于用户友好。有些数据商店根本不会公开任何全文搜索功能!这使开发人员很难揭露一致的面向用户的搜索体验。 Litecene是一种基于Lucene语法的熟悉的标准查询语言,其转换器与BigQuery这样的流行数据商店,这使开发人员可以轻松地向用户展示一致,用户友好的搜索语法,同时充分利用其应用程序数据存储的全型TEXT搜索功能。
本节介绍了常见的Litecene查询语法。请注意,不同的转运器可以以不同的方式实施相同查询的文本搜索。本节仅描述构成有效查询的内容和匹配的逻辑定义。每个转板器实现都准确地记录了在关联数据存储中如何匹配有效查询的方式。
举例来说,这可能是一个很好的LiteCene查询,可以识别社交媒体帖子,提到人们用户使用智能手机的常见方式:
(smartphone OR "smart phone" OR iphone OR "apple phone" OR android OR "google phone" OR "windows phone" OR "phone app"~8) AND (call OR dial OR app OR surf OR browse OR camera OR picture OR pic OR selfie)
Litecene支持七个搜索条款类型:术语,短语,列表,群组以及或不。
术语子句是一个非引用的非Whitespace字符串的字符串。匹配文档必须包含给定项。以下都是有效的Litecene术语条款:
helloworldwhat's#selfie@twitterhttps://www.example.com/this/is/a/hyperlink术语条款也可以以通配符( * )结尾,以指示前缀搜索。在这种情况下,匹配文档必须包含带有前缀的术语。以下都是有效的Litecene前缀术语条款:
developer*what's*https://www.example.com/*短语子句是引用的字符串。匹配文档必须彼此相邻包含给定的术语。以下都是有效的Litecene短语条款:
"hello, world!""The rain in Spain falls mainly on the plains.""super cool search"短语子句中的术语可以以通配符( * )结尾,以指示前缀搜索。在这种情况下,匹配文档必须包含给定的术语,并彼此相邻给定前缀。以下都是具有通配符术语的有效弹烯短语条款:
"It wa* the best of times""It was the wors* of times"可以立即使用tilde( ~ )和一个整数编号,以表明近距离搜索。在这种情况下,匹配文档必须在给定数量的任何顺序中包含所有给定的常规或前缀条款。接近长度必须至少是短语中的项数。以下是有效的Litecene短语子句,具有接近性:
"hello, world!"~8"It wa* the best of times"~10列表条款是两个或更多有效的LiteCene搜索条款,这些搜索条款由Whitespace分开。匹配文档必须按任何顺序匹配给定的子句。以下都是有效的Litecene短语条款:
hello, world!The rain in Spain falls mainly on the plains.engineer* "developer* productivity"~8组条款是由括号( )包围的任何其他有效的石灰岩搜索条款。匹配文档必须匹配包含的子句。以下都是有效的Litecene组条款:
(hello world)(engineer* "developer* productivity"~10)组子句主要用于阐明包含多个和 /或条款的复杂查询。
AN和条款是有效的LiteCene搜索条款,后跟关键字AND然后是另一个LiteCene搜索条款。多个AND子句可以附加到相同和子句。匹配文档必须匹配所有给定的子句。以下都是有效的LiteCene和条款:
hello AND worldThe rain in Spain falls mainly on the plains AND "My Fair Lady"~8engineer* AND "developer productivity"~10或条款是有效的Litecene搜索条款,其后是关键字OR是另一个LiteCene搜索条款。多个OR子句可以附加到同一或子句。何时和 /或子句交错, AND操作员结合更紧。组子句可用于使查询更清晰,更易于理解。匹配文档必须匹配至少一个给定的子句。以下都是有效的Litecene或条款:
hello OR world"My Fair Lady"~8 OR Pygmalion一个非子句是NOT关键字,后跟另一个LiteCene搜索条款。匹配文档不得匹配给定的子句。以下都是有效的litcene而不是条款:
NOT helloNOT "hello, world!"NOT (engineer* AND "developer productivity"~10)某些查询后端不允许仅包含NOT的查询。
有关如何在应用程序中使用Litecene的示例,请参阅“应用程序的数据存储”。
一个新的数据存储集成有两个部分:将LiteCene Query对象转换为数据存储的本机语法的查询转板器;以及在数据存储中准备文本以进行搜索的方法。这两个组件必须共同实施正确的搜索语义。
例如,BigQuery数据存储仅搜索ASCII拉丁字母和数字。因此,必须对查询进行后处理才能适当地处理未进行搜索的字符,然后才能将其转换为SQL谓词,并且必须对数据存储中的数据进行预处理以消除非搜索字符,并且必须完成这些处理的两个字符,以使它们彼此同意。
新的数据集成后端必须实现助手来构建建议的查询分析管道和建议的数据预处理方法。
Litecene实现了以下管道,以允许数据存储集成开发人员快速轻松地构建复杂的处理规则。
LiteCene将所有查询文本视为一系列代码点。 CodePointStream是代码点的有序序列。 Litecene Core包含以下代码点过滤器:
SmartQuotesCodePointFilter将“智能报价”转换为“直率”代码点过滤器可以将一个代码映射到另一个代码,但不能添加或删除代码点。
Litecene使用令牌化将代码点转换为令牌。 TokenStream是一个有序的令牌序列。 Litecene Core包含以下令牌过滤器:
LetterNumberTokenFilter用空格代替所有非αMEATER角色。 Unicode类别字母和数字用于定义字母数字文本。LowercaseTokenFilter将所有文本转换为小写。NormalizeTokenFilter对文本执行Unicode NFKD归一化,并删除所有Unicode标记字符。PrintableAsciiTokenFilter用Whitespace替换0x20-0x7E中的所有字符。令牌过滤器可以对令牌文本进行任意更改,但不能添加或删除令牌。
Litecene允许使用QueryPipeline进行任意查询转换。 Litecene Core包含以下查询管道:
SimplifyQueryFilterPipeline重组查询以删除“无效”术语(例如,没有文本)并简化逻辑(例如,合并相邻和查询) Litecene的路线图始终在这里可用。如果您有反馈,请随时打开或评论问题!