正则表达式片段获得突出显示

时间:2012-10-12 15:01:36

标签: regex solr highlight

我想要特定格式的solr高亮显示。

以下是我需要提供突出显示功能的字符串格式

130s: LISTEN! LISTEN! 138s: [THUMP] 143s: WHAT IS THAT? 144s: HEAR THAT?
152s: EVERYBODY, SHH. SHH. 156s: STAY UP THERE. 163s: [BOAT CREAKING] 165s:
WHAT IS THAT? 167s: [SCREAMING] 191s: COME ON! 192s: OH, GOD! 193s: AAH!
249s: OK. WE'VE HAD SOME PROBLEMS 253s: AT THE FACILITY. 253s: WHAT WE'RE
ATTEMPTING TO ACHIEVE 256s: HERE HAS NEVER BEEN DONE. 256s: WE'RE THIS CLOSE
259s: TO THE REACTIVATION 259s: OF A HUMAN BRAIN CELL. 260s: DOCTOR, THE 200
MILLION 264s: I'VE SUNK INTO THIS COMPANY 264s: IS DUE IN GREAT PART 266s:
TO YOUR RESEARCH.

用户搜索后我想以下面的格式提供用户片段

Previous Line of Highlight + Line containing Highlight + Next Line of
Highlight

有关。例如。用户搜索术语听到,然后搜索一个典型的高亮片段 应该像下面

<str>143s: WHAT IS THAT? 144s: <em>HEAR</em> THAT? 152s: EVERYBODY, SHH.
SHH.</str>

以上是我的最终计划,但是现在我正试图将片段作为, 以ns开头:其中n是0到9999之间的数字

我使用hl.regex.slop = 0.6而我的hl.fragsize = 120及以下是正则表达式 这一点。

\b(?=\s*\d{1,4}s:){50,200} 

使用上面的正则表达式,我的片段始终不以ns:

开头

请在此建议我,我如何实现最终计划

由于

1 个答案:

答案 0 :(得分:1)

您可以通过将每个ns处正在搜索的文本临时拆分为行来大大简化您的方法(需要更简单的正则表达式)。

实施例

130秒:听!听着!
138s:[THUMP]
143s:那是什么?
144s:听说了吗? 152s:每个人,SHH。 SHH。

然后进行正则表达式搜索,这变得更简单:

(^\d{1,4})(s: .*?)(SEARCHPATTERN)(.*)

然后抓住前一行和下一行(在这种情况下,SEARCHPATTERN是HEAR)。为了更快地找到前一行和后一行(无需回溯和向前搜索),您可以填充一个散列图,其中所有\ d {1,4}行的开头键入其行号。

带行号的hashmap(我的符号只是概念性的)

“130”=&gt; 1
“138”=&gt; 2
“143”=&gt; 3
“144”=&gt; 4
“152”=&gt; 5

你的正则表达式告诉你搜索词是以144开头的行(正则表达式中的组1),你的hashmap告诉你的是第4行,所以你知道你必须得到第3行和第5行正则表达式匹配的组。

结果= <str>line3 + \1 + \2 + <em>\3</em>\4 + line5</str>

注意:我不是solr用户,所以我的正则表达式语法和示例结果字符串应该作为一般的想法。我不知道solr是否有自己的符号。