- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我提出了解决方案,以编程方式创建查询以使用此代码搜索带有通配符的短语:
public static Query createPhraseQuery(String[] phraseWords, String field) {
SpanQuery[] queryParts = new SpanQuery[phraseWords.length];
for (int i = 0; i < phraseWords.length; i++) {
WildcardQuery wildQuery = new WildcardQuery(new Term(field, phraseWords[i]));
queryParts[i] = new SpanMultiTermQueryWrapper<WildcardQuery>(wildQuery);
}
return new SpanNearQuery(queryParts, //words
0, //max distance
true //exact order
);
}
示例创建和调用 toString() 方法将输出:
String[] phraseWords = new String[]{"foo*", "b*r"};
Query phraseQuery = createPhraseQuery(phraseWords, "text");
System.out.println(phraseQuery.toString());
输出:
spanNear([SpanMultiTermQueryWrapper(text:foo*), SpanMultiTermQueryWrapper(text:b*r)], 0, true)
在大多数情况下效果很好,而且速度足够快。例如,如果我创建这样的查询并使用它进行搜索,它将输出所需的结果,例如:
Sentence with foo bar.
Foolies beer drinkers.
...
不是这样的:
Bar fooes.
Foo has bar.
我已经提到在大多数情况下查询工作得足够快。目前我有一个大小为 aprox 的索引。 200GB,平均搜索时间在 0.1 到 3 秒之间。取决于许多因素,例如:缓存、匹配短语中单个词的文档子集的大小,因为 lucene 将在已创建的术语之间执行集合交集。
例子:假设我想查询短语“an* karenjin*”(我将其拆分为 ["an*", "karenjin*"],然后使用 createPhraseQuery 方法创建查询)并且我希望它匹配包含以下内容的句子:"ana karenjina ", "ani karenjinoj", "ane karenjine", ...(克罗地亚语语法不同)。
这个查询非常慢,我没有等待足够长的时间来获得结果(超过 1 小时),有时会导致 GC overhead limit exceeded 异常。这种行为在某种程度上是意料之中的,因为“an*”本身匹配大量文档。我知道我可以在 30-40 秒内查询“an? karanjin*”,给出结果(更快但仍然很慢)。
这就是我困惑的地方。如果我只查询“karenjin*”,它会在 1 秒内给出结果。因此,我尝试使用 WildcardQuery 和 QueryWrapperFilter 查询“an* karenjin*”并使用过滤器“karenjin*”。而且它仍然是 Not Acceptable 慢(我在它返回任何东西之前杀死了进程)。
文档说 Filter 减少了 Query 的搜索空间。所以我尝试使用过滤器:
Filter filter = new QueryWrapperFilter(new WildcardQuery(new Term("text", "karanjin*")));
并查询:
Query query = createPhraseQuery(new String[]{"an*", "karenjin*"}, "text");
比搜索,(经过几次热身查询):
Sort sort = new Sort(new SortField("insertTime", SortField.Type.STRING, true));
TopDocs docs = searcher.search(query, filter, 100, sort);
好的,我的问题是什么?
怎么来查询:
Query query = new WildcardQuery(new Term("text", "karanjin*"));
速度很快,但是使用上面描述的Filter还是很慢?
最佳答案
是的,通配符可能会影响性能,尤其是当它们匹配很多术语时,但您所描述的情况确实令人惊讶。很难确定为什么会发生这种情况,但可以尝试一下。
我假设:
Query query = new WildcardQuery(new Term("text", "an*"));
如上所述,就其本身而言,其表现非常糟糕。由于您要查找的通配符都是前缀样式查询,因此最好改用 PrefixQuery
。
Query query = new PrefixQuery(new Term("text", "an"));
虽然我不认为这会产生很大的不同,如果有的话。可能有所不同的是改变你的重写方法。您可以尝试限制查询重写成的 Terms
的数量:
Query query = new PrefixQuery(new Term("text", "an"));
//or
//Query query = new WildcardQuery(new Term("text", "an*"));
query.setRewriteMethod(new MultiTermQuery.RewriteMethod.TopTermsRewrite(10));
关于带通配符的 Lucene 短语查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26101351/
我们正在使用一个脚本,它会返回以下内容120007CONSULTA DE DEUDA CORRECTA.01TEST我正在尝试从awk中获得 CONSULTA DE DEUDA CORRECTA 的短
我正在使用以下查询: { "_source": [ "title", "bench", "id_", "court",
例如,我有数十亿个短语,我想要将相似的短语聚集在一起。 > strings.to.cluster <- c("Best Toyota dealer in bay area. Drive out wit
我有一个包含大约 1000 个关键字/短语(一到四个字长)的数据库表 - 这个表很少更改,所以我可以将数据提取到更有用的东西中(比如正则表达式?) - 所以这没有找到/基于自然语言处理猜测关键词..
我想确保我从一开始就做对了,但我找不到好的答案,所以我想问一下。 我要做的是以下内容。 以一句话为例:The quick brown fox jumped over the lazy dog"并使用全
我有一个表单,其中有两个单选按钮。 应该从字符串中搜索整个字符串,第二个应该搜索至少一个单词。 例如: 我将搜索“Awesome ideas for startup”。 如果我选中“搜索整个字符串/短
我有... 一组固定关键字和词组(大约 1,000,000 个),例如 birthday、happy new year、vacation等 10 到 500 字之间的一些可变文本。 我想…… 识别文本
有没有办法删除字符串中重复的和连续的单词/短语?例如。 [in]: foo foo bar bar foo bar [out]: foo bar foo bar 我试过这个: >>> s = 'thi
我正在寻找一种在文本中搜索短语或惯用表达的方法,无论时态或可能的介词/副词如何,例如如果我正在寻找 call off我还想找到 My boss called the meeting off. 之类的用
PowerShell 有一些语法特性,我找不到太多相关文档。今天我的问题是 ? {...} 例子 PS> Get-SPServiceInstance | ? {$_.GetType.toString(
我通过 PHP 使用 Solr 来搜索我网站的各个方面。我正在尝试实现一项功能,但找不到任何有关如何实现它的信息。 我有一组文档(评论),每个文档都与特定产品有关。 我想找到出现在单个产品的多条评论中
我正在从事自然语言生成任务,需要检索与 Cyc 术语等效的自然语言单词或短语。例如。 “#$EatingEvent”->“吃”或“#$Coyote-Animal”->“土狼”。 如何通过 Java A
我在使用 Java 中的以下正则表达式时遇到问题。我删除了双引号,以使其更具可读性。由于缺乏更好的词,我还将每个“组件”放在单独的行上(但实际的表达式会将行合并,行之间没有空格): (?:\bIN(?
我有一个 MySQL 数据库,我正在尝试使用 PHP 获取趋势主题(流行短语或单词)。我尝试了一些查询,但似乎没有什么对我有用。 最佳答案 您可以尝试创建一个包含两列的新表:WORD 和 COUNT,
我在 MySql 中有一个包含城市的表。 |---------------------|------------------| | ID | City
我正在处理搜索页面上的用户输入。如果用户选择“所有单词”类型的搜索,那么我会从搜索文本中删除所有 bool 搜索运算符,并在每个真实单词之间添加 ' AND '。在大多数情况下非常简单。但是,我不知道
我使用的语音识别软件给出的结果不是最佳的。 例如:session 返回为 fashion 或 mission。 现在我有一本像这样的字典: matches = { 'session': ['fas
我厌倦了使用 Gimp 无休止地滚动所有字体来不规律地搜索完美字体,所以我想:“为什么不为每种字体构建一个可视的 pangrams 列表”。 因此,我尝试构建一个 php 脚本,该脚本在 .fonts
如何编写一个 RegEx 模式来测试一个字符串是否包含多个具有以下结构的子字符串: "cake.xxx" xxx 是任何东西,但不是“奶酪”、“牛奶”或“黄油”。 例如: “我有一个 cake.hon
我有一个字段“部门”,它是一个列表:{“部门”:[“餐饮服务”,“软件开发”,“制造”,“部署”]}' 我想聚合“部门”中以“d”开头的元素。即,从所有记录进行部署。 我能够找到包含一个前缀为“d”但
我是一名优秀的程序员,十分优秀!