- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想使用Elasticsearch搜索与用户提供的搜索词相关的文档(文档文本在荷兰语中,还假定用户搜索的单词也在荷兰语中)。
我还使用同义词为拼写不同但在荷兰语中表示同一意思的搜索词返回相同的文档。我将这些同义词存储在elasticsearch的config文件夹中的aliased.txt文件中。
为了测试搜索是否正常工作,我使用loopbaan
这个单词作为用户可能搜索内容的示例。此外,在onymous.txt文件中,我将此词与其同义词carriere
链接在一起。这是通过以下格式完成的:
...
loopbaan, carriere
...
loopbaan
时,如下所示:
GET /documents/_analyze
{
"analyzer": "test_analyzer",
"text": "loopbaan"
}
{
"tokens": [
{
"token": "loopban",
"start_offset": 0,
"end_offset": 8,
"type": "<ALPHANUM>",
"position": 0
},
{
"token": "carrier",
"start_offset": 0,
"end_offset": 8,
"type": "SYNONYM",
"position": 0
}
]
}
loopbaan
会转换为
loopban
,因为我使用的是荷兰词干,
但是
loopban
的确与荷兰语中的
loopbaan
含义相同,并且在我在文档中已建立索引的任何文本中都存在
NOT 。
loopbaan
时:
{
"query": {
"simple_query_string": {
"query": "loopbaan",
"fields": [
"content^1.0"
],
"analyzer": "test_analyzer",
"flags": -1,
"default_operator": "or",
"analyze_wildcard": false,
"auto_generate_synonyms_phrase_query": true,
"fuzzy_prefix_length": 0,
"fuzzy_max_expansions": 50,
"fuzzy_transpositions": true,
"boost": 1
}
}
}
{
"took": 1,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 0,
"relation": "eq"
},
"max_score": null,
"hits": []
}
}
stemmer-override
,但是我希望搜索尽可能通用,并且每次荷兰词干搜索器工作不佳时,都不要在词干替换中添加单词。我也想从loopbaan的复数形式(即
loopbanen
)返回与搜索loopbaan时完全相同的结果。这就是为什么我使用词干分析器。
PUT /documents
{
"aliases": {},
"mappings": {
"properties": {
"content": {
"type": "text"
},
"title": {
"type": "text"
}
}
},
"settings": {
"analysis": {
"filter": {
"test_synonyms": {
"type": "synonym",
"synonyms_path": "synonyms.txt",
"lenient": "true"
},
"dutch_stemmer": {
"type": "stemmer",
"language": "dutch"
},
"dutch_stopwords": {
"type": "stop",
"stopwords": "_dutch_"
},
"test_ascii_folding": {
"type": "asciifolding"
}
},
"analyzer": {
"test_analyzer": {
"filter": [
"lowercase",
"test_ascii_folding",
"dutch_stopwords",
"dutch_stemmer",
"test_synonyms"
],
"tokenizer": "standard"
}
}
}
}
}
loopbaan, carriere => loopbaan, carriere
schakelen, koppelen, toggelen => schakelen, koppelen, toggelen
loopbanen
和loopbaan
匹配,因为它们包含carriere
):
{
"title": "Hoezo is dit goed gedaan in het onderwijs?"
"content": "Werken is goed voor de mensen die in Nederlands wonen. Het verbetert de economie en de welzijn van de mensen. Carrière opbouwen is ook zeer belangrijk voor de specialisatie van de nederlandse mensen in onze samenleving."
},
{
"title": "Dit slaat toch nergens op dat mensen dit kunnen doen."
"content": "Mensen moeten koppelen. Wat nou "dit" is in deze context weet ik ook niet maar ja zo kan je zien dat elke woord zomaar iets kan betekenen toch? Zou zeggen van wel maar dit heeft niks te maken met iets dus de mazzel."
},
{
"title": "Werken moet door iedereen gedaan worden en niet alleen door paar mensen in nederland"
"content": "Werken moet door iedereen gedaan worden en niet alleen door paar mensen in nederland. Het moet echt zo zijn dat mensen carrieres opbouwen en niet alleen thuis zitten, want dat is slecht voor gezondheid van de mensen en de economie over het algemeen."
}
最佳答案
您正在使用一个分析器建立索引,使用另一个分析器进行搜索。推荐的做事方法可以在here中找到
有两种方法可以满足您的需求。
{
"mappings": {
"properties": {
"content": {
"type": "text",
"fields": {
"stemmed": {
"type": "text",
"analyzer": "test_analyzer"
}
}
},
"title": {
"type": "text"
}
}
}
}
{
"query": {
"simple_query_string": {
"query": "loopbaan",
"fields": [
"content^1.0",
"context.stemmed^1.0"
],
"analyzer": "test_analyzer",
"flags": -1,
"default_operator": "or",
"analyze_wildcard": false,
"auto_generate_synonyms_phrase_query": true,
"fuzzy_prefix_length": 0,
"fuzzy_max_expansions": 50,
"fuzzy_transpositions": true,
"boost": 1
}
}
}
Match MY_QUERY(analyzed with my custom analyzer)
OR
Match MY_QUERY(by using the same analyzer my field used when it was saved)
{
"query": {
"bool": {
"minimum_should_match": 1,
"should": [
{
"simple_query_string": {
"query": "loopbaan",
"fields": [
"content^1.0"
],
"analyzer": "test_analyzer",
"flags": -1,
"default_operator": "or",
"analyze_wildcard": false,
"auto_generate_synonyms_phrase_query": true,
"fuzzy_prefix_length": 0,
"fuzzy_max_expansions": 50,
"fuzzy_transpositions": true,
"boost": 1
}
},
{
"simple_query_string": {
"query": "loopbaan",
"fields": [
"content^1.0"
],
"flags": -1,
"default_operator": "or",
"analyze_wildcard": false,
"auto_generate_synonyms_phrase_query": true,
"fuzzy_prefix_length": 0,
"fuzzy_max_expansions": 50,
"fuzzy_transpositions": true,
"boost": 1
}
}
]
}
}
}
PUT documents
{
"aliases": {},
"mappings": {
"properties": {
"content": {
"type": "text",
"analyzer": "test_analyzer_without_stemmer"
},
"title": {
"type": "text"
}
}
},
"settings": {
"analysis": {
"filter": {
"test_synonyms": {
"type": "synonym",
"synonyms": [
"loopbaan,carriere,carrieres",
"schakelen,koppelen,toggelen"
],
"lenient": "true"
},
"dutch_stemmer": {
"type": "stemmer",
"language": "dutch"
},
"dutch_stopwords": {
"type": "stop",
"stopwords": "_dutch_"
},
"test_ascii_folding": {
"type": "asciifolding"
}
},
"analyzer": {
"test_analyzer": {
"filter": [
"lowercase",
"test_ascii_folding",
"dutch_stopwords",
"dutch_stemmer",
"test_synonyms"
],
"tokenizer": "standard"
},
"test_analyzer_without_stemmer": {
"filter": [
"lowercase",
"test_ascii_folding",
"dutch_stopwords",
"test_synonyms"
],
"tokenizer": "standard"
}
}
}
}
}
PUT documents/_doc/1
{
"title": "Hoezo is dit goed gedaan in het onderwijs?",
"content": "Werken is goed voor de mensen die in Nederlands wonen. Het verbetert de economie en de welzijn van de mensen. Carrière opbouwen is ook zeer belangrijk voor de specialisatie van de nederlandse mensen in onze samenleving."
}
PUT documents/_doc/2
{
"title": "Dit slaat toch nergens op dat mensen dit kunnen doen.",
"content": "Mensen moeten koppelen. Wat nou \"dit\" is in deze context weet ik ook niet maar ja zo kan je zien dat elke woord zomaar iets kan betekenen toch? Zou zeggen van wel maar dit heeft niks te maken met iets dus de mazzel."
}
PUT documents/_doc/3
{
"title": "Werken moet door iedereen gedaan worden en niet alleen door paar mensen in nederland",
"content": "Werken moet door iedereen gedaan worden en niet alleen door paar mensen in nederland. Het moet echt zo zijn dat mensen carrieres opbouwen en niet alleen thuis zitten, want dat is slecht voor gezondheid van de mensen en de economie over het algemeen."
}
GET documents/_search
{
"query": {
"bool": {
"minimum_should_match": 1,
"should": [
{
"simple_query_string": {
"query": "loopbaan",
"fields": [
"content"
],
"analyzer": "test_analyzer",
"flags": -1,
"default_operator": "or",
"analyze_wildcard": false,
"auto_generate_synonyms_phrase_query": true,
"fuzzy_prefix_length": 0,
"fuzzy_max_expansions": 50,
"fuzzy_transpositions": true,
"boost": 1
}
},
{
"simple_query_string": {
"query": "loopbaan",
"fields": [
"content^1.0"
],
"default_operator": "or",
"flags": -1,
"analyze_wildcard": false,
"auto_generate_synonyms_phrase_query": true,
"fuzzy_prefix_length": 0,
"fuzzy_max_expansions": 50,
"fuzzy_transpositions": true,
"boost": 1
}
}
]
}
}
}
关于database - 为什么Elasticsearch不返回包含几乎相等词的文档?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61736602/
我有以下案例要解决。 在短语中突出显示关键字的 Javascript 方法。 vm.highlightKeywords = (phrase, keywords) => { keywords =
我要匹配文本中的所有美元符号单词。例如,"Hello $VARONE this is $VARTWO"可以匹配$VARONE和$VARTWO。 正则表达式应该是/\$(\w+)/g,但是当我在Dart
在 redux 中,对于将状态作为参数、更改状态并返回新状态的特定操作,您会在 switch 语句中调用什么函数? function reducer(state = DEFAULT_STATE, ac
在 MySQL 5.1 中,我将一个字段命名为“Starting”。但是,每次我使用 SQL 查询时,它都会说无效的 SQL 语法。经过一些谷歌搜索,我发现 STARTING 是一个保留的 SQL 词
我必须使用函数 isIn(secretWord,lettersGuessed) 从列表中找到密码。在下面发布我的代码。 def isWordGuessed(secretWord, lettersGue
一段时间以来,我一直无法找到两个字符串中最长的常用词。首先我想到了用“isspace”函数来做这件事,但不知道如何找到一个常用词。然后我想到了“strcmp”,但到目前为止我只能比较两个字符串。我在想
我目前正在尝试制作一种“单词混合器”:对于两个给定的单词和指定的所需长度,程序应返回这两个单词的“混合”。然而,它可以是任何类型的混合:它可以是第一个单词的前半部分与第二个单词的后半部分相结合,它可以
如果 After 之后(逗号之前)没有 -ing 词,我想匹配它。所以 After 和逗号之间不应该有 -ing 词。 所需的匹配项(粗体): After sitting down, he began
我一直在试验 Stanford NLP 工具包及其词形还原功能。我很惊讶它如何使一些词词形还原。例如: depressing -> depressing depressed -> depressed
js 并尝试根据 [这里] 中的示例代码来做词云:https://github.com/jasondavies/d3-cloud .我想做的是单词的字体大小是基于数组中单词的频率。例如我有 [a,a,
我正在处理一个文本分类问题(在法语语料库上),并且正在试验不同的词嵌入。我对 ConceptNet 提供的内容非常感兴趣,所以我决定试一试。 我无法为我的特定任务找到专门的教程,所以我听取了他们的建议
当我在文本中搜索时,我输入 C-s,然后输入单词,然后一次又一次地输入 C-s,光标前进到找到的单词的下一个位置。问题是,一旦我转到下一个单词,我无法在按钮处编辑迷你缓冲区中的搜索单词,如果我按 Ba
我正在尝试按照以下结构运行这个 maven Hello Word: ├── pom.xml └── src └── Main.java 使用pom.xml设置: 4.0.0
所以,从我可以开始的.. 我正在使用 OCR。该脚本非常适合我的需要。它检测单词的准确性对我来说还可以。 这是结果:附加图像 100% 准确。 from PIL import Image import
Closed. This question does not meet Stack Overflow guidelines。它当前不接受答案。 想要改善这个问题吗?更新问题,以便将其作为on-topi
这是细节,但我想知道为什么会这样。 示例代码: Class klasa = Enum.class; for(Type t : klasa.getGenericInterfaces()) Syst
我在用: var header = ""+ "Export HTML to Word Document with JavaScript"; var footer = ""; /
我有一个程序可以像这样将数据打印到控制台(以空格分隔): variable1 value1 variable2 value2 variable3 value3 varialbe4 value4 编辑:
我有一个程序可以像这样将数据打印到控制台(以空格分隔): variable1 value1 variable2 value2 variable3 value3 varialbe4 value4 编辑:
最近我在查看与goliath相关的一些代码时,偶然在Ruby代码中看到了这个词use。 , 中间件等。看起来它不同于include/extend, and require. 有人可以解释为什么存在这个
我是一名优秀的程序员,十分优秀!