
该Elasticsearch插件可以以概率晶格结构的形式进行搜索。这些晶格是按自动语音识别(ASR)或语音到文本(STT),光学特征识别(OCR),机器翻译(MT),自动图像字幕等等形式输出的形式。无论是分析的,都可以将晶格视为下面的有限状态机器(FST)的一部分(一个可能的均设置)(在某些情况下)(均可置入均可构建的一个设置)(均可将其视为一个均可构建的一组)(文档(例如,在下面的第一个位置,可能的输出为“和a”)。在STT的情况下,位置将是时间范围,在OCR的情况下,位置可以是XY坐标,或者可能是阅读订单位置。每个可能的输出在该位置都有相关的发生概率,从而使相关评分受晶格输出质量的影响。
该插件由三个组件组成:
一个处理晶格令牌流的lattice类型的令牌过滤器。流中的令牌表示令牌位置,允许流像上面的晶格结构一样。流中的令牌还具有一个分数,该分数在索引时存储在令牌有效载荷中,因此可以用来影响评分。
令牌过滤器以两种格式之一接受令牌。使用lattice_format参数设置的格式,可以将其设置为lattice或audio 。
lattice_format=lattice令牌应该以形式
<token:string>|<position:int>|<rank:int>|<score:float>
示例流: the|0|0|0.9 , quick|1|0|0.6 brick|1|1|0.2 fox|2|0|0.5 | 0 | 0 | 0 | box|2|1|0.09 , jumped|3|0|1.0

在上面的示例中,令牌quick和brick将在同一位置处为索引,因为它们都设置为1。
token实际字符串令牌要搜索并通过后续过滤器处理position是代币在源文档中的全局位置(用于确定令牌是否应与以前的令牌同一位置位置)rank令牌的等级相对于该位置处的其他可能令牌(0是最可能的等级)score 。这个立场在此位置的可能性。请注意,如果您的分数为零,则令牌不会返回是搜索,并且可能会从流中省略。 lattice_format=audio代币通过添加start_time和stop_time具有从lattice格式的所有字段。
令牌应该以形式
<token:string>|<position:int>|<rank:int>|<score:float>|<start_time:float>|<stop_time:float>
Example stream: the|0|0|0.9|0.15|0.25 , quick|1|0|0.6|0.25|0.5 , brick|1|1|0.2|0.25|0.5 , fox|2|0|0.5|1.0|1.3 , box|2|1|0.09|1.0|1.3 , jumped|3|0|1.0|2.0|2.5

在audio_position_increment_seconds的示例中,令牌quick和brick将在同一位置处为索引,因为它们都将位置设置为1。目前,该过滤器仅看起来是象征性的开始时间
如果audio_position_increment_seconds=0.01在上面的示例中the则将以15的位置索引; quick和brick将在25个位置索引; ETC。
start_time相对于源音频的开头,该令牌的开始时间秒stop_time相对于源音频的开头,此令牌的开始时间参数包括:
lattice_format (默认为晶格)audio或latticeaudio_position_increment_secondsscore_buckets (默认不重复)[0.9, 10, 0.8, 8, 0.7, 7, 0.2, 1]的值,得分> = 0.9的令牌将重复10次;分数> = 0.8的令牌将重复8次,等等。audio_position_increment_seconds (默认为0.01)lattice=format=audio这是在索引中编码音频时间的精度floor(token_start_time / audio_position_increment_seconds)类型lattice字段包含LatticeTokenFilter的参数,可在搜索时间参考。函数完全像文本字段。
如果使用lattice_format=audio则需要使用lattice字段类型进行Matchlatticequeries与时间正确工作。
注意:这仅是因为目前似乎没有一种方法可以从查询时间从分析仪那里获取必要的信息(或任何)信息。我认为在AnalysisRegistry中,可能会在AnalysisProvider中添加一个类似于分析的getChainAware() SynonymGraphTokenFilterFactory.getChainAwareTokenFilterFactory()类似的方法。 (有关更多详细信息,请参阅此类顶部的评论)
参数包括:
lattice_format必须匹配该字段上设置的LatticeTokenFilter的配置。audio_position_increment_seconds必须匹配该字段上LatticeTokenFilter的配置。 type match_lattice的查询查询使用lattice令牌过滤器配置的lattice字段。
执行包裹在LatticePayloadScoreQuery(PayloadScoreQuery的扩展)中的Spannearquery,该QuaryQuery(PayloadScoreQuery的扩展)使用每个令牌有效载荷中编码的分数来得分匹配匹配跨度。每个跨度的分数合并以给出文档分数(有关详细信息,请参见payload_function参数)。如果设置了include_span_score ,则以上分数将乘以配置的相似性分数。
参数包括:
sloplattice_format=audio时使用的slop_seconds 。最多几秒钟允许比赛跨度。in_order是否必须按顺序出现令牌(对于lattice_format=audio应该是true )include_span_score如果为true则配置的相似性分数将乘以有效载荷分数(如上所述)payload_function sum , max或min之一(默认为sum )sum总和匹配跨度的得分max从所有匹配跨度中选择最大分数min从所有匹配跨度中选择最小分数payload_length_norm_factor a float定义匹配跨度的长度应标准化跨度分数。一个值的值意味着分数除以跨度的长度(请在lucene术语中以跨度的宽度为单位)。值为0表示没有长度归一化。 使用payload_function使用match_lattice查询payload_function=sum计算文档分数(principtal)为

同样, payload_function=min

和payload_function=max

为了开发,您可以使用下面的Docker映像,这些图像仅取自官方的Elasticsearch图像并安装此插件。您可以阅读此信息,以获取有关如何使用Elasticsearch图像的说明。
docker pull messiaen/full-lattice-search:2.0.0-7.3.0
docker-compose.yaml示例:
version : " 2 "
services :
kibana :
image : docker.elastic.co/kibana/kibana:7.3.0
ports :
- 5601:5601
environment :
ELASTICSEARCH_HOSTS : http://es01:9200
es01 :
image : messiaen/full-lattice-search:2.0.0-7.3.0
environment :
- node.name=es01
- discovery.type=single-node
- " ES_JAVA_OPTS=-Xms1024m -Xmx1024m "
ulimits :
memlock :
soft : -1
hard : -1
volumes :
- esdata01:/usr/share/elasticsearch/data
ports :
- 9200:9200
volumes :
esdata01 :
driver : local只需将上面的yaml复制到名为docker-compose.yaml的文件中,然后从该目录运行docker-compose up
假设您在浏览器中使用docker-compose.yaml导航到localhost:5601 ,然后将以下示例粘贴到Kibana的Dev Tools Console中。
PUT audio_lattices
{
"settings": {
"index": {
"number_of_shards": 1,
"number_of_replicas": 0
},
"analysis": {
"analyzer": {
"lattice_analyzer": {
"type": "custom",
"tokenizer": "whitespace",
"filter": ["lattice_filter", "lowercase"]
}
},
"filter": {
"lattice_filter": {
"type": "lattice",
"lattice_format": "audio",
"audio_position_increment_seconds": 0.1
}
}
}
},
"mappings": {
"dynamic": "strict",
"properties": {
"lattices": {
"type": "lattice",
"lattice_format": "audio",
"audio_position_increment_seconds": 0.1,
"analyzer": "lattice_analyzer"
}
}
}
}
POST audio_lattices/_doc/1
{
"lattices": """the|0|0|0.9|0.15|0.25
quick|1|0|0.6|0.25|0.5 brick|1|1|0.2|0.25|0.5
fox|2|0|0.5|1.0|1.3 box|2|1|0.09|1.0|1.3
jumped|3|0|1.0|2.0|2.5"""
}
GET audio_lattices/_search
{
"query": {
"match_lattice": {
"lattices": {
"query": "quick box jumped",
"slop_seconds": 2,
"include_span_score": "true",
"payload_function": "sum",
"in_order": "true"
}
}
}
}
在控制台中查看
搜索响应
{
"took" : 1,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 1,
"relation" : "eq"
},
"max_score" : 36.987705,
"hits" : [
{
"_index" : "audio_lattices",
"_type" : "_doc",
"_id" : "1",
"_score" : 36.987705,
"_source" : {
"lattices" : """
the|0|0|0.9|0.15|0.25
quick|1|0|0.6|0.25|0.5 brick|1|1|0.2|0.25|0.5
fox|2|0|0.5|1.0|1.3 box|2|1|0.09|1.0|1.3
jumped|3|0|1.0|2.0|2.5
"""
}
}
]
}
}
PUT text_lattices
{
"settings": {
"index": {
"number_of_shards": 1,
"number_of_replicas": 0
},
"analysis": {
"analyzer": {
"lattice_analyzer": {
"type": "custom",
"tokenizer": "whitespace",
"filter": ["lattice_filter", "lowercase"]
}
},
"filter": {
"lattice_filter": {
"type": "lattice",
"lattice_format": "lattice"
}
}
}
},
"mappings": {
"dynamic": "strict",
"properties": {
"lattices": {
"type": "lattice",
"lattice_format": "lattice",
"analyzer": "lattice_analyzer"
}
}
}
}
POST text_lattices/_doc/1
{
"lattices": """the|0|0|0.9
quick|1|0|0.6 brick|1|1|0.2
fox|2|0|0.5 box|2|1|0.09
jumped|3|0|1.0"""
}
GET text_lattices/_search
{
"query": {
"match_lattice": {
"lattices": {
"query": "quick jumped",
"slop": 1,
"include_span_score": "true",
"payload_function": "sum",
"in_order": "true"
}
}
}
}
在控制台中查看
搜索响应
{
"took" : 0,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 1,
"relation" : "eq"
},
"max_score" : 9041.438,
"hits" : [
{
"_index" : "text_lattices",
"_type" : "_doc",
"_id" : "1",
"_score" : 9041.438,
"_source" : {
"lattices" : """
the|0|0|0.9
quick|1|0|0.6 brick|1|1|0.2
fox|2|0|0.5 box|2|1|0.09
jumped|3|0|1.0
"""
}
}
]
}
}
只需在根目录中运行make
如果您只想在不运行测试的情况下构建插件,则可以运行
./gradlew clean assemble
无论哪种情况,内置的插件都将是build/distributions/full-lattice-search-*.zip
make run将构建插件并站起来一个Elasticsearch(安装了插件)和带有Docker-Compose的Kibana
需要Elasticsearch 7.3.0(支持其他版本(> = 6.0.0)即将到来 /应要求)

