basic search query api
This commit is contained in:
parent
d413b49e24
commit
28b86af898
|
@ -274,6 +274,64 @@ export default {
|
||||||
},
|
},
|
||||||
comments: async (parent, { id, sort }, { models }) => {
|
comments: async (parent, { id, sort }, { models }) => {
|
||||||
return comments(models, id, sort)
|
return comments(models, id, sort)
|
||||||
|
},
|
||||||
|
search: async (parent, { query, cursor }, { models, search }) => {
|
||||||
|
const decodedCursor = decodeCursor(cursor)
|
||||||
|
|
||||||
|
const sitems = await search.search({
|
||||||
|
index: 'item',
|
||||||
|
size: LIMIT,
|
||||||
|
from: decodedCursor.offset,
|
||||||
|
body: {
|
||||||
|
query: {
|
||||||
|
bool: {
|
||||||
|
must: {
|
||||||
|
bool: {
|
||||||
|
should: [
|
||||||
|
{
|
||||||
|
// all terms are matched in fields
|
||||||
|
multi_match: {
|
||||||
|
query,
|
||||||
|
type: 'most_fields',
|
||||||
|
fields: ['title^20', 'text'],
|
||||||
|
fuzziness: 'AUTO',
|
||||||
|
prefix_length: 3,
|
||||||
|
minimum_should_match: '100%',
|
||||||
|
boost: 2
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
// only some terms must match
|
||||||
|
multi_match: {
|
||||||
|
query,
|
||||||
|
type: 'most_fields',
|
||||||
|
fields: ['title^20', 'text'],
|
||||||
|
fuzziness: 'AUTO',
|
||||||
|
minimum_should_match: '60%'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// TODO: add wildcard matches for
|
||||||
|
// user.name and url
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
filter: {
|
||||||
|
range: {
|
||||||
|
createdAt: {
|
||||||
|
lte: decodedCursor.time
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
const items = sitems.body.hits.hits.map(e => e._source)
|
||||||
|
return {
|
||||||
|
cursor: items.length === LIMIT ? nextCursorEncoded(decodedCursor) : null,
|
||||||
|
items
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
import es from '@elastic/elasticsearch'
|
import es from '@opensearch-project/opensearch'
|
||||||
|
|
||||||
global.es ||= new es.Client()
|
global.es ||= new es.Client({ node: 'http://localhost:9200' })
|
||||||
|
|
||||||
export default global.es
|
export default global.es
|
||||||
|
|
|
@ -7,6 +7,7 @@ import typeDefs from './typeDefs'
|
||||||
import models from './models'
|
import models from './models'
|
||||||
import { print } from 'graphql'
|
import { print } from 'graphql'
|
||||||
import lnd from './lnd'
|
import lnd from './lnd'
|
||||||
|
import search from './search'
|
||||||
import { ME } from '../fragments/users'
|
import { ME } from '../fragments/users'
|
||||||
import { getPrice } from '../components/price'
|
import { getPrice } from '../components/price'
|
||||||
|
|
||||||
|
@ -22,7 +23,8 @@ export default async function getSSRApolloClient (req, me = null) {
|
||||||
context: {
|
context: {
|
||||||
models,
|
models,
|
||||||
me: session ? session.user : me,
|
me: session ? session.user : me,
|
||||||
lnd
|
lnd,
|
||||||
|
search
|
||||||
}
|
}
|
||||||
}),
|
}),
|
||||||
cache: new InMemoryCache()
|
cache: new InMemoryCache()
|
||||||
|
|
|
@ -9,6 +9,7 @@ export default gql`
|
||||||
pageTitle(url: String!): String
|
pageTitle(url: String!): String
|
||||||
dupes(url: String!): [Item!]
|
dupes(url: String!): [Item!]
|
||||||
allItems(cursor: String): Items
|
allItems(cursor: String): Items
|
||||||
|
search(query: String, cursor: String): Items
|
||||||
}
|
}
|
||||||
|
|
||||||
type ItemActResult {
|
type ItemActResult {
|
||||||
|
|
|
@ -4,6 +4,7 @@ import models from '../../api/models'
|
||||||
import lnd from '../../api/lnd'
|
import lnd from '../../api/lnd'
|
||||||
import typeDefs from '../../api/typeDefs'
|
import typeDefs from '../../api/typeDefs'
|
||||||
import { getSession } from 'next-auth/client'
|
import { getSession } from 'next-auth/client'
|
||||||
|
import search from '../../api/search'
|
||||||
|
|
||||||
global.apolloServer ||= new ApolloServer({
|
global.apolloServer ||= new ApolloServer({
|
||||||
typeDefs,
|
typeDefs,
|
||||||
|
@ -14,7 +15,8 @@ global.apolloServer ||= new ApolloServer({
|
||||||
return {
|
return {
|
||||||
models,
|
models,
|
||||||
lnd,
|
lnd,
|
||||||
me: session ? session.user : null
|
me: session ? session.user : null,
|
||||||
|
search
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
Loading…
Reference in New Issue