我正在使用 ElasticSearch 6.2.3 开发自动完成器。我希望使用以下优先级对查询结果(带有“名称”字段的页面列表)进行排序:
我将使用由三个查询组成的 Bool/Should 查询(对应于上面的三个优先级),并使用 boost 来定义相对重要性。
我遇到的问题是前缀查询 - 尽管我的搜索分析器具有小写过滤器,但它似乎没有小写搜索查询。例如,以下查询为“harry”返回“Harry Potter”,但为“Harry”返回零结果:
{ "query": { "prefix": { "Name.raw" : "Harry" } } }
Run Code Online (Sandbox Code Playgroud)
我已经使用_analyzeAPI 验证了我的两个分析器确实将文本“Harry”小写为“harry”。我哪里错了?
从 ES 文档中,我了解到我需要以两种不同的方式分析名称字段,以启用前缀和术语查询:
我已经检查了诸如此之类的重复问题,但答案没有帮助
我的映射和设置如下
ES索引映射
{
"myIndex": {
"mappings": {
"pages": {
"properties": {
"Id": {},
"Name": {
"type": "text",
"fields": {
"raw": {
"type": "text",
"analyzer": "keywordAnalyzer",
"search_analyzer": …Run Code Online (Sandbox Code Playgroud) 我正在尝试构建一个F#控制台应用程序,它调用库来解决数学/编程问题的集合.
我的方法涉及构建一个求解器函数的大型映射(特别是a Map<int, (unit -> int)>).
然后应用程序只需要一个整数id并调用相应的解算器来显示解决方案(解决方案必须运行代码+运行一个计时器,因此不能只存储一个字符串).
我的初始设置如下所示.但是我知道随着我添加更多解决方案,这将很快变得混乱 - 在100个解决方案之后,我将拥有1,000条线路(并且看起来很难将它们一次添加到Map一行).
我正在考虑的一种方法是为每个问题创建一个.fs文件,并调用模块,例如Problem001.然后我会在Map构建函数中有~100行(例如Map.Add(1, Problem001.solver)).
我的问题是:上述想法是最好的方法(如果是这样,是否有更简洁的方法将所有不同的模块组合到一个Map中?)
如果没有,最好的方法是什么?
类库:Library.fs
namespace Library
module Problems =
let Titles =
Map.empty
.Add(1, "Title1") // etc
let Descriptions =
Map.empty
.Add(1, "Desc1") // etc
module Solutions =
let solution1 () =
// logic & solution annotation, unique to each problem
printfn "Solution annotation/text"
ans // return integer answer
let solution2 () = // etc
printfn "blah"
ans
let solvers =
Map.empty
.Add(1, solution1) …Run Code Online (Sandbox Code Playgroud)