- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我写了一个 TokenFilter
在流中添加 token 。
1. 测试表明它有效,但我不完全明白为什么。
如果有人能阐明语义,我将不胜感激。特别是,在 (*)
,恢复状态,是不是意味着我们要么覆盖当前 token ,要么覆盖捕获状态之前创建的 token ?
这大致是我所做的
private final LinkedList<String> extraTokens = new LinkedList<String>();
private final CharTermAttribute termAtt = addAttribute(CharTermAttribute.class);
private State savedState;
@Override
public boolean incrementToken() throws IOException {
if (!extraTokens.isEmpty()) {
// Do we not loose/overwrite the current termAtt token here? (*)
restoreState(savedState);
termAtt.setEmpty().append(extraTokens.remove());
return true;
}
if (input.incrementToken()) {
if (/* condition */) {
extraTokens.add("fo");
savedState = captureState();
}
return true;
}
return false;
}
"a b c"
(a) -> (b) -> (c) -> ...
bb
是
b
的新同义词,当
restoreState
时,图将像这样构造使用?
(a)
/ \
(b) (bb)
\ /
(c)
|
...
foo bar baz
与
fo
是
foo
的词干和
qux
成为
bar baz
的同义词,我是否构建了正确的属性表?
+--------+---------------+-----------+--------------+-----------+
| Term | startOffset | endOffset | posIncrement | posLenght |
+--------+---------------+-----------+--------------+-----------+
| foo | 0 | 3 | 1 | 1 |
| fo | 0 | 3 | 0 | 1 |
| qux | 4 | 11 | 0 | 2 |
| bar | 4 | 7 | 1 | 1 |
| baz | 8 | 11 | 1 | 1 |
+--------+---------------+-----------+--------------+-----------+
最佳答案
1.
基于属性的 API 的工作原理是,每个 TokenStream
在您的分析器链中以某种方式修改了某些 Attribute
的状态每次拨打 incrementToken()
.然后链中的最后一个元素产生最终的 token 。
每当您的分析器链的客户端调用 incrementToken()
,最后TokenStream
会设置一些 Attribute
的状态s 代表下一个标记所需的任何东西。如无法办理,可调用incrementToken()
在其输入上,让前一个 TokenStream
做它的工作。这一直持续到最后 TokenStream
返回 false
,表示没有更多的 token 可用。
一个 captureState
复制所有状态 Attribute
电话号码 TokenStream
成State
, restoreState
覆盖每个 Attribute
的状态与之前捕获的任何内容(作为参数给出)。
您的 token 过滤器的工作方式是,它会调用 input.incrementToken()
,使之前的 TokenStream
将设置 Attribute
s' 状态到下一个 token 是什么。然后,如果您定义的条件成立(例如,termAtt 是“b”),它会将“bb”添加到堆栈中,将此状态保存在某处并返回 true,以便客户端可以使用 token 。在 incrementToken()
的下一次通话中,它不会使用 input.incrementToken()
.无论当前状态如何,它都代表之前已经消耗的 token 。然后过滤器恢复状态,这样一切都和之前完全一样,然后产生“bb”作为当前 token 并返回true,以便客户端可以消费 token 。只有在下一次调用时,它才会(再次)消耗来自前一个过滤器的下一个标记。
这实际上不会生成您显示的图形,而是插入 "bb"
之后 "b"
,所以它真的
(a) -> (b) -> (bb) -> (c)
"a b c"
和
"bb"
是
"b"
的同义词,您会期望短语查询
"b c"
上类,还有
"bb c"
.你必须告诉索引,“b”和“bb”都在同一个位置。 Lucene 为此使用位置增量,并且默认情况下,位置增量为 1,这意味着每个新标记(读取、调用
incrementToken()
)都在前一个位置之后出现 1 个位置。因此,对于最终位置,生产流是
(a:1) -> (b:2) -> (bb:3) -> (c:4)
(a:1) — -> (b:2) -> — (c:3)
\ /
-> (bb:2) ->
"bb"
的位置增量设置为 0。
private final PositionIncrementAttribute posIncAtt = addAttribute(PositionIncrementAttribute.class);
// later in incrementToken
restoreState(savedState);
posIncAtt.setPositionIncrement(0);
termAtt.setEmpty().append(extraTokens.remove());
restoreState
确保保留其他属性,如偏移量、 token 类型等,您只需更改用例所需的属性。
restoreState
,因此您有责任在正确的地方使用它。只要你不打电话
input.incrementToken()
,你不推进输入流,所以你可以对状态做任何你想做的事情。
positionIncrement
在前一个 token 之后的位置,您应该有
qux
增量为 1,因为它是
of
之后的下一个标记和
bar
应该有 0 的增量,因为它与
qux
的位置相同. table 宁愿看起来像
+--------+---------------+-----------+--------------+-----------+
| Term | startOffset | endOffset | posIncrement | posLenght |
+--------+---------------+-----------+--------------+-----------+
| fo | 0 | 3 | 1 | 1 |
| qux | 4 | 11 | 1 | 2 |
| bar | 4 | 7 | 0 | 1 |
| baz | 8 | 11 | 1 | 1 |
+--------+---------------+-----------+--------------+-----------+
关于java - 将 token 添加到 lucene token 流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17476674/
我正在开发一个应用程序,它使用 OAuth - 基于 token 的身份验证。 考虑到我们拥有访问和刷新 token ,这就是流程的样子。 Api call -> intercepter append
如何取消标记此代码的输出? 类(class)核心: def __init__(self, user_input): pos = pop(user_input) subject = ""
当我使用命令 kubectl 时与 --token标记并指定 token ,它仍然使用 kubeconfig 中的管理员凭据文件。 这是我做的: NAMESPACE="default" SERVICE
我正在制作 SPA,并决定使用 JWT 进行身份验证/授权,并且我已经阅读了一些关于 Tokens 与 Cookies 的博客。我了解 cookie 授权的工作原理,并了解基本 token 授权的工作
我正在尝试从应用服务获取 Google 的刷新 token ,但无法。 日志说 2016-11-04T00:04:25 PID[500] Verbose Received request: GET h
我正在开发一个项目,只是为了为 java 开发人员测试 eclipse IDE。我是java新手,所以我想知道为什么它不起作用,因为我已经知道该怎么做了。这是代码: public class ecli
我正在尝试使用 JwtSecurityTokenHandler 将 token 字符串转换为 jwt token 。但它出现错误说 IDX12709: CanReadToken() returned
我已阅读文档 Authentication (来自 Facebook 的官方)。我仍然不明白 Facebook 提供的这三种访问 token 之间的区别。网站上给出了一些例子,但我还是不太明白。 每个
我的部署服务器有时有这个问题,这让我抓狂,因为我无法在本地主机中重现,我已经尝试在我的 web.config 中添加机器 key ,但没有成功远。 它只发生在登录页面。 我的布局:
我已经设法获得了一个简单的示例代码,它可以创建一个不记名 token ,还可以通过阅读 stackoverflow 上的其他论坛来通过刷新 token 请求新的不记名 token 。 启动类是这样的
如果我有以前的刷新 token 和使用纯 php 的访问 token ,没有 Google Api 库,是否可以刷新 Google Api token ?我在数据库中存储了许多用户刷新和访问 toke
我通过 Java 应用程序使用 Google 电子表格时遇到了问题。我创建了应用程序,该应用程序运行了 1 年多,没有任何问题,我什至在 Create Spreadsheet using Google
当我有一个有效的刷新 token 时,我正在尝试使用 Keycloak admin REST API 重新创建访问 token 。 我已经通过调用 POST/auth/realms/{realm}/p
我正在尝试让第三方 Java 客户端与我编写的 WCF 服务进行通信。 收到消息时出现如下异常: Cannot find a token authenticator for the 'System.I
在尝试将数据插入到我的 SQl 数据库时,我收到以下错误 System.Data.SqlServerCe.SqlCeException: There was an error parsing the
使用数据库 session token 系统,我可以让用户使用用户名/密码登录,服务器可以生成 token (例如 uuid)并将其存储在数据库中并将该 token 返回给客户端。其上的每个请求都将包
我最近注册了 Microsoft Azure 并设置了认知服务帐户。使用 Text Translation API Documentation 中的说明我能够使用 interactive online
我使用 IAntiforgery API 创建了一个 ASP.Net Core 2 应用程序。 这提供了一种返回 cookie 的方法。 客户端获取该 cookie,并在后续 POST 请求中将该值放
我正在使用 spacy 来匹配某些文本(意大利语)中的特定表达式。我的文本可以多种形式出现,我正在尝试学习编写一般规则的最佳方式。我有如下 4 个案例,我想写一个适用于所有案例的通用模式。像这样的东西
我无法理解 oauth 2.0 token 的原则处理。 我的场景是,我有一个基于 web 的前端后端系统,带有 node.js 和 angular 2。用户应该能够在此站点上上传视频。然后创建一些额
我是一名优秀的程序员,十分优秀!