Merge pull request #893 from omnivore-app/add-highlights-to-search-results

add highlights to search results
This commit is contained in:
Hongbo Wu
2022-06-28 14:01:32 +08:00
committed by GitHub
8 changed files with 44 additions and 13 deletions

View File

@ -25,7 +25,8 @@ export const addHighlightToPage = async (
ctx._source.highlights = [params.highlight]
} else {
ctx._source.highlights.add(params.highlight)
}`,
}
ctx._source.updatedAt = params.highlight.updatedAt`,
lang: 'painless',
params: {
highlight: highlight,
@ -102,11 +103,12 @@ export const deleteHighlight = async (
index: INDEX_ALIAS,
body: {
script: {
source:
'ctx._source.highlights.removeIf(h -> h.id == params.highlightId)',
source: `ctx._source.highlights.removeIf(h -> h.id == params.highlightId);
ctx._source.updatedAt = params.updatedAt`,
lang: 'painless',
params: {
highlightId: highlightId,
updatedAt: new Date(),
},
},
query: {
@ -257,7 +259,8 @@ export const updateHighlight = async (
body: {
script: {
source: `ctx._source.highlights.removeIf(h -> h.id == params.highlight.id);
ctx._source.highlights.add(params.highlight)`,
ctx._source.highlights.add(params.highlight);
ctx._source.updatedAt = params.highlight.updatedAt`,
lang: 'painless',
params: {
highlight: highlight,

View File

@ -15,13 +15,16 @@ export const addLabelInPage = async (
body: {
script: {
source: `if (ctx._source.labels == null) {
ctx._source.labels = [params.label]
ctx._source.labels = [params.label];
ctx._source.updatedAt = params.updatedAt
} else if (!ctx._source.labels.any(label -> label.name == params.label.name)) {
ctx._source.labels.add(params.label)
ctx._source.labels.add(params.label) ;
ctx._source.updatedAt = params.updatedAt
} else { ctx.op = 'none' }`,
lang: 'painless',
params: {
label: label,
updatedAt: new Date(),
},
},
},
@ -99,20 +102,22 @@ export const deleteLabel = async (
ctx: PageContext
): Promise<boolean> => {
try {
console.log('deleting label', label)
const { body } = await client.updateByQuery({
index: INDEX_ALIAS,
body: {
script: {
source: `if (ctx._source.highlights != null && ctx._source.highlights[0].labels != null) {
ctx._source.highlights[0].labels.removeIf(label -> label.name == params.label)
ctx._source.highlights[0].labels.removeIf(label -> label.name == params.label);
ctx._source.updatedAt = params.updatedAt
}
if (ctx._source.labels != null) {
ctx._source.labels.removeIf(label -> label.name == params.label)
ctx._source.labels.removeIf(label -> label.name == params.label);
ctx._source.updatedAt = params.updatedAt
}`,
lang: 'painless',
params: {
label: label,
updatedAt: new Date(),
},
},
query: {
@ -178,15 +183,18 @@ export const updateLabel = async (
script: {
source: `if (ctx._source.labels != null) {
ctx._source.labels.removeIf(l -> l.id == params.label.id);
ctx._source.labels.add(params.label)
ctx._source.labels.add(params.label);
ctx._source.updatedAt = params.updatedAt
}
if (ctx._source.highlights != null) {
ctx._source.highlights[0].labels.removeIf(l -> l.id == params.label.id);
ctx._source.highlights[0].labels.add(params.label)
ctx._source.highlights[0].labels.add(params.label);
ctx._source.updatedAt = params.updatedAt
}`,
lang: 'painless',
params: {
label: label,
updatedAt: new Date(),
},
},
query: {
@ -252,10 +260,12 @@ export const setLabelsForHighlight = async (
index: INDEX_ALIAS,
body: {
script: {
source: `ctx._source.highlights[0].labels = params.labels`,
source: `ctx._source.highlights[0].labels = params.labels;
ctx._source.updatedAt = params.updatedAt`,
lang: 'painless',
params: {
labels: labels,
updatedAt: new Date(),
},
},
query: {

View File

@ -403,7 +403,7 @@ export const searchPages = async (
from,
size,
_source: {
excludes: ['originalHtml', 'content', 'highlights'],
excludes: ['originalHtml', 'content'],
},
}

View File

@ -232,6 +232,8 @@ export interface SearchItem {
readAt?: Date
savedAt: Date
updatedAt?: Date
labels?: Label[]
highlights?: Highlight[]
}
const keys = ['_id', 'url', 'slug', 'userId', 'uploadFileId', 'state'] as const

View File

@ -1512,6 +1512,7 @@ export type SearchItem = {
contentReader: ContentReader;
createdAt: Scalars['Date'];
description?: Maybe<Scalars['String']>;
highlights?: Maybe<Array<Highlight>>;
id: Scalars['ID'];
image?: Maybe<Scalars['String']>;
isArchived: Scalars['Boolean'];
@ -3841,6 +3842,7 @@ export type SearchItemResolvers<ContextType = ResolverContext, ParentType extend
contentReader?: Resolver<ResolversTypes['ContentReader'], ParentType, ContextType>;
createdAt?: Resolver<ResolversTypes['Date'], ParentType, ContextType>;
description?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;
highlights?: Resolver<Maybe<Array<ResolversTypes['Highlight']>>, ParentType, ContextType>;
id?: Resolver<ResolversTypes['ID'], ParentType, ContextType>;
image?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;
isArchived?: Resolver<ResolversTypes['Boolean'], ParentType, ContextType>;

View File

@ -1070,6 +1070,7 @@ type SearchItem {
contentReader: ContentReader!
createdAt: Date!
description: String
highlights: [Highlight!]
id: ID!
image: String
isArchived: Boolean!

View File

@ -1499,6 +1499,7 @@ const schema = gql`
language: String
readAt: Date
savedAt: Date!
highlights: [Highlight!]
}
type SearchItemEdge {

View File

@ -180,6 +180,9 @@ const searchQuery = (keyword = '') => {
url
createdAt
updatedAt
highlights {
id
}
}
}
pageInfo {
@ -1021,6 +1024,15 @@ describe('Article API', () => {
expect(res.body.data.search.edges[3].node.id).to.eq(pages[1].id)
expect(res.body.data.search.edges[4].node.id).to.eq(pages[0].id)
})
it('should return highlights in pages', async () => {
const res = await graphqlRequest(query, authToken).expect(200)
expect(res.body.data.search.edges[0].node.highlights.length).to.eql(1)
expect(res.body.data.search.edges[0].node.highlights[0].id).to.eq(
highlights[4].id
)
})
})
context('when type:highlights is in the query', () => {