该插件的目的不是与广义晶格结构一起使用,而是使用称为混乱网络或香肠字符串的压缩形式。混淆网络代表具有固定位置(时间范围,图像位置等)的广义晶格。
每个位置都有一组可能的单词,每个单词都有相关的发生的可能性。
例如,自动语音识别器可以在下面产生晶格
“每个视频都应在10分钟以下”

上面的晶格可以压缩到下面的混淆网络中。

请注意,已插入<epsilon>令牌(意味着缺少一个单词),以允许“理解”一词比其他单词更长。
还值得注意的是,将晶格压缩到混淆网络中的过程通常是有损的,这意味着通过混乱网络的某些路径不存在于源晶格中。例如, “理解十分钟”一词存在于混乱网络中,但不在晶格中。
请注意,您有责任确保将晶格结构格式化为混乱网络。
有关使用详细信息,请参见LatticeTokenFilter文档。
如LatticeTokenFilter文档中所述, score_buckets参数可用于在相同位置进行索引重复令牌,以提高这些令牌相对于那里得分的术语频率。尽管这确实具有理想的影响,但很少考虑。
8x线性重复( score_buckets=[0.9, 72, 0.8, 64, 0.7, 56, 0.6, 48, 0.5, 40, 0.4, 32, 0.2, 16, 0.1, 8, 0.01, 2] )在与较少的配置中更差。8x重复配置的索引过程中,在1中删除了1倍的分析流中的分析流中,导致了5x速度的分析流中,以删除了8倍重复配置的索引。