我有HTML文档,比方说:电子邮件.我想将这些存储在弹性搜索中并搜索HTML电子邮件的明文.
Elasticsearch也将索引所有HTML标记和属性.我不希望这样.我想搜索span它是否是纯文本,而不是html元素.例如,<span>span</span>可能是一个打击,但不是<span>some other content</span>.
您是否建议在文档中存储HTML剥离字段和HTML字段?或者我应该在S3上存储HTML文档,而是在弹性搜索中留下剥离的HTML版本?它甚至有意义吗?
老实说,如果弹性搜索正在索引HTML文档,我不知道会发生什么,但我可以想象它还将索引div和spans以及所有属性.这些是我完全不寻找的东西.所以:任何解决这个问题的建议都会很棒!
就在我将文档存储在ES中之前,我检查文档类型是否存在索引.如果没有,我创建一个具有给定映射的集合.映射看起来像这样
{
"analysis": {
"analyzer": {
"htmlStripAnalyzer": {
"type": "custom",
"tokenizer": "standard",
"filter": "standard",
"char_filter": [
"html_strip"
]
}
}
},
"mappings": {
"${type}": {
"dynamic_templates": [
{
"_metadata": {
"path_match": "_metadata.*",
"mapping": {
"type": "keyword"
}
}
}
],
"properties": {
"_tags": {
"type": "nested",
"dynamic": true
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
警告:忽略现有映射.这与我的意图无关.他们就在那里.
我要用文档类型替换$ {type} emails.
告诉ES不要将HTML内容编入索引是什么意思?
我试图在运行时将以下代码作为 IL 代码发出。
class TestObject {
public int Hello {get;set;}
public int Test {get;set;}
}
static TestObject test(BinaryReader reader) {
var a = new TestObject();
a.Hello = reader.ReadInt32();
a.Test = reader.ReadInt32();
return a;
}
Run Code Online (Sandbox Code Playgroud)
LINQPad 显示:
test:
IL_0000: nop
IL_0001: newobj UserQuery+TestObject..ctor
IL_0006: stloc.0 // a
IL_0007: ldloc.0 // a
IL_0008: ldarg.0
IL_0009: callvirt System.IO.BinaryReader.ReadInt32
IL_000E: callvirt UserQuery+TestObject.set_Hello
IL_0013: nop
IL_0014: ldloc.0 // a
IL_0015: ldarg.0
IL_0016: callvirt System.IO.BinaryReader.ReadInt32
IL_001B: callvirt UserQuery+TestObject.set_Test
IL_0020: nop
IL_0021: ldloc.0 // a
IL_0022: stloc.1 …Run Code Online (Sandbox Code Playgroud)